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 *  Filename:      btif_gatt_multi_adv_util.c
22ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
23ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *  Description:   Multi ADV helper implementation
24ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *
25ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji *******************************************************************************/
26ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
2749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_gatt"
2849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
2949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
30ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <stdio.h>
31ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <stdlib.h>
32c7503db23f91676b2df732becb9579d5ccdcc7a7Ian Coolidge#include <string.h>
3349a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
34cf32e8d4e0cabac8432a3c6c6d8ece27d6067770Andre Eisenbach#include "btu.h"
35bf0e4b26d8f0748ff4f9522a2ac7001bfb9ca5ccWei Wang#include "bt_target.h"
36ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
37ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#if (BLE_INCLUDED == TRUE)
38ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
394161eb610dc8152fad833aa1f187a9af52fd7c0dMarie Janssen#include <hardware/bluetooth.h>
40ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include <hardware/bt_gatt.h>
4149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
42ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "bta_gatt_api.h"
4349a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_common.h"
448f247258317bfd015806badce0cc41df901fa6e7Marie Janssen#include "btif_gatt_multi_adv_util.h"
45ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#include "btif_gatt_util.h"
46ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
4778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
4878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
49ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji/*******************************************************************************
50ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji**  Static variables
51ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji********************************************************************************/
52b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Callojistatic int user_app_count = 0;
53ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojistatic btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
54ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
55ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojibtgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
56ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
57cafed88eb2caeaece08da1110625f4567a16ddd1Satya Calloji    int max_adv_inst = BTM_BleMaxMultiAdvInstanceCount();
58cafed88eb2caeaece08da1110625f4567a16ddd1Satya Calloji    if (0 == max_adv_inst)
59cafed88eb2caeaece08da1110625f4567a16ddd1Satya Calloji        max_adv_inst = 1;
6016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
61cafed88eb2caeaece08da1110625f4567a16ddd1Satya Calloji    BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, max_adv_inst);
62b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Calloji
6316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_com_data_cb)
6416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    {
655fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_multi_adv_com_data_cb = osi_calloc(sizeof(btgatt_multi_adv_common_data));
665fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        /* Storing both client_if and inst_id details */
675fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_multi_adv_com_data_cb->clntif_map =
685fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            osi_calloc((max_adv_inst * INST_ID_IDX_MAX) * sizeof(INT8));
695fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
705fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_multi_adv_com_data_cb->inst_cb =
715fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            osi_calloc((max_adv_inst + 1) * sizeof(btgatt_multi_adv_inst_cb));
725fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
735fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        for (int i = 0; i < max_adv_inst * 2; i += 2) {
745fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_multi_adv_com_data_cb->clntif_map[i] = INVALID_ADV_INST;
755fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            p_multi_adv_com_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
7616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        }
7716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    }
7816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
79ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return p_multi_adv_com_data_cb;
80ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
81ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
82b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Callojivoid btif_gattc_incr_app_count(void)
83ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
849dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    // TODO: Instead of using a fragile reference counter here, one could
859dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    //       simply track the client_if instances that are in the map.
86b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Calloji    ++user_app_count;
87ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
88ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
89b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Callojivoid btif_gattc_decr_app_count(void)
90ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
91b407515ffa145b1a2cab01467da03c92aeb0e8ebSatya Calloji    if (user_app_count > 0)
9220524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov        user_app_count--;
9316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
9420524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov    if ((user_app_count == 0) && (p_multi_adv_com_data_cb != NULL)) {
95abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov       osi_free(p_multi_adv_com_data_cb->clntif_map);
96abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov       osi_free(p_multi_adv_com_data_cb->inst_cb);
97abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov       osi_free_and_reset((void **)&p_multi_adv_com_data_cb);
98ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
99ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
100ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
101ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojiint btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
102ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
10316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    int i=1;
104ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
105ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
10616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb)
107ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
108ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
10916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
110ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
11116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
112ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       {
11316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham          if (!gen_temp_instid)
114ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          {
115ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             // Write the final inst_id value obtained from stack layer
11616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham             p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
117e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati             BTIF_TRACE_DEBUG("%s -Index: %d, Found client_if: %d", __FUNCTION__,
11816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                i, p_multi_adv_data_cb->clntif_map[i + i]);
119ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             break;
120ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          }
121ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          else
122ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          {
123ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              //Store the passed in inst_id value
12416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham             if (inst_id != INVALID_ADV_INST)
12516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
126ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             else
12716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
12816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham
129e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati             BTIF_TRACE_DEBUG("%s - Index:%d,Found client_if: %d", __FUNCTION__,
13016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                i, p_multi_adv_data_cb->clntif_map[i + i]);
131ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             break;
132ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji          }
133ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       }
134ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
135ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
13616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (i <  BTM_BleMaxMultiAdvInstanceCount())
137ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return i;
138ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
139ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // If client ID if is not found, then write both values
14016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
141ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
14216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        if (INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i + i])
143ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
14416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            p_multi_adv_data_cb->clntif_map[i + i] = client_if;
14516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            if (inst_id != INVALID_ADV_INST)
14616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham               p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
14716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            else
14816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
14916fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
150ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                            __FUNCTION__,i,
15116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                            p_multi_adv_data_cb->clntif_map[i + i],
15216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham                            p_multi_adv_data_cb->clntif_map[i + (i + 1)]);
15316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham            break;
154ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
155ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
156ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
15716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (i <  BTM_BleMaxMultiAdvInstanceCount())
158ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return i;
159ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return INVALID_ADV_INST;
160ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
161ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
162ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojiint btif_multi_adv_instid_for_clientif(int client_if)
163ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
16416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    int i=1, ret = INVALID_ADV_INST;
165ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
166ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
167ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
16816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb)
169ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
170ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
171ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Retrieve the existing inst_id for the client_if value
17216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
173ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
17416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
17516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       {
17616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham           BTIF_TRACE_DEBUG("%s - Client if found", __FUNCTION__, client_if);
17716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham           ret = p_multi_adv_data_cb->clntif_map[i + (i + 1)];
17816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       }
179ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
180ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
18116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    return ret;
182ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
183ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
18416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadhamint btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index)
185ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
18616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    int i=1;
187ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
188ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
189ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
19016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb)
191ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return INVALID_ADV_INST;
192ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
193ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Retrieve the array index for the inst_id value
19416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
195ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
19616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham       if (value == p_multi_adv_data_cb->clntif_map[i + (i + clnt_inst_index)])
197ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji           break;
198ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
199ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
20016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (i <  BTM_BleMaxMultiAdvInstanceCount())
201ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
20216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i);
20316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham        return i;
204ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
205ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
206e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s Invalid instance",__FUNCTION__);
207ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    return INVALID_ADV_INST;
208ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
209ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
210ffb3960bb05f9acb0717d213612403487e9ad433Satya Callojivoid btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
211ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                bool include_name, bool include_txpower, int min_interval, int max_interval,
2129dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach                int appearance, int manufacturer_len, char* manufacturer_data,
2139dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach                int service_data_len, char* service_data, int service_uuid_len,
214ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                char* service_uuid, btif_adv_data_t *p_multi_adv_inst)
215ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
216ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    memset(p_multi_adv_inst, 0 , sizeof(btif_adv_data_t));
217ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
218ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->client_if = (uint8_t) client_if;
219ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->set_scan_rsp = set_scan_rsp;
220ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->include_name = include_name;
221ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->include_txpower = include_txpower;
222ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->min_interval = min_interval;
223ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->max_interval = max_interval;
224ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->appearance = appearance;
225ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->manufacturer_len = manufacturer_len;
226ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
22716fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (manufacturer_len > 0)
228ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
229abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        p_multi_adv_inst->p_manufacturer_data = osi_malloc(manufacturer_len);
230ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
231ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
232ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
233ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->service_data_len = service_data_len;
23416fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (service_data_len > 0)
235ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
236abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        p_multi_adv_inst->p_service_data = osi_malloc(service_data_len);
237ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
238ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
239ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
240ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    p_multi_adv_inst->service_uuid_len = service_uuid_len;
24116fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (service_uuid_len > 0)
242ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
243abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        p_multi_adv_inst->p_service_uuid = osi_malloc(service_uuid_len);
244ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
245ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
246ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
247ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
24820524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavovvoid btif_gattc_adv_data_cleanup(btif_adv_data_t* adv)
249ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
250abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free_and_reset((void **)&adv->p_service_data);
251abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free_and_reset((void **)&adv->p_service_uuid);
252abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free_and_reset((void **)&adv->p_manufacturer_data);
253484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge}
254484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge
255484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan CoolidgeBOOLEAN btif_gattc_copy_datacb(int cbindex, const btif_adv_data_t *p_adv_data,
256484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge                               BOOLEAN bInstData) {
257ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
25816fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb || cbindex < 0)
259ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji       return false;
260ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
261d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    BTIF_TRACE_DEBUG("%s", __func__);
262d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge
263d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    memset(&p_multi_adv_data_cb->inst_cb[cbindex].data, 0,
264d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge           sizeof(p_multi_adv_data_cb->inst_cb[cbindex].data));
2657ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
266ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
267ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (!p_adv_data->set_scan_rsp)
268ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
269ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji         p_multi_adv_data_cb->inst_cb[cbindex].mask = BTM_BLE_AD_BIT_FLAGS;
2709dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach         p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_GENERAL;
2719dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach         if (p_multi_adv_data_cb->inst_cb[cbindex].timeout_s)
2729dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach             p_multi_adv_data_cb->inst_cb[cbindex].data.flag = ADV_FLAGS_LIMITED;
273962f1d1f9dc22d939bea4e9fb34a67028ff185fdAndre Eisenbach         if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_type == BTA_BLE_NON_CONNECT_EVT)
274962f1d1f9dc22d939bea4e9fb34a67028ff185fdAndre Eisenbach             p_multi_adv_data_cb->inst_cb[cbindex].data.flag &=
275962f1d1f9dc22d939bea4e9fb34a67028ff185fdAndre Eisenbach                    ~(BTA_DM_LIMITED_DISC | BTA_DM_GENERAL_DISC);
276962f1d1f9dc22d939bea4e9fb34a67028ff185fdAndre Eisenbach         if (p_multi_adv_data_cb->inst_cb[cbindex].data.flag == 0)
277962f1d1f9dc22d939bea4e9fb34a67028ff185fdAndre Eisenbach            p_multi_adv_data_cb->inst_cb[cbindex].mask = 0;
278ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
279ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
280ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->include_name)
281ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_DEV_NAME;
282ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
283ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->include_txpower)
284ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_TX_PWR;
285ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
286ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (false == bInstData && p_adv_data->min_interval > 0 && p_adv_data->max_interval > 0 &&
287ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_adv_data->max_interval > p_adv_data->min_interval)
288ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
289ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_INT_RANGE;
290ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
291ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                        p_adv_data->min_interval;
292ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
293ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                                        p_adv_data->max_interval;
294ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
295ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    else
29616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (true == bInstData)
297ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
298ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
299ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
300ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max >
301ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min)
302ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
303ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.low =
304ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min;
305ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].data.int_range.hi =
306ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji              p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max;
307ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
308ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
309ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        if (p_adv_data->include_txpower)
310ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        {
311ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji            p_multi_adv_data_cb->inst_cb[cbindex].data.tx_power =
312ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji                p_multi_adv_data_cb->inst_cb[cbindex].param.tx_power;
313ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        }
314ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
315ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
316ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    if (p_adv_data->appearance != 0)
317ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
318ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_APPEARANCE;
319ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        p_multi_adv_data_cb->inst_cb[cbindex].data.appearance = p_adv_data->appearance;
320ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
321ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
322d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    if (p_adv_data->manufacturer_len > 0 &&
323d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge        p_adv_data->p_manufacturer_data != NULL &&
324d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge        p_adv_data->manufacturer_len < MAX_SIZE_MANUFACTURER_DATA)
325ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
326d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_MANU;
327d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_multi_adv_data_cb->inst_cb[cbindex].data.manu.len =
328d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge          p_adv_data->manufacturer_len;
329d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].data.manu.val,
330d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge             p_adv_data->p_manufacturer_data, p_adv_data->manufacturer_len);
3317ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    }
332ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
333d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    if (p_adv_data->service_data_len > 0 &&
334d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge        p_adv_data->p_service_data != NULL &&
335d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge        p_adv_data->service_data_len < MAX_SIZE_PROPRIETARY_ELEMENT)
3367ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    {
337d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      BTIF_TRACE_DEBUG("%s - In service_data", __func__);
338d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      tBTA_BLE_PROPRIETARY *p_prop = &p_multi_adv_data_cb->inst_cb[cbindex].data.proprietary;
339d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_prop->num_elem = 1;
340ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
341d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      tBTA_BLE_PROP_ELEM *p_elem = &p_prop->elem[0];
342d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_elem->adv_type = BTM_BLE_AD_TYPE_SERVICE_DATA;
343d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_elem->len = p_adv_data->service_data_len;
344d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      memcpy(p_elem->val, p_adv_data->p_service_data,
345d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge             p_adv_data->service_data_len);
346d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge
347d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge      p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_PROPRIETARY;
3487ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    }
349ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
350484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge    if (p_adv_data->service_uuid_len && p_adv_data->p_service_uuid)
3517ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    {
3527ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji        UINT16 *p_uuid_out16 = NULL;
3537ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji        UINT32 *p_uuid_out32 = NULL;
354484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge        for (int position = 0; position < p_adv_data->service_uuid_len; position += LEN_UUID_128)
3557ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji        {
3567ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji             bt_uuid_t uuid;
357484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge             memset(&uuid, 0, sizeof(uuid));
358484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge             memcpy(&uuid.uu, p_adv_data->p_service_uuid + position, LEN_UUID_128);
3597ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
3607ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji             tBT_UUID bt_uuid;
361484dc303627eb82e7c5edf4f03e542fec2d3f4eaIan Coolidge             memset(&bt_uuid, 0, sizeof(bt_uuid));
3627ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji             btif_to_bta_uuid(&bt_uuid, &uuid);
3637ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
3647ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji             switch(bt_uuid.len)
365ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             {
3667ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                case (LEN_UUID_16):
3677ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                {
368d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                  if (p_multi_adv_data_cb->inst_cb[cbindex].data.services.num_service == 0)
3697ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                  {
370d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      p_multi_adv_data_cb->inst_cb[cbindex].data.services.list_cmpl = FALSE;
371d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      p_uuid_out16 = p_multi_adv_data_cb->inst_cb[cbindex].data.services.uuid;
3727ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                  }
3737ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
374d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                  if (p_multi_adv_data_cb->inst_cb[cbindex].data.services.num_service < MAX_16BIT_SERVICES)
3757ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                  {
376d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     BTIF_TRACE_DEBUG("%s - In 16-UUID_data", __func__);
3777ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                     p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE;
378d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     ++p_multi_adv_data_cb->inst_cb[cbindex].data.services.num_service;
3797ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                     *p_uuid_out16++ = bt_uuid.uu.uuid16;
3807ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                  }
3817ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                  break;
3827ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                }
3837ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
3847ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                case (LEN_UUID_32):
3857ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                {
386d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                   if (p_multi_adv_data_cb->inst_cb[cbindex].data.service_32b.num_service == 0)
3877ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   {
388d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      p_multi_adv_data_cb->inst_cb[cbindex].data.service_32b.list_cmpl = FALSE;
389d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      p_uuid_out32 = p_multi_adv_data_cb->inst_cb[cbindex].data.service_32b.uuid;
3907ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   }
3917ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
392d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                   if (p_multi_adv_data_cb->inst_cb[cbindex].data.service_32b.num_service < MAX_32BIT_SERVICES)
3937ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   {
394d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      BTIF_TRACE_DEBUG("%s - In 32-UUID_data", __func__);
3957ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                      p_multi_adv_data_cb->inst_cb[cbindex].mask |= BTM_BLE_AD_BIT_SERVICE_32;
396d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                      ++p_multi_adv_data_cb->inst_cb[cbindex].data.service_32b.num_service;
3977ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                      *p_uuid_out32++ = bt_uuid.uu.uuid32;
3987ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   }
3997ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   break;
4007ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                }
4017ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
4027ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                case (LEN_UUID_128):
4037ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                {
4047ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   /* Currently, only one 128-bit UUID is supported */
405d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                   if (p_multi_adv_data_cb->inst_cb[cbindex].data.services_128b.num_service == 0)
4067ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   {
407d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     BTIF_TRACE_DEBUG("%s - In 128-UUID_data", __FUNCTION__);
408d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     p_multi_adv_data_cb->inst_cb[cbindex].mask |=
409d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         BTM_BLE_AD_BIT_SERVICE_128;
410d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     memcpy(p_multi_adv_data_cb->inst_cb[cbindex]
411d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                                .data.services_128b.uuid128,
412d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                            bt_uuid.uu.uuid128, LEN_UUID_128);
413d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     BTIF_TRACE_DEBUG(
414d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         "%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x",
415d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[0], bt_uuid.uu.uuid128[1],
416d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[2], bt_uuid.uu.uuid128[3],
417d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[4], bt_uuid.uu.uuid128[5],
418d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[6], bt_uuid.uu.uuid128[7],
419d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[8], bt_uuid.uu.uuid128[9],
420d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[10], bt_uuid.uu.uuid128[11],
421d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[12], bt_uuid.uu.uuid128[13],
422d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         bt_uuid.uu.uuid128[14], bt_uuid.uu.uuid128[15]);
423d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     ++p_multi_adv_data_cb->inst_cb[cbindex]
424d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                           .data.services_128b.num_service;
425d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                     p_multi_adv_data_cb->inst_cb[cbindex]
426d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge                         .data.services_128b.list_cmpl = TRUE;
4277ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   }
4287ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                   break;
4297ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                }
4307ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji
4317ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                default:
4327ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji                     break;
433ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji             }
4347ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji        }
4357ddf2d88501a2dd17045fb2f126ec99dcac9b5d9Satya Calloji    }
436ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
437ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji     return true;
438ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
439ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
4403770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Callojivoid btif_gattc_clear_clientif(int client_if, BOOLEAN stop_timer)
441ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
442ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
44316fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb)
444ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
445ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
446ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Clear both the inst_id and client_if values
447169cd7a221a79474d36e5c1697e862c1d640c064Andre Eisenbach    for (int i=0; i < BTM_BleMaxMultiAdvInstanceCount()*2; i+=2)
448ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    {
4499dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        if (client_if == p_multi_adv_data_cb->clntif_map[i])
4509dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        {
4513770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji            btif_gattc_cleanup_inst_cb(p_multi_adv_data_cb->clntif_map[i+1], stop_timer);
4523770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji            if (stop_timer)
4533770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji            {
4543770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji                p_multi_adv_data_cb->clntif_map[i] = INVALID_ADV_INST;
4553770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji                p_multi_adv_data_cb->clntif_map[i+1] = INVALID_ADV_INST;
4563770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji                BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i/2, client_if);
4573770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji            }
4589dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach            break;
4599dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        }
460ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    }
461ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
462ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
4633770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Callojivoid btif_gattc_cleanup_inst_cb(int inst_id, BOOLEAN stop_timer)
464ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
465ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    // Check for invalid instance id
46616fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
467ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
468ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
469ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
47016fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham    if (NULL == p_multi_adv_data_cb)
471ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji        return;
472ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
4733770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    int cbindex = (STD_ADV_INSTID == inst_id) ?
4743770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji        STD_ADV_INSTID : btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
4753770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    if (cbindex < 0) return;
476ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
477d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    BTIF_TRACE_DEBUG("%s: inst_id %d, cbindex %d", __func__, inst_id, cbindex);
4783770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex], stop_timer);
479ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji}
480ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji
4813770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Callojivoid btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb,
4823770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji                                             BOOLEAN stop_timer)
483ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji{
484cf32e8d4e0cabac8432a3c6c6d8ece27d6067770Andre Eisenbach    if (p_multi_inst_cb == NULL)
485cf32e8d4e0cabac8432a3c6c6d8ece27d6067770Andre Eisenbach        return;
486cf32e8d4e0cabac8432a3c6c6d8ece27d6067770Andre Eisenbach
4879dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    // Discoverability timer cleanup
4883770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    if (stop_timer)
4893770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    {
49078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_free(p_multi_inst_cb->multi_adv_timer);
49178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        p_multi_inst_cb->multi_adv_timer = NULL;
4923770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji    }
4939dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach
494d4c103624b3d7672110abeb753ed79113ee48989Ian Coolidge    memset(&p_multi_inst_cb->data, 0, sizeof(p_multi_inst_cb->data));
4953770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji}
4963770c47387d3dfc6d2e2d32f4409a82119e726e3Satya Calloji
49778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btif_multi_adv_timer_ctrl(int client_if, alarm_callback_t cb)
4989dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach{
4999dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    int inst_id = btif_multi_adv_instid_for_clientif(client_if);
5009dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    if (inst_id == INVALID_ADV_INST)
5019dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        return;
5029dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach
5039dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    int cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
5049dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    if (cbindex == INVALID_ADV_INST)
5059dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        return;
5069dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach
5079dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
5089dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    if (p_multi_adv_data_cb == NULL)
5099dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        return;
5109dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach
51178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btgatt_multi_adv_inst_cb *inst_cb = &p_multi_adv_data_cb->inst_cb[cbindex];
5129dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    if (cb == NULL)
5139dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    {
51478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_free(inst_cb->multi_adv_timer);
51578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        inst_cb->multi_adv_timer = NULL;
5169dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    } else {
51778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        if (inst_cb->timeout_s != 0)
5189dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        {
51978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_free(inst_cb->multi_adv_timer);
52078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            inst_cb->multi_adv_timer = alarm_new("btif_gatt.multi_adv_timer");
52178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(inst_cb->multi_adv_timer,
52278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               inst_cb->timeout_s * 1000,
52378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               cb, INT_TO_PTR(client_if),
52478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
5259dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach        }
5269dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach    }
5279dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach}
5289dd5a9c11f2022fa9709f0c34f04560c21105152Andre Eisenbach
529ffb3960bb05f9acb0717d213612403487e9ad433Satya Calloji#endif
530