1ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/****************************************************************************** 2ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 3ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Copyright (C) 2009-2013 Broadcom Corporation 4ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 5ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License"); 6ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * you may not use this file except in compliance with the License. 7ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * You may obtain a copy of the License at: 8ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 9ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * http://www.apache.org/licenses/LICENSE-2.0 10ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 11ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software 12ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS, 13ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * See the License for the specific language governing permissions and 15ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * limitations under the License. 16ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 17ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ******************************************************************************/ 18ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 19ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <hardware/bluetooth.h> 20ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <hardware/bt_gatt.h> 21ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdio.h> 22ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdlib.h> 23ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <errno.h> 24ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <string.h> 25ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 26ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define LOG_TAG "BtGatt.btif" 27ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 28ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bta_api.h" 29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bta_gatt_api.h" 30ace8d679f68cfab4c022d00afc7e5daafc74a4fdAndre Eisenbach#include "bta_jv_api.h" 31ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bd.h" 32ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_storage.h" 3386f97eda524568f2d264186844450db5e56dac36Matthew Xie#include "btif_config.h" 34ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_common.h" 36ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_dm.h" 37ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_util.h" 38ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt.h" 39ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt_util.h" 40ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 41fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#if BTA_GATT_INCLUDED == TRUE 42fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie 43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define GATTC_READ_VALUE_TYPE_VALUE 0x0000 /* Attribute value itself */ 44ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define GATTC_READ_VALUE_TYPE_AGG_FORMAT 0x2905 /* Characteristic Aggregate Format*/ 45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 46f5726daa6c720685cbc0e5250a2a5ee6b4860210lpoulainstatic unsigned char BASE_UUID[16] = { 47ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 48ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 49ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}; 50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaint uuidType(unsigned char* p_uuid) 52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int i = 0; 54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int match = 0; 55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int all_zero = 1; 56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(i = 0; i != 16; ++i) 58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 59ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (i == 12 || i == 13) 60ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta continue; 61ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 62ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_uuid[i] == BASE_UUID[i]) 63ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ++match; 64ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 65ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_uuid[i] != 0) 66ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta all_zero = 0; 67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (all_zero) 69ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return 0; 70ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (match == 12) 71ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return LEN_UUID_32; 72ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (match == 14) 73ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return LEN_UUID_16; 74ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return LEN_UUID_128; 75ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 76ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 77ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 78ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * BTIF -> BTA conversion functions 79ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/ 80ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 81ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btif_to_bta_uuid(tBT_UUID *p_dest, bt_uuid_t *p_src) 82ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 83ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta char *p_byte = (char*)p_src; 84ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int i = 0; 85ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 86ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->len = uuidType(p_src->uu); 87ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (p_dest->len) 89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 90ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_16: 91ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu.uuid16 = (p_src->uu[13] << 8) + p_src->uu[12]; 92ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 93ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_32: 95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu.uuid32 = (p_src->uu[13] << 8) + p_src->uu[12]; 96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu.uuid32 += (p_src->uu[15] << 24) + (p_src->uu[14] << 16); 97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 99ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_128: 100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(i = 0; i != 16; ++i) 101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu.uuid128[i] = p_byte[i]; 102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ALOGE("%s: Unknown UUID length %d!", __FUNCTION__, p_dest->len); 106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1105f9c140d094ebf4a269cdc6ae083900bf25f7faeAndre Eisenbachvoid btif_to_bta_gatt_id(tBTA_GATT_ID *p_dest, btgatt_gatt_id_t *p_src) 111ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->inst_id = p_src->inst_id; 113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btif_to_bta_uuid(&p_dest->uuid, &p_src->uuid); 114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btif_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, btgatt_srvc_id_t *p_src) 117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->id.inst_id = p_src->id.inst_id; 119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btif_to_bta_uuid(&p_dest->id.uuid, &p_src->id.uuid); 120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->is_primary = p_src->is_primary; 121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btif_to_bta_response(tBTA_GATTS_RSP *p_dest, btgatt_response_t* p_src) 124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->attr_value.auth_req = p_src->attr_value.auth_req; 126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->attr_value.handle = p_src->attr_value.handle; 127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->attr_value.len = p_src->attr_value.len; 128ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->attr_value.offset = p_src->attr_value.offset; 129ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_dest->attr_value.value, p_src->attr_value.value, GATT_MAX_ATTR_LEN); 130ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 131ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 132b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbachvoid btif_to_bta_uuid_mask(tBTA_DM_BLE_PF_COND_MASK *p_mask, bt_uuid_t *p_src) 133b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach{ 134b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach char *p_byte = (char*)p_src; 135b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach int i = 0; 136b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 137b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach switch (uuidType(p_src->uu)) 138b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach { 139b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach case LEN_UUID_16: 140b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach p_mask->uuid16_mask = (p_src->uu[13] << 8) + p_src->uu[12]; 141b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach break; 142b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 143b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach case LEN_UUID_32: 144b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach p_mask->uuid32_mask = (p_src->uu[13] << 8) + p_src->uu[12]; 145b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach p_mask->uuid32_mask += (p_src->uu[15] << 24) + (p_src->uu[14] << 16); 146b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach break; 147b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 148b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach case LEN_UUID_128: 149b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach for(i = 0; i != 16; ++i) 150b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach p_mask->uuid128_mask[i] = p_byte[i]; 151b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach break; 152b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 153b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach default: 154b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach break; 155b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach } 156b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach} 157b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach 158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 159ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * BTA -> BTIF conversion functions 160ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/ 161ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 162ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_to_btif_uuid(bt_uuid_t *p_dest, tBT_UUID *p_src) 163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int i = 0; 165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_src->len == LEN_UUID_16 || p_src->len == LEN_UUID_32) 167ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 168ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(i=0; i != 16; ++i) 169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[i] = BASE_UUID[i]; 170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (p_src->len) 173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case 0: 175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_16: 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[12] = p_src->uu.uuid16 & 0xff; 179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[13] = (p_src->uu.uuid16 >> 8) & 0xff; 180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 181ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_32: 183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[12] = p_src->uu.uuid16 & 0xff; 184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[13] = (p_src->uu.uuid16 >> 8) & 0xff; 185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[14] = (p_src->uu.uuid32 >> 16) & 0xff; 186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[15] = (p_src->uu.uuid32 >> 24) & 0xff; 187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case LEN_UUID_128: 190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for(i=0; i != 16; ++i) 191ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->uu[i] = p_src->uu.uuid128[i]; 192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ALOGE("%s: Unknown UUID length %d!", __FUNCTION__, p_src->len); 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2015f9c140d094ebf4a269cdc6ae083900bf25f7faeAndre Eisenbachvoid bta_to_btif_gatt_id(btgatt_gatt_id_t *p_dest, tBTA_GATT_ID *p_src) 202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->inst_id = p_src->inst_id; 204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_to_btif_uuid(&p_dest->uuid, &p_src->uuid); 205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid bta_to_btif_srvc_id(btgatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src) 208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 209ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->id.inst_id = p_src->id.inst_id; 210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_to_btif_uuid(&p_dest->id.uuid, &p_src->id.uuid); 211ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->is_primary = p_src->is_primary; 212ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 213ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 214ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 215ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 216ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Utility functions 217ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/ 218ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 219ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battauint16_t get_uuid16(tBT_UUID *p_uuid) 220ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_uuid->len == LEN_UUID_16) 222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return p_uuid->uu.uuid16; 224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (p_uuid->len == LEN_UUID_128) 226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 u16; 228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 *p = &p_uuid->uu.uuid128[LEN_UUID_128 - 4]; 229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta STREAM_TO_UINT16(u16, p); 230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return u16; 231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else /* p_uuid->len == LEN_UUID_32 */ 233ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return(UINT16) p_uuid->uu.uuid32; 235ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battauint16_t set_read_value(btgatt_read_params_t *p_dest, tBTA_GATTC_READ *p_src) 239ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int i = 0; 241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta uint16_t descr_type = 0; 242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta uint16_t len = 0; 243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->status = p_src->status; 245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_to_btif_srvc_id(&p_dest->srvc_id, &p_src->srvc_id); 2465f9c140d094ebf4a269cdc6ae083900bf25f7faeAndre Eisenbach bta_to_btif_gatt_id(&p_dest->char_id, &p_src->char_id); 2475f9c140d094ebf4a269cdc6ae083900bf25f7faeAndre Eisenbach bta_to_btif_gatt_id(&p_dest->descr_id, &p_src->descr_type); 248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2496975b4d711142b885af479721cada448952c6b41Andre Eisenbach descr_type = get_uuid16(&p_src->descr_type.uuid); 250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta switch (descr_type) 252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta case GATT_UUID_CHAR_AGG_FORMAT: 254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* not supported */ 255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->value_type = GATTC_READ_VALUE_TYPE_AGG_FORMAT; 256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta default: 259e4020c28c8a9dc56f927b03a8ca3a17d9401bc1eAndre Eisenbach if (( p_src->status == BTA_GATT_OK ) &&(p_src->p_value != NULL)) 260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ALOGI("%s unformat.len = %d ", __FUNCTION__, p_src->p_value->unformat.len); 262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->value.len = p_src->p_value->unformat.len; 263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( p_src->p_value->unformat.len > 0 && p_src->p_value->unformat.p_value != NULL ) 264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 265ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(p_dest->value.value, p_src->p_value->unformat.p_value, 266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_src->p_value->unformat.len); 267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta len += p_src->p_value->unformat.len; 269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 271ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 272ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->value.len = 0; 273ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 274ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_dest->value_type = GATTC_READ_VALUE_TYPE_VALUE; 276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return len; 280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Encrypted link map handling 284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/ 285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result); 287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btif_gatt_is_link_encrypted (BD_ADDR bd_addr) 289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bd_addr == NULL) 291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return FALSE; 292ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 293ace8d679f68cfab4c022d00afc7e5daafc74a4fdAndre Eisenbach return BTA_JvIsEncrypted(bd_addr); 294ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 295ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 2967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battastatic void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_STATUS result) 297ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 2985e808468e0667a6a2a8a1e6de80efbc4f42fa0f0Andre Eisenbach UNUSED(bd_addr); 2997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UNUSED(transport); 3007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 301fc3fba5db90f29b072ebecc231245c8f134b594bZhihai Xu if (result != BTA_SUCCESS && result != BTA_BUSY) 302ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3035e808468e0667a6a2a8a1e6de80efbc4f42fa0f0Andre Eisenbach BTIF_TRACE_WARNING("%s() - Encryption failed (%d)", __FUNCTION__, result); 304ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 305ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 306ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 307ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btif_gatt_check_encrypted_link (BD_ADDR bd_addr) 308ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 309ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta char buf[100]; 310ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 311ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bt_bdaddr_t bda; 312ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bdcpy(bda.address, bd_addr); 3137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta int device_type = 0; 314ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 3157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (!defined(BLE_DELAY_REQUEST_ENC) || (BLE_DELAY_REQUEST_ENC == FALSE)) 316ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((btif_storage_get_ble_bonding_key(&bda, BTIF_DM_LE_KEY_PENC, 317ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta buf, sizeof(btif_dm_ble_penc_keys_t)) == BT_STATUS_SUCCESS) 318ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta && !btif_gatt_is_link_encrypted(bd_addr)) 319ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 3207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; 3217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 32286f97eda524568f2d264186844450db5e56dac36Matthew Xie btif_get_device_type(bd_addr, &device_type); 3237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta switch(device_type) 3247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 3257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta case BT_DEVICE_TYPE_BREDR: 3267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BTA_GATT_TRANSPORT_BR_EDR; 3277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta break; 3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta case BT_DEVICE_TYPE_BLE: 3307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BTA_GATT_TRANSPORT_LE; 3317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta break; 3327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta case BT_DEVICE_TYPE_DUMO: 3347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta transport = BTA_GATT_TRANSPORT_LE_BR_EDR; 3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta break; 3367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 3377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta default: 338e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR (" GATT Encrypt :Invalid device type %d",device_type); 3397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return; 3407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 3417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta BTA_DmSetEncryption(bd_addr,transport, 342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta &btif_gatt_set_encryption_cb, BTM_BLE_SEC_ENCRYPT); 343ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 3447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 345ca22ac493ab777199084d87b3c7627e7f27555afAndre Eisenbach} 346fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie 347fc4b2f1953dbe60464d0f5ef7daaa10001fbc62fMatthew Xie#endif 348