15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-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 utility functions
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include <string.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "stdio.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gki.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "l2cdefs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_int.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gatt_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "gattdefs.h"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "sdp_api.h"
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #include "btm_int.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* check if [x, y] and [a, b] have overlapping range */
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #define GATT_VALIDATE_HANDLE_RANGE(x, y, a, b)   (y >= a && x <= b)
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #define GATT_GET_NEXT_VALID_HANDLE(x)    (((x)/10 + 1) * 10)
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char * const op_code_name[] =
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "UNKNOWN",
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_ERROR",
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_MTU",
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_MTU",
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_READ_INFO",
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_READ_INFO",
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_FIND_TYPE_VALUE",
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_FIND_TYPE_VALUE",
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_READ_BY_TYPE",
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_READ_BY_TYPE",
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_READ",
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_READ",
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_READ_BLOB",
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_READ_BLOB",
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "GATT_REQ_READ_MULTI",
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "GATT_RSP_READ_MULTI",
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "GATT_REQ_READ_BY_GRP_TYPE",
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "GATT_RSP_READ_BY_GRP_TYPE",
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_WRITE",
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_WRITE",
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_CMD_WRITE",
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_SIGN_CMD_WRITE",
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_PREPARE_WRITE",
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_PREPARE_WRITE",
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_REQ_EXEC_WRITE",
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_RSP_EXEC_WRITE",
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Reserved",
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_HANDLE_VALUE_NOTIF",
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "Reserved",
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_HANDLE_VALUE_IND",
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_HANDLE_VALUE_CONF",
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    "ATT_OP_CODE_MAX"
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const UINT8  base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_free_pending_ind
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description    Free all pending indications
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       None
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_pending_ind(tGATT_TCB *p_tcb)
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
94b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_free_pending_ind");
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* release all queued indications */
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_tcb->pending_ind_q.p_first)
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (GKI_dequeue (&p_tcb->pending_ind_q));
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         gatt_free_pending_enc_queue
103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description       Free all buffers in pending encyption queue
105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns       None
107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gatt_free_pending_enc_queue(tGATT_TCB *p_tcb)
110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
111b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_free_pending_enc_queue");
112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* release all queued indications */
113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    while (p_tcb->pending_enc_clcb.p_first)
114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        GKI_freebuf (GKI_dequeue (&p_tcb->pending_enc_clcb));
115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_delete_dev_from_srv_chg_clt_list
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description    Delete a device from the service changed client lit
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       None
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_delete_dev_from_srv_chg_clt_list(BD_ADDR bd_addr)
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG     *p_buf;
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG_REQ  req;
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
131b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_delete_dev_from_srv_chg_clt_list");
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = gatt_is_bda_in_the_srv_chg_clt_list(bd_addr)) != NULL)
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.cb_info.p_srv_chg_callback)
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* delete from NV */
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(req.srv_chg.bda, bd_addr, BD_ADDR_LEN);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_REMOVE_CLIENT,&req, NULL);
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf (GKI_remove_from_queue (&gatt_cb.srv_chg_clt_q, p_buf));
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_set_srv_chg
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set the service changed flag to TRUE
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns        None
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_srv_chg(void)
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG_REQ req;
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
159b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_set_srv_chg");
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_buf)
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
162b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("found a srv_chg clt");
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_buf->srv_changed)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
165b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("set srv_changed to TRUE");
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf->srv_changed= TRUE;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(&req.srv_chg, p_buf, sizeof(tGATTS_SRV_CHG));
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (gatt_cb.cb_info.p_srv_chg_callback)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*gatt_cb.cb_info.p_srv_chg_callback)(GATTS_SRV_CHG_CMD_UPDATE_CLIENT,&req, NULL);
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf);
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_is_new_srv_chg
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Find the app id in on the new service changed list
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns     Pointer to the found new service changed item othwerwise NULL
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_PENDING_NEW_SRV_START *gatt_sr_is_new_srv_chg(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst)
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_HNDL_RANGE *p;
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_PENDING_NEW_SRV_START *p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getfirst(&gatt_cb.pending_new_srv_start_q);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_buf != NULL)
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = p_buf->p_new_srv_start;
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (  gatt_uuid_compare (*p_app_uuid128, p->app_uuid128)
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              &&  gatt_uuid_compare (*p_svc_uuid, p->svc_uuid)
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              &&  (svc_inst == p->svc_inst) )
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
196b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("gatt_sr_is_new_srv_chg: Yes");
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getnext(p_buf);
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_add_pending_ind
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Add a pending indication
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the current pending indication buffer, NULL no buffer available
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_VALUE *gatt_add_pending_ind(tGATT_TCB  *p_tcb, tGATT_VALUE *p_ind)
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE   *p_buf;
218b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_add_pending_ind");
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tGATT_VALUE *)GKI_getbuf((UINT16)sizeof(tGATT_VALUE))) != NULL)
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
221b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("enqueue a pending indication");
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_buf, p_ind, sizeof(tGATT_VALUE));
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&p_tcb->pending_ind_q, p_buf);
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_add_pending_new_srv_start
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Add a pending new srv start to the new service start queue
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the new service start buffer, NULL no buffer available
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_PENDING_NEW_SRV_START *gatt_add_pending_new_srv_start(tGATTS_HNDL_RANGE *p_new_srv_start)
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_PENDING_NEW_SRV_START   *p_buf;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
242b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tGATTS_PENDING_NEW_SRV_START *)GKI_getbuf((UINT16)sizeof(tGATTS_PENDING_NEW_SRV_START))) != NULL)
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
245b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("enqueue a new pending new srv start");
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->p_new_srv_start = p_new_srv_start;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&gatt_cb.pending_new_srv_start_q, p_buf);
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_add_srv_chg_clt
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Add a service chnage client to the service change client queue
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the service change client buffer; Null no buffer available
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_SRV_CHG *gatt_add_srv_chg_clt(tGATTS_SRV_CHG *p_srv_chg)
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG *p_buf;
265b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_add_srv_chg_clt");
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = (tGATTS_SRV_CHG *)GKI_getbuf((UINT16)sizeof(tGATTS_SRV_CHG))) != NULL)
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
268b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("enqueue a srv chg client");
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_buf, p_srv_chg, sizeof(tGATTS_SRV_CHG));
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_enqueue (&gatt_cb.srv_chg_clt_q, p_buf);
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_alloc_hdl_buffer
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Allocate a handle buufer
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the allocated buffer, NULL no buffer available
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_alloc_hdl_buffer(void)
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CB    *p_cb = &gatt_cb;
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM * p_elem= &p_cb->hdl_list[0];
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_SR_PROFILES; i++, p_elem ++)
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_cb->hdl_list[i].in_use)
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_elem, 0, sizeof(tGATT_HDL_LIST_ELEM));
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_elem->in_use = TRUE;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p_elem;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_find_hdl_buffer_by_handle
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Find handle range buffer by service handle.
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the buffer, NULL no buffer available
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_handle(UINT16 handle)
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info;
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM      *p_list = NULL;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list = p_list_info->p_first;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_list != NULL)
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_list->in_use && p_list->asgn_range.s_handle == handle)
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_list);
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list = p_list->p_next;
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function     gatt_find_hdl_buffer_by_app_id
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Find handle range buffer by app ID, service and service instance ID.
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns    Pointer to the buffer, NULL no buffer available
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_HDL_LIST_ELEM *gatt_find_hdl_buffer_by_app_id (tBT_UUID *p_app_uuid128,
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     tBT_UUID *p_svc_uuid,
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                     UINT16 svc_inst)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_INFO *p_list_info= &gatt_cb.hdl_list_info;
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM      *p_list = NULL;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list = p_list_info->p_first;
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_list != NULL)
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( gatt_uuid_compare (*p_app_uuid128, p_list->asgn_range.app_uuid128)
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  gatt_uuid_compare (*p_svc_uuid,    p_list->asgn_range.svc_uuid)
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             &&  (svc_inst == p_list->asgn_range.svc_inst) )
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
355b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("Already allocated handles for this service before!!");
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_list);
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list = p_list->p_next;
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_free_hdl_buffer
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     free a handle buffer
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       None
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_hdl_buffer(tGATT_HDL_LIST_ELEM *p)
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p)
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p->svc_db.svc_buffer.p_first)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf (GKI_dequeue (&p->svc_db.svc_buffer));
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p, 0, sizeof(tGATT_HDL_LIST_ELEM));
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         gatt_free_srvc_db_buffer_app_id
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      free the service attribute database buffers by the owner of the
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  service app ID.
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       None
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_free_srvc_db_buffer_app_id(tBT_UUID *p_app_id)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM *p_elem =  &gatt_cb.hdl_list[0];
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_SR_PROFILES; i ++, p_elem ++)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (memcmp(p_app_id, &p_elem->asgn_range.app_uuid128, sizeof(tBT_UUID)) == 0)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while (p_elem->svc_db.svc_buffer.p_first)
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_freebuf (GKI_dequeue (&p_elem->svc_db.svc_buffer));
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_elem->svc_db.mem_free = 0;
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_elem->svc_db.p_attr_list = p_elem->svc_db.p_free_mem = NULL;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_last_attribute
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Check this is the last attribute of the specified value or not
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       TRUE - yes this is the last attribute
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_last_attribute(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_start, tBT_UUID value)
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SRV_LIST_ELEM *p_srv= p_start->p_next;
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              is_last_attribute = TRUE;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SR_REG        *p_rcb = NULL;
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID            *p_svc_uuid;
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->p_last_primary = NULL;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_srv)
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_rcb = GATT_GET_SR_REG_PTR(p_srv->i_sreg);
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_svc_uuid = gatts_get_service_uuid (p_rcb->p_db);
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_uuid_compare(value, *p_svc_uuid))
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_last_attribute = FALSE;
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srv = p_srv->p_next;
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return is_last_attribute;
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_update_last_pri_srv_info
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Update the the last primary info for the service list info
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns       None
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_update_last_pri_srv_info(tGATT_SRV_LIST_INFO *p_list)
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SRV_LIST_ELEM *p_srv= p_list->p_first;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->p_last_primary = NULL;
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_srv)
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_srv->is_primary)
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_list->p_last_primary = p_srv;
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srv = p_srv->p_next;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatts_update_srv_list_elem
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      update an element in the service list.
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatts_update_srv_list_elem(UINT8 i_sreg, UINT16 handle, BOOLEAN is_primary)
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(handle);
4825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.srv_list[i_sreg].in_use         = TRUE;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.srv_list[i_sreg].i_sreg    = i_sreg;
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.srv_list[i_sreg].s_hdl          = gatt_cb.sr_reg[i_sreg].s_hdl;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.srv_list[i_sreg].is_primary     = is_primary;
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function  gatt_add_a_srv_to_list
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  add an service to the list in ascending
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              order of the start handle
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns   BOOLEAN TRUE-if add is successful
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_add_a_srv_to_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_new)
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SRV_LIST_ELEM *p_old;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_new)
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
506b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("p_new==NULL");
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_list->p_first)
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is an empty list */
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_first =
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_last  = p_new;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new->p_next   =
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new->p_prev   = NULL;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_old = p_list->p_first;
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (1)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_old == NULL)
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_list->p_last->p_next      = p_new;
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_new->p_prev               = p_list->p_last;
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_new->p_next               = NULL;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_list->p_last              = p_new;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_new->s_hdl <  p_old->s_hdl)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* if not the first in list */
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_old->p_prev != NULL)
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_old->p_prev->p_next   = p_new;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    else
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_list->p_first = p_new;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_new->p_prev           = p_old->p_prev;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_new->p_next           = p_old;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_old->p_prev           = p_new;
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_old = p_old->p_next;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->count++;
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_update_last_pri_srv_info(p_list);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function  gatt_remove_a_srv_from_list
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Remove a service from the list
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns   BOOLEAN TRUE-if remove is successful
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_a_srv_from_list(tGATT_SRV_LIST_INFO *p_list, tGATT_SRV_LIST_ELEM *p_remove)
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_remove || !p_list->p_first)
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
570b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remove->p_prev == NULL)
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_first             = p_remove->p_next;
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_remove->p_next)
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_remove->p_next->p_prev    = NULL;
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_remove->p_next == NULL)
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_last              = p_remove->p_prev;
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_prev->p_next    = NULL;
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_next->p_prev = p_remove->p_prev;
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_prev->p_next = p_remove->p_next;
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->count--;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_update_last_pri_srv_info(p_list);
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function  gatt_add_an_item_to_list
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  add an service handle range to the list in decending
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**              order of the start handle
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns   BOOLEAN TRUE-if add is successful
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_add_an_item_to_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_new)
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_HDL_LIST_ELEM *p_old;
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_new)
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
611b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("p_new==NULL");
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_list->p_first)
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* this is an empty list */
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_first =
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_last  = p_new;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new->p_next   =
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_new->p_prev   = NULL;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_old = p_list->p_first;
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (1)
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_old == NULL)
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_list->p_last->p_next      = p_new;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_new->p_prev               = p_list->p_last;
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_new->p_next               = NULL;
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_list->p_last              = p_new;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_new->asgn_range.s_handle >  p_old->asgn_range.s_handle)
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_old == p_list->p_first)
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_list->p_first = p_new;
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_new->p_prev    = p_old->p_prev;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_new->p_next    = p_old;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_old->p_prev    = p_new;
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_old = p_old->p_next;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->count++;
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function  gatt_remove_an_item_from_list
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description  Remove an service handle range from the list
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns   BOOLEAN TRUE-if remove is successful
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_an_item_from_list(tGATT_HDL_LIST_INFO *p_list, tGATT_HDL_LIST_ELEM *p_remove)
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_remove || !p_list->p_first)
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
674b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG("p_remove==NULL || p_list->p_first==NULL");
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remove->p_prev == NULL)
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_first             = p_remove->p_next;
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_remove->p_next)
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_remove->p_next->p_prev    = NULL;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_remove->p_next == NULL)
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_list->p_last              = p_remove->p_prev;
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_prev->p_next    = NULL;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_next->p_prev = p_remove->p_prev;
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_remove->p_prev->p_next = p_remove->p_next;
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_list->count--;
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_the_connected_bda
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function find the connected bda
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           TRUE if found
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7088fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaBOOLEAN gatt_find_the_connected_bda(UINT8 start_idx, BD_ADDR bda, UINT8 *p_found_idx,
7098fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                                    tBT_TRANSPORT *p_transport)
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN found = FALSE;
713b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_find_the_connected_bda start_idx=%d",start_idx);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = start_idx ; i < GATT_MAX_PHY_CHANNEL; i ++)
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7176975b4d711142b885af479721cada448952c6b41Andre Eisenbach        if (gatt_cb.tcb[i].in_use && gatt_cb.tcb[i].ch_state == GATT_CH_OPEN)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy( bda, gatt_cb.tcb[i].peer_bda, BD_ADDR_LEN);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_found_idx = i;
7218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            *p_transport = gatt_cb.tcb[i].transport;
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            found = TRUE;
723b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG("gatt_find_the_connected_bda bda :%02x-%02x-%02x-%02x-%02x-%02x",
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
728b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_find_the_connected_bda found=%d found_idx=%d", found, i);
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return found;
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_srv_chg_ind_pending
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Check whether a service chnaged is in the indication pending queue
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  or waiting for an Ack already
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         BOOLEAN
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_srv_chg_ind_pending (tGATT_TCB *p_tcb)
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_VALUE *p_buf = (tGATT_VALUE *)GKI_getfirst(&p_tcb->pending_ind_q);
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN srv_chg_ind_pending = FALSE;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
749b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_is_srv_chg_ind_pending is_queue_empty=%d", GKI_queue_is_empty(&p_tcb->pending_ind_q) );
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb->indicate_handle == gatt_cb.handle_of_h_r)
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        srv_chg_ind_pending = TRUE;
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while (p_buf)
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_buf->handle == gatt_cb.handle_of_h_r)
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                srv_chg_ind_pending = TRUE;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_buf = (tGATT_VALUE *)GKI_getnext(p_buf);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
768b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("srv_chg_ind_pending = %d", srv_chg_ind_pending);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return srv_chg_ind_pending;
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_bda_in_the_srv_chg_clt_list
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function check the specified bda is in the srv chg clinet list or not
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         pointer to the found elemenet otherwise NULL
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATTS_SRV_CHG *gatt_is_bda_in_the_srv_chg_clt_list (BD_ADDR bda)
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATTS_SRV_CHG *p_buf = (tGATTS_SRV_CHG *)GKI_getfirst(&gatt_cb.srv_chg_clt_q);
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
786b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_is_bda_in_the_srv_chg_clt_list :%02x-%02x-%02x-%02x-%02x-%02x",
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      bda[0],  bda[1], bda[2],  bda[3], bda[4],  bda[5]);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (p_buf != NULL)
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!memcmp( bda, p_buf->bda, BD_ADDR_LEN))
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
793b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG("bda is in the srv chg clt list");
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf = (tGATTS_SRV_CHG *)GKI_getnext(p_buf);
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_buf;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_bda_connected
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_bda_connected(BD_ADDR bda)
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i = 0;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN connected=FALSE;
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( i=0; i < GATT_MAX_PHY_CHANNEL; i ++)
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.tcb[i].in_use &&
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            !memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN))
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            connected = TRUE;
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return connected;
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_i_tcb_by_addr
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for an empty tcb entry, and return the index.
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaUINT8 gatt_find_i_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UINT8 i = 0;
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; i < GATT_MAX_PHY_CHANNEL; i ++)
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8448fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        if (!memcmp(gatt_cb.tcb[i].peer_bda, bda, BD_ADDR_LEN) &&
8458fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            gatt_cb.tcb[i].transport == transport)
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            return i;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    return GATT_INDEX_INVALID;
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_get_tcb_by_idx
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function get TCB using the TCB index
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           NULL if not found. Otherwise index to the tcb.
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_TCB * gatt_get_tcb_by_idx(UINT8 tcb_idx)
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB   *p_tcb = NULL;
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( (tcb_idx < GATT_MAX_PHY_CHANNEL) && gatt_cb.tcb[tcb_idx].in_use)
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb = &gatt_cb.tcb[tcb_idx];
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tcb;
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_tcb_by_addr
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for an empty tcb entry, and return pointer.
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           NULL if not found. Otherwise index to the tcb.
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatGATT_TCB * gatt_find_tcb_by_addr(BD_ADDR bda, tBT_TRANSPORT transport)
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB   *p_tcb = NULL;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i = 0;
8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if ((i = gatt_find_i_tcb_by_addr(bda, transport)) != GATT_INDEX_INVALID)
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb = &gatt_cb.tcb[i];
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tcb;
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_i_tcb_free
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for an empty tcb entry, and return the index.
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_find_i_tcb_free(void)
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i = 0, j = GATT_INDEX_INVALID;
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_PHY_CHANNEL; i ++)
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_cb.tcb[i].in_use)
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            j = i;
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return j;
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_allocate_tcb_by_bdaddr
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function locate or allocate new tcb entry for matching bda.
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           GATT_INDEX_INVALID if not found. Otherwise index to the tcb.
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9248fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattatGATT_TCB * gatt_allocate_tcb_by_bdaddr(BD_ADDR bda, tBT_TRANSPORT transport)
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i = 0;
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN allocated = FALSE;
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB    *p_tcb = NULL;
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* search for existing tcb with matching bda    */
9318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    i = gatt_find_i_tcb_by_addr(bda, transport);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* find free tcb */
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i == GATT_INDEX_INVALID)
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        i = gatt_find_i_tcb_free();
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        allocated = TRUE;
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (i != GATT_INDEX_INVALID)
9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb = &gatt_cb.tcb[i];
9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (allocated)
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_tcb, 0, sizeof(tGATT_TCB));
945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            GKI_init_q (&p_tcb->pending_enc_clcb);
946ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            GKI_init_q (&p_tcb->pending_ind_q);
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->in_use = TRUE;
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->tcb_idx = i;
9498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            p_tcb->transport = transport;
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_tcb->peer_bda, bda, BD_ADDR_LEN);
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tcb;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_convert_uuid16_to_uuid128
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Convert a 16 bits UUID to be an standard 128 bits one.
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if two uuid match; FALSE otherwise.
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_convert_uuid16_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT16 uuid_16)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = &uuid_128[LEN_UUID_128 - 4];
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (uuid_128, base_uuid, LEN_UUID_128);
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16_TO_STREAM(p, uuid_16);
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Function         gatt_convert_uuid32_to_uuid128
9778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
9788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Description      Convert a 32 bits UUID to be an standard 128 bits one.
9798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
9808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta** Returns          TRUE if two uuid match; FALSE otherwise.
9818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
9828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta*******************************************************************************/
9838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_convert_uuid32_to_uuid128(UINT8 uuid_128[LEN_UUID_128], UINT32 uuid_32)
9848fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta{
9858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UINT8   *p = &uuid_128[LEN_UUID_128 - 4];
9868fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    memcpy (uuid_128, base_uuid, LEN_UUID_128);
9888fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
9898fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    UINT32_TO_STREAM(p, uuid_32);
9908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta}
9918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta/*******************************************************************************
9928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta**
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_uuid_compare
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Compare two UUID to see if they are the same.
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if two uuid match; FALSE otherwise.
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_uuid_compare (tBT_UUID src, tBT_UUID tar)
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  su[LEN_UUID_128], tu[LEN_UUID_128];
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  *ps, *pt;
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* any of the UUID is unspecified */
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (src.len == 0 || tar.len == 0)
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If both are 16-bit, we can do a simple compare */
10128fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (src.len == LEN_UUID_16 && tar.len == LEN_UUID_16)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return src.uu.uuid16 == tar.uu.uuid16;
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10178fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    /* If both are 32-bit, we can do a simple compare */
10188fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (src.len == LEN_UUID_32 && tar.len == LEN_UUID_32)
10198fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
10208fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        return src.uu.uuid32 == tar.uu.uuid32;
10218fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
10228fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* One or both of the UUIDs is 128-bit */
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (src.len == LEN_UUID_16)
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* convert a 16 bits UUID to 128 bits value */
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_convert_uuid16_to_uuid128(su, src.uu.uuid16);
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ps = su;
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10308fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    else if (src.len == LEN_UUID_32)
10318fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
10328fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        gatt_convert_uuid32_to_uuid128(su, src.uu.uuid32);
10338fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        ps = su;
10348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ps = src.uu.uuid128;
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (tar.len == LEN_UUID_16)
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* convert a 16 bits UUID to 128 bits value */
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_convert_uuid16_to_uuid128(tu, tar.uu.uuid16);
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pt = tu;
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10448fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    else if (tar.len == LEN_UUID_32)
10458fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
10468fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        /* convert a 32 bits UUID to 128 bits value */
10478fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        gatt_convert_uuid32_to_uuid128(tu, tar.uu.uuid32);
10488fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        pt = tu;
10498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pt = tar.uu.uuid128;
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(memcmp(ps, pt, LEN_UUID_128) == 0);
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_build_uuid_to_stream
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Add UUID into stream.
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          UUID length.
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_build_uuid_to_stream(UINT8 **p_dst, tBT_UUID uuid)
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = *p_dst;
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   len = 0;
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uuid.len == LEN_UUID_16)
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UINT16_TO_STREAM (p, uuid.uu.uuid16);
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = LEN_UUID_16;
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10758fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    else if (uuid.len == LEN_UUID_32) /* always convert 32 bits into 128 bits as alwats */
10768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
10778fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        gatt_convert_uuid32_to_uuid128(p, uuid.uu.uuid32);
10788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        p += LEN_UUID_128;
10798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        len = LEN_UUID_128;
10808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (uuid.len == LEN_UUID_128)
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ARRAY_TO_STREAM (p, uuid.uu.uuid128, LEN_UUID_128);
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len = LEN_UUID_128;
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_dst = p;
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return len;
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_parse_uuid_from_cmd
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Convert a 128 bits UUID into a 16 bits UUID.
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if command sent, otherwise FALSE.
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_parse_uuid_from_cmd(tBT_UUID *p_uuid_rec, UINT16 uuid_size, UINT8 **p_data)
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_base_uuid, ret = TRUE;
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  xx;
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_uuid = *p_data;
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_uuid_rec, 0, sizeof(tBT_UUID));
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (uuid_size)
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case LEN_UUID_16:
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_uuid_rec->len = uuid_size;
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (p_uuid_rec->uu.uuid16, p_uuid);
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_data += LEN_UUID_16;
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case LEN_UUID_128:
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* See if we can compress his UUID down to 16 or 32bit UUIDs */
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_base_uuid = TRUE;
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (xx = 0; xx < LEN_UUID_128 - 4; xx++)
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_uuid[xx] != base_uuid[xx])
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    is_base_uuid = FALSE;
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (is_base_uuid)
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0))
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_uuid += (LEN_UUID_128 - 4);
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_uuid_rec->len = LEN_UUID_16;
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    STREAM_TO_UINT16(p_uuid_rec->uu.uuid16, p_uuid);
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
11368fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                {
11378fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                    p_uuid += (LEN_UUID_128 - LEN_UUID_32);
11388fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                    p_uuid_rec->len = LEN_UUID_32;
11398fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                    STREAM_TO_UINT32(p_uuid_rec->uu.uuid32, p_uuid);
11408fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                }
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!is_base_uuid)
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_uuid_rec->len = LEN_UUID_128;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy(p_uuid_rec->uu.uuid128, p_uuid, LEN_UUID_128);
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_data += LEN_UUID_128;
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        /* do not allow 32 bits UUID in ATT PDU now */
11518fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        case LEN_UUID_32:
1152b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("DO NOT ALLOW 32 BITS UUID IN ATT PDU");
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 0:
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (uuid_size != 0) ret = FALSE;
1156b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_WARNING("gatt_parse_uuid_from_cmd invalid uuid size");
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return( ret);
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_start_rsp_timer
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start a wait_for_response timer.
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if command sent, otherwise FALSE.
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11725fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xuvoid gatt_start_rsp_timer(UINT16 clcb_idx)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11745fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    tGATT_CLCB *p_clcb = &gatt_cb.clcb[clcb_idx];
11755fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    UINT32 timeout = GATT_WAIT_FOR_RSP_TOUT;
11765fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    p_clcb->rsp_timer_ent.param  = (TIMER_PARAM_TYPE)p_clcb;
11775fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
11785fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        p_clcb->op_subtype == GATT_DISC_SRVC_ALL)
11795fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    {
11805fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        timeout = GATT_WAIT_FOR_DISC_RSP_TOUT;
11815fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    }
11825fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    btu_start_timer (&p_clcb->rsp_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_RSP,
11835fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu                     timeout);
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_start_conf_timer
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Start a wait_for_confirmation timer.
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if command sent, otherwise FALSE.
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_start_conf_timer(tGATT_TCB    *p_tcb)
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tcb->conf_timer_ent.param  = (TIMER_PARAM_TYPE)p_tcb;
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (&p_tcb->conf_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_RSP,
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     GATT_WAIT_FOR_RSP_TOUT);
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_start_ind_ack_timer
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      start the application ack timer
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_start_ind_ack_timer(tGATT_TCB *p_tcb)
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tcb->ind_ack_timer_ent.param  = (TIMER_PARAM_TYPE)p_tcb;
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start notification cache timer */
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (&p_tcb->ind_ack_timer_ent, BTU_TTYPE_ATT_WAIT_FOR_IND_ACK,
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     GATT_WAIT_FOR_RSP_TOUT);
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_rsp_timeout
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when GATT wait for ATT command response timer expires
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_rsp_timeout(TIMER_LIST_ENT *p_tle)
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12285fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    tGATT_CLCB *p_clcb = (tGATT_CLCB *)p_tle->param;
12295fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    if (p_clcb == NULL || p_clcb->p_tcb == NULL)
12305fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    {
1231b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_WARNING("gatt_rsp_timeout clcb is already deleted");
12325fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        return;
12335fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    }
12345fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY &&
12355fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        p_clcb->op_subtype == GATT_DISC_SRVC_ALL &&
12365fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        p_clcb->retry_count < GATT_REQ_RETRY_LIMIT)
12375fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    {
12385fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        UINT8 rsp_code;
1239b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_WARNING("gatt_rsp_timeout retry discovery primary service");
12405fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        if (p_clcb != gatt_cmd_dequeue(p_clcb->p_tcb, &rsp_code))
12415fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        {
1242b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("gatt_rsp_timeout command queue out of sync, disconnect");
12435fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        }
12445fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        else
12455fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        {
12465fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu            p_clcb->retry_count++;
12475fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu            gatt_act_discovery(p_clcb);
12485fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu            return;
12495fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu        }
12505fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    }
12515fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu
1252b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_WARNING("gatt_rsp_timeout disconnecting...");
12538fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    gatt_disconnect (p_clcb->p_tcb);
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_ind_ack_timeout
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when GATT wait for ATT handle confirmation timeout
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_ind_ack_timeout(TIMER_LIST_ENT *p_tle)
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB * p_tcb = (tGATT_TCB *)p_tle->param;
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1269b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_WARNING("gatt_ind_ack_timeout send ack now");
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb != NULL)
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->ind_count = 0;
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    attp_send_cl_msg(((tGATT_TCB *)p_tle->param), 0, GATT_HANDLE_VALUE_CONF, NULL);
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_find_i_rcb_by_handle
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for a service that owns a specific handle.
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          GATT_MAX_SR_PROFILES if not found. Otherwise index of th eservice.
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_find_i_rcb_by_handle(UINT16 handle)
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  i_rcb = 0;
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for ( ; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++)
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.sr_reg[i_rcb].in_use &&
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_cb.sr_reg[i_rcb].s_hdl <= handle &&
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_cb.sr_reg[i_rcb].e_hdl >= handle )
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return i_rcb;
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_find_i_rcb_by_handle
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for a service that owns a specific handle.
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 if not found. Otherwise index of th eservice.
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_find_i_rcb_by_app_id(tBT_UUID *p_app_uuid128, tBT_UUID *p_svc_uuid, UINT16 svc_inst)
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           i_rcb = 0;
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SR_REG    *p_sreg;
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBT_UUID        *p_this_uuid;
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i_rcb = 0, p_sreg = gatt_cb.sr_reg; i_rcb < GATT_MAX_SR_PROFILES; i_rcb++, p_sreg++)
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( p_sreg->in_use )
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_this_uuid = gatts_get_service_uuid (p_sreg->p_db);
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_this_uuid &&
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_uuid_compare (*p_app_uuid128, p_sreg->app_uuid ) &&
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_uuid_compare (*p_svc_uuid, *p_this_uuid) &&
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (svc_inst == p_sreg->service_instance))
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1327b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_ERROR ("Active Service Found ");
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_dbg_display_uuid(*p_svc_uuid);
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return i_rcb;
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_find_i_rcb_by_handle
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for a service that owns a specific handle.
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 if not found. Otherwise index of th eservice.
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_sr_alloc_rcb(tGATT_HDL_LIST_ELEM *p_list )
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ii = 0;
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_SR_REG    *p_sreg = NULL;
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*this is a new application servoce start */
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (ii = 0, p_sreg = gatt_cb.sr_reg; ii < GATT_MAX_SR_PROFILES; ii++, p_sreg++)
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_sreg->in_use)
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_sreg, 0, sizeof(tGATT_SR_REG));
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->in_use = TRUE;
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (&p_sreg->app_uuid, &p_list->asgn_range.app_uuid128, sizeof(tBT_UUID));
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->service_instance    = p_list->asgn_range.svc_inst;
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->type                = p_list->asgn_range.is_primary ? GATT_UUID_PRI_SERVICE: GATT_UUID_SEC_SERVICE;
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->s_hdl               = p_list->asgn_range.s_handle;
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->e_hdl               = p_list->asgn_range.e_handle;
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_sreg->p_db                = &p_list->svc_db;
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1366b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_DEBUG ("total GKI buffer in db [%d]",p_sreg->p_db->svc_buffer.count);
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ii;
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_get_sec_info
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get the security flag and key size information for the peer
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  device.
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_sr_get_sec_info(BD_ADDR rem_bda, tBT_TRANSPORT transport, UINT8 *p_sec_flag, UINT8 *p_key_size)
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           sec_flag = 0;
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    BTM_GetSecurityFlagsByTransport(rem_bda, &sec_flag, transport);
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    sec_flag &= (GATT_SEC_FLAG_LKEY_UNAUTHED | GATT_SEC_FLAG_LKEY_AUTHED | GATT_SEC_FLAG_ENCRYPTED);
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_key_size = btm_ble_read_sec_key_size(rem_bda);
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_sec_flag = sec_flag;
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_send_req_callback
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_send_req_callback(UINT16 conn_id,
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               UINT32 trans_id,
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               tGATTS_REQ_TYPE type, tGATTS_DATA *p_data)
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if = GATT_GET_GATT_IF(conn_id);
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_reg )
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1413b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR ("p_reg not found discard request");
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ( p_reg->in_use &&
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         p_reg->app_cb.p_req_cb)
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_reg->app_cb.p_req_cb)(conn_id, trans_id, type, p_data);
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1424b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_WARNING("Call back not found for application conn_id=%d", conn_id);
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_send_error_rsp
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function sends an error response.
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_STATUS gatt_send_error_rsp (tGATT_TCB *p_tcb, UINT8 err_code, UINT8 op_code,
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  UINT16 handle, BOOLEAN deq)
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_ERROR      error;
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_STATUS     status;
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR           *p_buf;
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    error.cmd_code = op_code;
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    error.reason = err_code;
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    error.handle =handle;
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_buf = attp_build_sr_msg(p_tcb, GATT_RSP_ERROR, (tGATT_SR_MSG *)&error)) != NULL)
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = attp_send_sr_msg (p_tcb, p_buf);
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = GATT_INSUF_RESOURCE;
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (deq)
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_dequeue_sr_cmd(p_tcb);
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_add_sdp_record
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function add a SDP record for a GATT primary service
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 if error else sdp handle for the record.
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT32 gatt_add_sdp_record (tBT_UUID *p_uuid, UINT16 start_hdl, UINT16 end_hdl)
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tSDP_PROTOCOL_ELEM  proto_elem_list[2];
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32              sdp_handle;
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              list = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP;
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               buff[60];
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p = buff;
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1480b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_add_sdp_record s_hdl=0x%x  s_hdl=0x%x",start_hdl, end_hdl);
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((sdp_handle = SDP_CreateRecord()) == 0)
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0;
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_uuid->len)
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case LEN_UUID_16:
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SDP_AddServiceClassIdList(sdp_handle, 1, &p_uuid->uu.uuid16);
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
14918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        case LEN_UUID_32:
14928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_FOUR_BYTES);
14938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            UINT32_TO_BE_STREAM (p, p_uuid->uu.uuid32);
14948fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
14958fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                              (UINT32) (p - buff), buff);
14968fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            break;
14978fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case LEN_UUID_128:
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT8_TO_BE_STREAM (p, (UUID_DESC_TYPE << 3) | SIZE_SIXTEEN_BYTES);
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_BE_STREAM (p, p_uuid->uu.uuid128, LEN_UUID_128);
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SDP_AddAttribute (sdp_handle, ATTR_ID_SERVICE_CLASS_ID_LIST, DATA_ELE_SEQ_DESC_TYPE,
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              (UINT32) (p - buff), buff);
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1506b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("inavlid UUID len=%d", p_uuid->len);
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            SDP_DeleteRecord(sdp_handle);
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return 0;
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Fill out the protocol element sequence for SDP ***/
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP;
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[0].num_params    = 1;
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[0].params[0]     = BT_PSM_ATT;
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[1].protocol_uuid = UUID_PROTOCOL_ATT;
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[1].num_params    = 2;
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[1].params[0]     = start_hdl;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    proto_elem_list[1].params[1]     = end_hdl;
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SDP_AddProtocolList(sdp_handle, 2, proto_elem_list);
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make the service browseable */
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SDP_AddUuidSequence (sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, &list);
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(sdp_handle);
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #if GATT_CONFORMANCE_TESTING == TRUE
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_set_err_rsp
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the test confirm value
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_set_err_rsp(BOOLEAN enable, UINT8 req_op_code, UINT8 err_status)
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1542b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_set_err_rsp enable=%d op_code=%d, err_status=%d", enable, req_op_code, err_status);
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.enable_err_rsp  = enable;
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.req_op_code     = req_op_code;
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_cb.err_status      = err_status;
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #endif
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_get_regcb
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function returns the registration control block.
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the registration control block or NULL
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_REG *gatt_get_regcb (tGATT_IF gatt_if)
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           ii = (UINT8)gatt_if;
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = NULL;
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ii)
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ii--; /* convert from one based to zero based */
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_reg = &gatt_cb.cl_rcb[ii];
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( (ii < GATT_MAX_APPS)  && (p_reg->in_use) )
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return(p_reg);
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_clcb_allocated
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function check clcb for conn_id is allocated or not
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           True already allocated
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_clcb_allocated (UINT16 conn_id)
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8         i = 0;
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       is_allocated= FALSE;
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_CL_MAX_LCB; i++)
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.clcb[i].in_use && (gatt_cb.clcb[i].conn_id == conn_id))
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_allocated = TRUE;
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return is_allocated;
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_clcb_alloc
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function allocates a GATT  connection link control block
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           NULL if not found. Otherwise pointer to the connection link block.
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CLCB *gatt_clcb_alloc (UINT16 conn_id)
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           i = 0;
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB      *p_clcb = NULL;
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_IF        gatt_if=GATT_GET_GATT_IF(conn_id);
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           tcb_idx = GATT_GET_TCB_IDX(conn_id);
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = gatt_get_tcb_by_idx(tcb_idx);
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_CL_MAX_LCB; i++)
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!gatt_cb.clcb[i].in_use)
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb = &gatt_cb.clcb[i];
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->in_use      = TRUE;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->conn_id     = conn_id;
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->clcb_idx    = i;
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_reg       = p_reg;
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb->p_tcb       = p_tcb;
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_clcb;
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_clcb_dealloc
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function de allocates a GATT  connection link control block
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_clcb_dealloc (tGATT_CLCB *p_clcb)
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb && p_clcb->in_use)
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_clcb, 0, sizeof(tGATT_CLCB));
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_tcb_by_cid
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches for an empty entry
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                   in registration info table for GATT client
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           NULL if not found. Otherwise pointer to the rcb.
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_TCB * gatt_find_tcb_by_cid (UINT16 lcid)
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       xx = 0;
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB    *p_tcb = NULL;
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < GATT_MAX_PHY_CHANNEL; xx++)
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.tcb[xx].in_use && gatt_cb.tcb[xx].att_lcid == lcid)
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb = &gatt_cb.tcb[xx];
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_tcb;
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_num_apps_hold_link
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function find the number of applcaitions is holding the link
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          total number of applications holding this acl link.
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_num_apps_hold_link(tGATT_TCB *p_tcb)
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i, num = 0;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_APPS; i ++)
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->app_hold_link[i])
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num ++;
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1704b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_num_apps_hold_link   num=%d",  num);
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return num;
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_num_clcb_by_bd_addr
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches all LCB with macthing bd address
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          total number of clcb found.
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_num_clcb_by_bd_addr(BD_ADDR bda)
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i, num = 0;
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_CL_MAX_LCB; i ++)
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_cb.clcb[i].in_use && memcmp(gatt_cb.clcb[i].p_tcb->peer_bda, bda, BD_ADDR_LEN) == 0)
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            num ++;
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return num;
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_update_cback_cnt
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches all LCB with macthing bd address
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          total number of clcb found.
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_copy_prep_cnt_to_cback_cnt(tGATT_TCB *p_tcb )
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_tcb->prep_cnt[i])
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_tcb->sr_cmd.cback_cnt[i]=1;
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_is_cback_cnt_zero
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      The function searches all LCB with macthing bd address
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          True if thetotal application callback count is zero
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_sr_is_cback_cnt_zero(tGATT_TCB *p_tcb )
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status = TRUE;
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_tcb->sr_cmd.cback_cnt[i])
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = FALSE;
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = FALSE;
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_is_prep_cnt_zero
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Check the prepare write request count is zero or not
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          True no prepare write request
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_sr_is_prep_cnt_zero(tGATT_TCB *p_tcb)
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status = TRUE;
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_tcb->prep_cnt[i])
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = FALSE;
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = FALSE;
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_reset_cback_cnt
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Reset the application callback count to zero
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         None
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_reset_cback_cnt(tGATT_TCB *p_tcb )
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->sr_cmd.cback_cnt[i]=0;
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_reset_prep_cnt
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description     Reset the prep write count to zero
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns        None
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_reset_prep_cnt(tGATT_TCB *p_tcb )
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->prep_cnt[i]=0;
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_update_cback_cnt
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description    Update the teh applicaiton callback count
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           None
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_update_cback_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, BOOLEAN is_reset_first)
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 idx = ((UINT8) gatt_if) - 1 ;
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_reset_first)
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_sr_reset_cback_cnt(p_tcb);
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_inc)
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->sr_cmd.cback_cnt[idx]++;
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ( p_tcb->sr_cmd.cback_cnt[idx])
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_tcb->sr_cmd.cback_cnt[idx]--;
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_sr_update_prep_cnt
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description    Update the teh prepare write request count
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns           None
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_sr_update_prep_cnt(tGATT_TCB *p_tcb, tGATT_IF gatt_if, BOOLEAN is_inc, BOOLEAN is_reset_first)
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 idx = ((UINT8) gatt_if) - 1 ;
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1913b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG("gatt_sr_update_prep_cnt tcb idx=%d gatt_if=%d is_inc=%d is_reset_first=%d",
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_tcb->tcb_idx, gatt_if, is_inc, is_reset_first);
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_reset_first)
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_sr_reset_prep_cnt(p_tcb);
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_inc)
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_tcb->prep_cnt[idx]++;
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_tcb->prep_cnt[idx])
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_tcb->prep_cnt[idx]--;
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cancel_open
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Cancel open request
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         Boolean
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_cancel_open(tGATT_IF gatt_if, BD_ADDR bda)
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB *p_tcb=NULL;
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN status= TRUE;
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19498fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    p_tcb = gatt_find_tcb_by_addr(bda, BT_TRANSPORT_LE);
19508fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (gatt_get_ch_state(p_tcb) == GATT_CH_OPEN)
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1955b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati            GATT_TRACE_ERROR("GATT_CancelConnect - link connected Too late to cancel");
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = FALSE;
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!gatt_num_apps_hold_link(p_tcb))
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19638fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                gatt_disconnect(p_tcb);
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_app_hold_link
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      find the applicaiton that is holding the specified link
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns         Boolean
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_find_app_hold_link(tGATT_TCB *p_tcb, UINT8 start_idx, UINT8 *p_found_idx, tGATT_IF *p_gatt_if)
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i;
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN found= FALSE;
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = start_idx; i < GATT_MAX_APPS; i ++)
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_tcb->app_hold_link[i])
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_gatt_if = gatt_cb.clcb[i].p_reg->gatt_if;
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_found_idx = i;
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            found = TRUE;
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return found;
19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cmd_enq
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Enqueue this command.
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None.
20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_cmd_enq(tGATT_TCB *p_tcb, UINT16 clcb_idx, BOOLEAN to_send, UINT8 op_code, BT_HDR *p_buf)
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CMD_Q  *p_cmd = &p_tcb->cl_cmd_q[p_tcb->next_slot_inq];
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cmd->to_send = to_send; /* waiting to be sent */
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cmd->op_code  = op_code;
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cmd->p_cmd    = p_buf;
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cmd->clcb_idx = clcb_idx;
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!to_send)
20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->pending_cl_req = p_tcb->next_slot_inq;
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tcb->next_slot_inq ++;
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_tcb->next_slot_inq %= GATT_CL_MAX_LCB;
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cmd_dequeue
20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      dequeue the command in the client CCB command queue.
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          total number of clcb found.
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_CLCB * gatt_cmd_dequeue(tGATT_TCB *p_tcb, UINT8 *p_op_code)
20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CMD_Q  *p_cmd = &p_tcb->cl_cmd_q[p_tcb->pending_cl_req];
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB *p_clcb = NULL;
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb->pending_cl_req != p_tcb->next_slot_inq)
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_clcb = &gatt_cb.clcb[p_cmd->clcb_idx];
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_op_code = p_cmd->op_code;
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->pending_cl_req ++;
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_tcb->pending_cl_req %= GATT_CL_MAX_LCB;
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_clcb;
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_send_write_msg
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This real function send out the ATT message for write.
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status code
20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_send_write_msg (tGATT_TCB *p_tcb, UINT16 clcb_idx, UINT8 op_code,
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           UINT16 handle, UINT16 len,
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           UINT16 offset, UINT8 *p_data)
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CL_MSG     msg;
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.attr_value.handle = handle;
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.attr_value.len = len;
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.attr_value.offset = offset;
20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (msg.attr_value.value, p_data, len);
20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* write by handle */
20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return attp_send_cl_msg(p_tcb, clcb_idx, op_code, &msg);
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_act_send_browse
20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function ends a browse command request, including read
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  information request and read by type request.
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status code
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_act_send_browse(tGATT_TCB *p_tcb, UINT16 index, UINT8 op, UINT16 s_handle,
20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           UINT16 e_handle, tBT_UUID uuid)
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CL_MSG     msg;
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.browse.s_handle = s_handle;
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.browse.e_handle   = e_handle;
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(&msg.browse.uuid, &uuid, sizeof(tBT_UUID));
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* write by handle */
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return attp_send_cl_msg(p_tcb, index, op, &msg);
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_end_operation
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function ends a discovery, send callback and finalize
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  some control value.
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          16 bits uuid.
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_end_operation(tGATT_CLCB *p_clcb, tGATT_STATUS status, void *p_data)
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CL_COMPLETE   cb_data;
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CMPL_CBACK    *p_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_cmpl_cb : NULL;
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               op = p_clcb->operation, disc_type=GATT_DISC_MAX;
21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_DISC_CMPL_CB  *p_disc_cmpl_cb = (p_clcb->p_reg) ? p_clcb->p_reg->app_cb.p_disc_cmpl_cb : NULL;
21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              conn_id;
21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               operation;
21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2121b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_end_operation status=%d op=%d subtype=%d",
21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       status, p_clcb->operation, p_clcb->op_subtype);
21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cmpl_cb != NULL && p_clcb->operation != 0)
21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_READ)
21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE));
21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.att_value.handle   = p_clcb->s_handle;
21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.att_value.len      = p_clcb->counter;
21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data)
21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memcpy (cb_data.att_value.value, p_data, cb_data.att_value.len);
21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_WRITE)
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(&cb_data.att_value, 0, sizeof(tGATT_VALUE));
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.handle           =
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.att_value.handle = p_clcb->s_handle;
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->op_subtype == GATT_WRITE_PREPARE)
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_data)
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    cb_data.att_value = *((tGATT_VALUE *) p_data);
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
2148b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    GATT_TRACE_DEBUG("Rcv Prepare write rsp but no data");
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_CONFIG)
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            cb_data.mtu = p_clcb->p_tcb->payload_size;
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_clcb->operation == GATTC_OPTYPE_DISCOVERY)
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            disc_type = p_clcb->op_subtype;
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_clcb->p_attr_buf)
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(p_clcb->p_attr_buf);
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    operation =  p_clcb->operation;
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    conn_id = p_clcb->conn_id;
21695fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu    btu_stop_timer(&p_clcb->rsp_timer_ent);
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    gatt_clcb_dealloc(p_clcb);
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_disc_cmpl_cb && (op == GATTC_OPTYPE_DISCOVERY))
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_disc_cmpl_cb)(conn_id, disc_type, status);
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_cmpl_cb && op)
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cmpl_cb)(conn_id, op, status, &cb_data);
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2178b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_WARNING ("gatt_end_operation not sent out op=%d p_disc_cmpl_cb:%p p_cmpl_cb:%p",
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             operation, p_disc_cmpl_cb, p_cmpl_cb);
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_cleanup_upon_disc
21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function cleans up the control blocks when L2CAP channel
21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  disconnect.
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          16 bits uuid.
21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Battavoid gatt_cleanup_upon_disc(BD_ADDR bda, UINT16 reason, tBT_TRANSPORT transport)
21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_TCB       *p_tcb = NULL;
21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_CLCB      *p_clcb;
21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           i;
21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          conn_id;
21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG        *p_reg=NULL;
21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2201b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_cleanup_upon_disc ");
22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22038fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if ((p_tcb = gatt_find_tcb_by_addr(bda, transport)) != NULL)
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2205b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("found p_tcb ");
22068fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        gatt_set_ch_state(p_tcb, GATT_CH_CLOSE);
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_CL_MAX_LCB; i ++)
22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_clcb = &gatt_cb.clcb[i];
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_clcb->in_use && p_clcb->p_tcb == p_tcb)
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22125fba60a8761b28adec2704dcbf69376ebde4f19bZhihai Xu                btu_stop_timer(&p_clcb->rsp_timer_ent);
2213b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_DEBUG ("found p_clcb conn_id=%d clcb_idx=%d", p_clcb->conn_id, p_clcb->clcb_idx);
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_clcb->operation != GATTC_OPTYPE_NONE)
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    gatt_end_operation(p_clcb, GATT_ERROR, NULL);
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                gatt_clcb_dealloc(p_clcb);
22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&p_tcb->ind_ack_timer_ent);
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_stop_timer (&p_tcb->conf_timer_ent);
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_free_pending_ind(p_tcb);
2225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        gatt_free_pending_enc_queue(p_tcb);
22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_reg = &gatt_cb.cl_rcb[i];
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_reg->in_use && p_reg->app_cb.p_conn_cb)
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                conn_id = GATT_CREATE_CONN_ID(p_tcb->tcb_idx, p_reg->gatt_if);
2233b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                GATT_TRACE_DEBUG ("found p_reg tcb_idx=%d gatt_if=%d  conn_id=0x%x", p_tcb->tcb_idx, p_reg->gatt_if, conn_id);
22348fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta                (*p_reg->app_cb.p_conn_cb)(p_reg->gatt_if,  bda, conn_id, FALSE, reason, transport);
22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_tcb, 0, sizeof(tGATT_TCB));
22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2240b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("exit gatt_cleanup_upon_disc ");
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_dbg_req_op_name
22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Get op code description name, for debug information.
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          UINT8 *: name of the operation.
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 * gatt_dbg_op_name(UINT8 op_code)
22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 pseduo_op_code_idx = op_code & (~GATT_WRITE_CMD_MASK);
22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op_code == GATT_CMD_WRITE )
22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pseduo_op_code_idx = 0x14; /* just an index to op_code_name */
22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (op_code == GATT_SIGN_CMD_WRITE)
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pseduo_op_code_idx = 0x15; /* just an index to op_code_name */
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (pseduo_op_code_idx <= GATT_OP_CODE_MAX)
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(UINT8*) op_code_name[pseduo_op_code_idx];
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(UINT8 *)"Op Code Exceed Max";
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_dbg_display_uuid
22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Disaplay the UUID
22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_dbg_display_uuid(tBT_UUID bt_uuid)
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char str_buf[50];
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int x = 0;
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bt_uuid.len == LEN_UUID_16)
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sprintf(str_buf, "0x%04x", bt_uuid.uu.uuid16);
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    else if (bt_uuid.len == LEN_UUID_32)
22918fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    {
22928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        sprintf(str_buf, "0x%08x", (unsigned int)bt_uuid.uu.uuid32);
22938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    }
22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (bt_uuid.len == LEN_UUID_128)
22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        x += sprintf(&str_buf[x], "0x%02x%02x%02x%02x%02x%02x%02x%02x",
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bt_uuid.uu.uuid128[15], bt_uuid.uu.uuid128[14],
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bt_uuid.uu.uuid128[13], bt_uuid.uu.uuid128[12],
22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bt_uuid.uu.uuid128[11], bt_uuid.uu.uuid128[10],
23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     bt_uuid.uu.uuid128[9], bt_uuid.uu.uuid128[8]);
23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sprintf(&str_buf[x], "%02x%02x%02x%02x%02x%02x%02x%02x",
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bt_uuid.uu.uuid128[7], bt_uuid.uu.uuid128[6],
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bt_uuid.uu.uuid128[5], bt_uuid.uu.uuid128[4],
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bt_uuid.uu.uuid128[3], bt_uuid.uu.uuid128[2],
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bt_uuid.uu.uuid128[1], bt_uuid.uu.uuid128[0]);
23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BCM_STRNCPY_S(str_buf, sizeof(str_buf), "Unknown UUID 0", 15);
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2310b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("UUID=[%s]", str_buf);
23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_is_bg_dev_for_app
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      find is this one of the background devices for the application
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE this is one of the background devices for the  application
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_is_bg_dev_for_app(tGATT_BG_CONN_DEV *p_dev, tGATT_IF gatt_if)
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_APPS; i ++ )
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev->in_use && (p_dev->gatt_if[i] == gatt_if))
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return TRUE;
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_bg_dev
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      find background connection device from the list.
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the device record
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_BG_CONN_DEV * gatt_find_bg_dev(BD_ADDR remote_bda)
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV    *p_dev_list = &gatt_cb.bgconn_dev[0];
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++)
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_list->in_use && !memcmp(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN))
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p_dev_list;
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_alloc_bg_dev
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      allocate a background connection device record
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the device record
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttGATT_BG_CONN_DEV * gatt_alloc_bg_dev(BD_ADDR remote_bda)
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV    *p_dev_list = &gatt_cb.bgconn_dev[0];
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++)
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_dev_list->in_use)
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_list->in_use = TRUE;
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_dev_list->remote_bda, remote_bda, BD_ADDR_LEN);
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p_dev_list;
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_add_bg_dev_list
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      add/remove device from the back ground connection device list
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE if device added to the list; FALSE failed
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_add_bg_dev_list(tGATT_REG *p_reg,  BD_ADDR bd_addr, BOOLEAN is_initator)
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_IF gatt_if =  p_reg->gatt_if;
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV   *p_dev = NULL;
2400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8       i;
2401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN      ret = FALSE;
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL)
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev = gatt_alloc_bg_dev(bd_addr);
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dev)
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (is_initator)
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (p_dev->gatt_if[i] == gatt_if)
2415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2416b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    GATT_TRACE_ERROR("device already in iniator white list");
241740016adf0e4bab95760f4fb86e159017b7f94498Andre Eisenbach                    return TRUE;
2418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                else if (p_dev->gatt_if[i] == 0)
2420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    p_dev->gatt_if[i] = gatt_if;
2422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    if (i == 0)
2423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        ret = BTM_BleUpdateBgConnDev(TRUE, bd_addr);
2424e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    else
2425e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                        ret = TRUE;
2426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    break;
2427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (p_dev->listen_gif[i] == gatt_if)
2432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2433b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati                    GATT_TRACE_ERROR("device already in adv white list");
243440016adf0e4bab95760f4fb86e159017b7f94498Andre Eisenbach                    return TRUE;
2435ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
2436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                else if (p_dev->listen_gif[i] == 0)
2437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                {
2438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    if (p_reg->listening == GATT_LISTEN_TO_ALL)
2439ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        p_reg->listening = GATT_LISTEN_TO_NONE;
2440ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2441ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    p_reg->listening ++;
2442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    p_dev->listen_gif[i] = gatt_if;
2443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    if (i == 0)
2445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        ret = BTM_BleUpdateAdvWhitelist(TRUE, bd_addr);
2446e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    else
2447e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                        ret = TRUE;
2448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    break;
2449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                }
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
2454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2455b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("no device record available");
2456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return ret;
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_remove_bg_dev_for_app
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Remove the application interface for the specified background device
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Boolean
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_remove_bg_dev_for_app(tGATT_IF gatt_if, BD_ADDR bd_addr)
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24728fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    tGATT_TCB    *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN       status;
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_tcb)
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        gatt_update_app_use_link_flag(gatt_if, p_tcb, FALSE, FALSE);
2477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    status = gatt_update_auto_connect_dev(gatt_if, FALSE, bd_addr, TRUE);
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_get_num_apps_for_bg_dev
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Gte the number of applciations for the specified background device
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          UINT8 total number fo applications
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 gatt_get_num_apps_for_bg_dev(BD_ADDR bd_addr)
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV   *p_dev = NULL;
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   cnt = 0;
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev = gatt_find_bg_dev(bd_addr)) != NULL)
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (i = 0; i < GATT_MAX_APPS; i ++)
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_dev->gatt_if[i])
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cnt++;
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return cnt;
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_find_app_for_bg_dev
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      find the application interface for the specified background device
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          Boolean
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN gatt_find_app_for_bg_dev(BD_ADDR bd_addr, tGATT_IF *p_gatt_if)
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV   *p_dev = NULL;
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i;
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN ret = FALSE;
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL)
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ret;
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; i < GATT_MAX_APPS; i ++)
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev->gatt_if[i] != 0 )
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_gatt_if = p_dev->gatt_if[i];
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ret = TRUE;
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_remove_bg_dev_from_list
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      add/remove device from the back ground connection device list or
2546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  listening to advertising list.
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the device record
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_remove_bg_dev_from_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN is_initiator)
25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_IF gatt_if = p_reg->gatt_if;
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV   *p_dev = NULL;
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i, j;
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN ret = FALSE;
25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_dev = gatt_find_bg_dev(bd_addr)) == NULL)
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ret;
25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    for (i = 0; i < GATT_MAX_APPS && (p_dev->gatt_if[i] > 0 || p_dev->listen_gif[i]); i ++)
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (is_initiator)
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_dev->gatt_if[i] == gatt_if)
2568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev->gatt_if[i] = 0;
2570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* move all element behind one forward */
2571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                for (j = i + 1; j < GATT_MAX_APPS; j ++)
2572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    p_dev->gatt_if[j - 1] = p_dev->gatt_if[j];
25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (p_dev->gatt_if[0] == 0)
2575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    ret = BTM_BleUpdateBgConnDev(FALSE, p_dev->remote_bda);
2576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                else
2577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    ret = TRUE;
25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
2580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
2583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_dev->listen_gif[i] == gatt_if)
25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_dev->listen_gif[i] = 0;
2587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_reg->listening --;
2588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* move all element behind one forward */
2589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                for (j = i + 1; j < GATT_MAX_APPS; j ++)
2590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    p_dev->listen_gif[j - 1] = p_dev->listen_gif[j];
2591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (p_dev->listen_gif[0] == 0)
2593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    ret = BTM_BleUpdateAdvWhitelist(FALSE, p_dev->remote_bda);
2594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                else
2595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    ret = TRUE;
2596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (i != GATT_MAX_APPS && p_dev->gatt_if[0] == 0 && p_dev->listen_gif[0] == 0)
2602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memset(p_dev, 0, sizeof(tGATT_BG_CONN_DEV));
2604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_deregister_bgdev_list
26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      deregister all related back ground connetion device.
26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the device record
26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_deregister_bgdev_list(tGATT_IF gatt_if)
26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_BG_CONN_DEV    *p_dev_list = &gatt_cb.bgconn_dev[0];
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i , j, k;
2621e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    tGATT_REG       *p_reg = gatt_get_regcb(gatt_if);
26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2623e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach    /* update the BG conn device list */
26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0 ; i <GATT_MAX_BG_CONN_DEV; i ++, p_dev_list ++ )
26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_list->in_use)
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (j = 0; j < GATT_MAX_APPS; j ++)
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2630e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                if (p_dev_list->gatt_if[j] == 0 && p_dev_list->listen_gif[j] == 0)
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
2632e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
2633e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                if (p_dev_list->gatt_if[j] == gatt_if)
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    for (k = j + 1; k < GATT_MAX_APPS; k ++)
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_dev_list->gatt_if[k - 1] = p_dev_list->gatt_if[k];
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    if (p_dev_list->gatt_if[0] == 0)
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTM_BleUpdateBgConnDev(FALSE, p_dev_list->remote_bda);
2640e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                }
2641e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
2642e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                if (p_dev_list->listen_gif[j] == gatt_if)
2643e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                {
2644e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    p_dev_list->listen_gif[j] = 0;
26456975b4d711142b885af479721cada448952c6b41Andre Eisenbach
26466975b4d711142b885af479721cada448952c6b41Andre Eisenbach                    if (p_reg != NULL && p_reg->listening > 0)
26476975b4d711142b885af479721cada448952c6b41Andre Eisenbach                        p_reg->listening --;
2648e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
2649e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    /* move all element behind one forward */
2650e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    for (k = j + 1; k < GATT_MAX_APPS; k ++)
2651e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                        p_dev_list->listen_gif[k - 1] = p_dev_list->listen_gif[k];
2652e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach
2653e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                    if (p_dev_list->listen_gif[0] == 0)
2654e1202caae4920139ea0cfed5c51f5f76b2dc8bc4Andre Eisenbach                        BTM_BleUpdateAdvWhitelist(FALSE, p_dev_list->remote_bda);
26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_reset_bgdev_list
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      reset bg device list
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to the device record
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid gatt_reset_bgdev_list(void)
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&gatt_cb.bgconn_dev, 0 , sizeof(tGATT_BG_CONN_DEV)*GATT_MAX_BG_CONN_DEV);
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         gatt_update_auto_connect_dev
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function add or remove a device for background connection
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       gatt_if: Application ID.
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  add: add peer device
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  bd_addr: peer device address.
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if connection started; FALSE if connection start failure.
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN gatt_update_auto_connect_dev (tGATT_IF gatt_if, BOOLEAN add, BD_ADDR bd_addr, BOOLEAN is_initator)
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         ret = FALSE;
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tGATT_REG        *p_reg;
26948fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    tGATT_TCB       *p_tcb = gatt_find_tcb_by_addr(bd_addr, BT_TRANSPORT_LE);
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2696b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_API ("gatt_update_auto_connect_dev ");
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure app is registered */
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_reg = gatt_get_regcb(gatt_if)) == NULL)
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2700b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_ERROR("gatt_update_auto_connect_dev - gatt_if is not registered", gatt_if);
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (add)
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ret = gatt_add_bg_dev_list(p_reg, bd_addr, is_initator);
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (ret && p_tcb != NULL)
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if a connected device, update the link holding number */
2711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            gatt_update_app_use_link_flag(gatt_if, p_tcb, TRUE, TRUE);
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        ret = gatt_remove_bg_dev_from_list(p_reg, bd_addr, is_initator);
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function     gatt_add_pending_new_srv_start
2726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description  Add a pending new srv start to the new service start queue
2728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns    Pointer to the new service start buffer, NULL no buffer available
2730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatGATT_PENDING_ENC_CLCB* gatt_add_pending_enc_channel_clcb(tGATT_TCB *p_tcb, tGATT_CLCB *p_clcb )
2733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
2734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_PENDING_ENC_CLCB   *p_buf;
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2736b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati    GATT_TRACE_DEBUG ("gatt_add_pending_new_srv_start");
2737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_buf = (tGATT_PENDING_ENC_CLCB *)GKI_getbuf((UINT16)sizeof(tGATT_PENDING_ENC_CLCB))) != NULL)
2738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2739b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati        GATT_TRACE_DEBUG ("enqueue a new pending encryption channel clcb");
2740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_buf->p_clcb = p_clcb;
2741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        GKI_enqueue (&p_tcb->pending_enc_clcb, p_buf);
2742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return p_buf;
2744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
2745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
2746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function     gatt_update_listen_mode
2748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description  update peripheral role listening mode
2750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns    Pointer to the new service start buffer, NULL no buffer available
2752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
27548fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi BattaBOOLEAN gatt_update_listen_mode(void)
2755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
2756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           ii = 0;
2757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tGATT_REG       *p_reg = &gatt_cb.cl_rcb[0];
2758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           listening = 0;
2759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16          connectability, window, interval;
27608fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    BOOLEAN         rt = TRUE;
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    for (; ii < GATT_MAX_APPS; ii ++, p_reg ++)
2763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if ( p_reg->in_use && p_reg->listening > listening)
2765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            listening = p_reg->listening;
2767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (listening == GATT_LISTEN_TO_ALL ||
2771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        listening == GATT_LISTEN_TO_NONE)
2772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_ALL);
2773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
2774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_BleUpdateAdvFilterPolicy (AP_SCAN_CONN_WL);
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27768fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    if (rt)
2777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
27788fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        connectability = BTM_ReadConnectability (&window, &interval);
27798fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
27808fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        if (listening != GATT_LISTEN_TO_NONE)
27818fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        {
27828fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            connectability |= BTM_BLE_CONNECTABLE;
27838fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        }
27848fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        else
27858fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        {
27868fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            if ((connectability & BTM_BLE_CONNECTABLE) == 0)
27878fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta            connectability &= ~BTM_BLE_CONNECTABLE;
27888fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        }
27898fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        /* turning on the adv now */
27908fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta        btm_ble_set_connectability(connectability);
2791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
27928fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta
27938fe58875ce67c6e1099e7ba2339dcd2b979491b0Ganesh Ganapathi Batta    return rt;
2794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2799