btif_gatt_multi_adv_util.c revision ffb3960bb05f9acb0717d213612403487e9ad433
1ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji/******************************************************************************
2ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
3ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Copyright (C) 2014  Broadcom Corporation
4ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
5ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Licensed under the Apache License, Version 2.0 (the "License");
6ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  you may not use this file except in compliance with the License.
7ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  You may obtain a copy of the License at:
8ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
9ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  http://www.apache.org/licenses/LICENSE-2.0
10ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
11ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Unless required by applicable law or agreed to in writing, software
12ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  distributed under the License is distributed on an "AS IS" BASIS,
13ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  See the License for the specific language governing permissions and
15ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  limitations under the License.
16ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
17ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji ******************************************************************************/
18ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
19ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
20ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji/*******************************************************************************
21ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
22ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Filename:      btif_gatt_multi_adv_util.c
23ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
24ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Description:   Multi ADV helper implementation
25ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
26ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *******************************************************************************/
27ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
28ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <stdio.h>
29ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <stdlib.h>
30ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
31ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#define LOG_TAG "BtGatt.btif"
32ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#if (BLE_INCLUDED == TRUE)
33ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
34ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "btif_gatt_multi_adv_util.h"
35ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "btif_common.h"
36ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <hardware/bt_gatt.h>
37ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "bta_gatt_api.h"
38ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "btif_gatt_util.h"
39ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
40ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji/*******************************************************************************
41ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji**  Static variables
42ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji********************************************************************************/
43ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojistatic int multi_adv_enable_count = 0;
44ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojistatic btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
45ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
46ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojibtgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
47ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
48ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(p_multi_adv_com_data_cb == NULL)
49ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
50ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return p_multi_adv_com_data_cb;
51ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
52ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
53ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_init_multi_adv_cb(void)
54ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
55ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i;
56ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
57ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
58ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
59ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
60ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
61ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(multi_adv_enable_count == 0)
62ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
63ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memset(p_multi_adv_data_cb,0,sizeof(btgatt_multi_adv_common_data));
64ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
65ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        for (i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
66ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
67ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
68ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
69ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
70ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
71ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    multi_adv_enable_count++;
72ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
73ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
74ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_destroy_multi_adv_cb()
75ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
76ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(multi_adv_enable_count > 0)
77ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        multi_adv_enable_count --;
78ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(multi_adv_enable_count == 0)
79ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
80ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_adv_com_data_cb);
81ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_com_data_cb = NULL;
82ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
83ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
84ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
85ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojiint btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
86ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
87ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i=0;
88ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
89ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
90ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
91ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
92ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
93ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
94ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
95ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
96ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
97ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       {
98ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          if(!gen_temp_instid)
99ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          {
100ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             // Write the final inst_id value obtained from stack layer
101ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
102ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             BTIF_TRACE_DEBUG3("%s -Index: %d, Found client_if: %d", __FUNCTION__,
103ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
104ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             break;
105ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          }
106ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          else
107ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          {
108ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              //Store the passed in inst_id value
109ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             if(inst_id != INVALID_ADV_INST)
110ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
111ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             else
112ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
113ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             BTIF_TRACE_DEBUG3("%s - Index:%d,Found client_if: %d", __FUNCTION__,
114ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
115ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             break;
116ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          }
117ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       }
118ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
119ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
120ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(i < BTM_BLE_MULTI_ADV_MAX)
121ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return i;
122ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
123ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // If client ID if is not found, then write both values
124ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
125ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
126ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if(INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
127ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
128ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = client_if;
129ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             if(inst_id != INVALID_ADV_INST)
130ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
131ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             else
132ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
133ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             BTIF_TRACE_DEBUG4("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
134ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            __FUNCTION__,i,
135ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX],
136ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX]);
137ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             break;
138ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
139ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
140ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
141ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(i < BTM_BLE_MULTI_ADV_MAX)
142ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return i;
143ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return INVALID_ADV_INST;
144ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
145ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
146ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojiint btif_multi_adv_instid_for_clientif(int client_if)
147ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
148ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i=0, ret = INVALID_ADV_INST;
149ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
150ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
151ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
152ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
153ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
154ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
155ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Retrieve the existing inst_id for the client_if value
156ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
157ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
158ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
159ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          ret = p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX];
160ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
161ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
162ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(ret != INVALID_ADV_INST)
163ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return ret;
164ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
165ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return INVALID_ADV_INST;
166ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
167ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
168ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
169ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojiint btif_gattc_obtain_idx_for_datacb(int value, int arrindex)
170ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
171ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i=0;
172ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
173ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
174ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
175ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
176ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
177ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
178ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Retrieve the array index for the inst_id value
179ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
180ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
181ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       if(value == p_multi_adv_data_cb->clntif_map[i][arrindex])
182ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           break;
183ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
184ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
185ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(i < BTM_BLE_MULTI_ADV_MAX)
186ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
187ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        BTIF_TRACE_DEBUG2("%s, %d",__FUNCTION__,i+1);
188ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return (i + 1);
189ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
190ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
191ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    BTIF_TRACE_DEBUG1("%s Invalid instance",__FUNCTION__);
192ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return INVALID_ADV_INST;
193ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
194ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
195ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
196ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
197ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                bool include_name, bool include_txpower, int min_interval, int max_interval,
198ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                int appearance, uint16_t manufacturer_len, char* manufacturer_data,
199ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                uint16_t service_data_len, char* service_data, uint16_t service_uuid_len,
200ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                char* service_uuid, btif_adv_data_t *p_multi_adv_inst)
201ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
202ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    memset(p_multi_adv_inst, 0 , sizeof(btif_adv_data_t));
203ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
204ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->client_if = (uint8_t) client_if;
205ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->set_scan_rsp = set_scan_rsp;
206ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->include_name = include_name;
207ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->include_txpower = include_txpower;
208ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->min_interval = min_interval;
209ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->max_interval = max_interval;
210ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->appearance = appearance;
211ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->manufacturer_len = manufacturer_len;
212ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
213ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(manufacturer_len > 0)
214ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
215ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_inst->p_manufacturer_data = GKI_getbuf(manufacturer_len);
216ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
217ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
218ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
219ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->service_data_len = service_data_len;
220ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(service_data_len > 0)
221ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
222ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_inst->p_service_data = GKI_getbuf(service_data_len);
223ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
224ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
225ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
226ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->service_uuid_len = service_uuid_len;
227ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(service_uuid_len > 0)
228ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
229ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_inst->p_service_uuid = GKI_getbuf(service_uuid_len);
230ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
231ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
232ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
233ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
234ffb3960bb05f9acb0717d213612403487e9ad433Satya CallojiBOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN bInstData)
235ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
236ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i=0;
237ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
238ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb || cbindex < 0)
239ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       return false;
240ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
241ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
242ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    memset(&p_multi_adv_data_cb->inst_cb[cbindex],0, sizeof(btgatt_multi_adv_inst_cb));
243ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    memset(&p_multi_adv_data_cb->inst_cb[cbindex].data, 0, sizeof(tBTA_BLE_ADV_DATA));
244ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
245ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (!p_adv_data->set_scan_rsp)
246ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
247ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_multi_adv_data_cb->inst_cb[cbindex].is_scan_rsp = p_adv_data->set_scan_rsp ? 1 : 0;
248ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_multi_adv_data_cb->inst_cb[cbindex].mask = BTM_BLE_AD_BIT_FLAGS;
249ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS;
250ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
251ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
252ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->include_name)
253ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
254ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
255ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->include_txpower)
256ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_TX_PWR;
257ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
258ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (false == bInstData && p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 &&
259ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_adv_data->max_interval > p_adv_data->min_interval)
260ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
261ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_INT_RANGE;
262ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
263ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                        p_adv_data->min_interval;
264ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
265ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                        p_adv_data->max_interval;
266ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
267ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    else
268ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(true == bInstData)
269ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
270ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
271ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
272ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max >
273ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min)
274ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
275ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
276ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min;
277ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
278ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max;
279ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
280ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
281ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_adv_data->include_txpower)
282ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
283ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].data.tx_power =
284ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                p_multi_adv_data_cb->inst_cb[cbindex].param.tx_power;
285ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
286ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
287ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
288ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->appearance != 0)
289ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
290ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_APPEARANCE;
291ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.appearance = p_adv_data->appearance;
292ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
293ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
294ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->manufacturer_len > 0 && p_adv_data->p_manufacturer_data != NULL)
295ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
296ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu =
297ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            GKI_getbuf(sizeof(tBTA_BLE_MANU));
298ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         if(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
299ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         {
300ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val =
301ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            GKI_getbuf(p_adv_data->manufacturer_len);
302ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val != NULL)
303ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            {
304ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_MANU;
305ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->len =
306ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                p_adv_data->manufacturer_len;
307ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 memcpy(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val,
308ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                    p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len);
309ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            }
310ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         }
311ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     }
312ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
313ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     tBTA_BLE_PROP_ELEM *p_elem_service_data = NULL;
314ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     tBTA_BLE_PROP_ELEM *p_elem_service_128 = NULL;
315ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
316ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     if (p_adv_data->service_data_len > 0 && p_adv_data->p_service_data != NULL)
317ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     {
318ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         BTIF_TRACE_DEBUG1("%s - In service_data", __FUNCTION__);
319ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_elem_service_data = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
320ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         if (p_elem_service_data != NULL)
321ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         {
322ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_elem_service_data->p_val = GKI_getbuf(p_adv_data->service_data_len);
323ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             if (p_elem_service_data->p_val != NULL)
324ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             {
325ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_elem_service_data->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
326ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_elem_service_data->len = p_adv_data->service_data_len;
327ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 memcpy(p_elem_service_data->p_val, p_adv_data->p_service_data,
328ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             p_adv_data->service_data_len);
329ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             } else {
330ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     GKI_freebuf(p_elem_service_data);
331ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     p_elem_service_data = NULL;
332ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji               }
333ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             }
334ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         }
335ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
336ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         if (p_adv_data->service_uuid_len > 0 && p_adv_data->p_service_uuid != NULL)
337ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         {
338ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services =
339ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                            GKI_getbuf(sizeof(tBTA_BLE_SERVICE));
340ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->list_cmpl = FALSE;
341ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service = 0;
342ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid =
343ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 GKI_getbuf(p_adv_data->service_uuid_len / LEN_UUID_128 * LEN_UUID_16);
344ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid != NULL)
345ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             {
346ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 UINT16 *p_uuid_out = p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->p_uuid;
347ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 while (p_adv_data->service_uuid_len >= LEN_UUID_128)
348ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 {
349ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     bt_uuid_t uuid;
350ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     memset(&uuid, 0, sizeof(bt_uuid_t));
351ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     memcpy(&uuid.uu, p_adv_data->p_service_uuid, LEN_UUID_128);
352ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     tBT_UUID bt_uuid;
353ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     memset(&bt_uuid, 0, sizeof(tBT_UUID));
354ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     btif_to_bta_uuid(&bt_uuid, &uuid);
355ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
356ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     if (bt_uuid.len == LEN_UUID_16)
357ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     {
358ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
359ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         ++p_multi_adv_data_cb->inst_cb[cbindex].data.p_services->num_service;
360ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         *p_uuid_out++ = bt_uuid.uu.uuid16;
361ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     } else if (bt_uuid.len == LEN_UUID_128 && p_elem_service_128 == NULL) {
362ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         /* Currently, only one 128-bit UUID is supported */
363ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         p_elem_service_128 = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM));
364ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         if (p_elem_service_128 != NULL)
365ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         {
366ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             p_elem_service_128->p_val = GKI_getbuf(LEN_UUID_128);
367ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             if (p_elem_service_128->p_val != NULL)
368ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             {
369ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                 p_elem_service_128->adv_type = BTM_BLE_AD_TYPE_128SRV_PART;
370ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                 p_elem_service_128->len = LEN_UUID_128;
371ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                 memcpy(p_elem_service_128->p_val, bt_uuid.uu.uuid128, LEN_UUID_128);
372ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             } else {
373ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                 GKI_freebuf(p_elem_service_128);
374ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                 p_elem_service_128 = NULL;
375ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                             }
376ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                         }
377ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     }
378ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     p_adv_data->p_service_uuid += LEN_UUID_128;
379ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     p_adv_data->service_uuid_len -= LEN_UUID_128;
380ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 }
381ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             }
382ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         }
383ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
384ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         if (p_elem_service_data != NULL || p_elem_service_128 != NULL)
385ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         {
386ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary =
387ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                                GKI_getbuf(sizeof(tBTA_BLE_PROPRIETARY));
388ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_proprietary != NULL)
389ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             {
390ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 tBTA_BLE_PROPRIETARY *p_prop = p_multi_adv_data_cb->inst_cb[cbindex].
391ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            data.p_proprietary;
392ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 tBTA_BLE_PROP_ELEM *p_elem = NULL;
393ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_prop->num_elem = 0;
394ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
395ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 if (p_elem_service_128 != NULL)
396ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     ++p_prop->num_elem;
397ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 if (p_elem_service_data != NULL)
398ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     ++p_prop->num_elem;
399ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_prop->p_elem = GKI_getbuf(sizeof(tBTA_BLE_PROP_ELEM) * p_prop->num_elem);
400ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 p_elem = p_prop->p_elem;
401ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 if (p_elem_service_128 != NULL)
402ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 {
403ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     memcpy(p_elem++, p_elem_service_128, sizeof(tBTA_BLE_PROP_ELEM));
404ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     GKI_freebuf(p_elem_service_128);
405ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 }
406ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 if (p_elem_service_data != NULL)
407ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 {
408ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     memcpy(p_elem++, p_elem_service_data, sizeof(tBTA_BLE_PROP_ELEM));
409ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                     GKI_freebuf(p_elem_service_data);
410ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                 }
411ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             }
412ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         }
413ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
414ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#if (defined(BLE_PERIPHERAL_ADV_NAME) && (BLE_PERIPHERAL_ADV_NAME == TRUE))
415ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
416ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#endif
417ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     return true;
418ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
419ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
420ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_clear_clientif(int client_if)
421ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
422ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int i=0;
423ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
424ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
425ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
426ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
427ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
428ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
429ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Clear both the inst_id and client_if values
430ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
431ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
432ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
433ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       {
434ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
435ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
436ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          BTIF_TRACE_DEBUG2("Cleaning up index %d for clnt_if :%d,", i, client_if);
437ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          break;
438ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       }
439ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
440ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
441ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
442ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_cleanup_inst_cb(int inst_id)
443ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
444ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    int cbindex = 0;
445ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Check for invalid instance id
446ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (inst_id < 0 || inst_id > BTM_BLE_MULTI_ADV_MAX)
447ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
448ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
449ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
450ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
451ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(NULL == p_multi_adv_data_cb)
452ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
453ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
454ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(inst_id > 0)
455ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
456ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
457ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (cbindex < 0)
458ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            return;
459ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
460ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    else
461ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(STD_ADV_INSTID == inst_id)
462ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji      cbindex = STD_ADV_INSTID;
463ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
464ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    BTIF_TRACE_DEBUG2("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
465ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
466ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
467ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
468ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
469ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
470ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Manufacturer data cleanup
471ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_manu != NULL)
472ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
473ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_manu->p_val != NULL)
474ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_manu->p_val);
475ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_manu);
476ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
477ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
478ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Proprietary data cleanup
479ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_proprietary != NULL)
480ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
481ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        int i = 0;
482ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        tBTA_BLE_PROP_ELEM *p_elem = p_multi_inst_cb->data.p_proprietary->p_elem;
483ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        while (i++ != p_multi_inst_cb->data.p_proprietary->num_elem
484ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            && p_elem)
485ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
486ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            if (p_elem->p_val != NULL)
487ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                GKI_freebuf(p_elem->p_val);
488ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            ++p_elem;
489ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
490ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
491ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_proprietary->p_elem != NULL)
492ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            GKI_freebuf(p_multi_inst_cb->data.p_proprietary->p_elem);
493ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_proprietary);
494ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
495ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
496ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Service list cleanup
497ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_services != NULL)
498ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
499ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_services->p_uuid != NULL)
500ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_services->p_uuid);
501ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_services);
502ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
503ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
504ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Service data cleanup
505ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_service_data != NULL)
506ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
507ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_service_data->p_val != NULL)
508ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_service_data->p_val);
509ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_service_data);
510ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
511ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
512ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_services_128b != NULL)
513ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_services_128b);
514ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
515ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_service_32b != NULL)
516ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
517ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_service_32b->p_uuid != NULL)
518ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_service_32b->p_uuid);
519ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_service_32b);
520ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
521ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
522ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_sol_services != NULL)
523ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
524ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_sol_services->p_uuid != NULL)
525ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_sol_services->p_uuid);
526ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_sol_services);
527ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
528ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
529ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_multi_inst_cb->data.p_sol_service_32b != NULL)
530ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
531ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_inst_cb->data.p_sol_service_32b->p_uuid != NULL)
532ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b->p_uuid);
533ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
534ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
535ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
536ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if(p_multi_inst_cb->data.p_sol_service_128b != NULL)
537ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
538ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
539ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
540ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#endif
541