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