btif_gatt_util.c revision ead3cde4bac0c3e32cd31f149093f004eef8ceeb
1f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/****************************************************************************** 2f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * 3f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * Copyright (C) 2009-2013 Broadcom Corporation 4f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * 5f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * Licensed under the Apache License, Version 2.0 (the "License"); 6f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * you may not use this file except in compliance with the License. 7f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * You may obtain a copy of the License at: 8f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * 9f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * http://www.apache.org/licenses/LICENSE-2.0 10f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * 11f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * Unless required by applicable law or agreed to in writing, software 12f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * distributed under the License is distributed on an "AS IS" BASIS, 13f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * See the License for the specific language governing permissions and 15f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * limitations under the License. 16f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * 17f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ******************************************************************************/ 18f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 19f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 20f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <hardware/bluetooth.h> 21f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <hardware/bt_gatt.h> 22f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <stdio.h> 23f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <stdlib.h> 24f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <errno.h> 25f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include <string.h> 26f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 27f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define LOG_TAG "BtGatt.btif" 28f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 29f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "bta_api.h" 30f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "bta_gatt_api.h" 31f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "bd.h" 32f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_storage.h" 33f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 34f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_common.h" 35f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_dm.h" 36f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_util.h" 37f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_gatt.h" 38f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#include "btif_gatt_util.h" 39f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 40f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define GATTC_READ_VALUE_TYPE_VALUE 0x0000 /* Attribute value itself */ 41f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define GATTC_READ_VALUE_TYPE_AGG_FORMAT 0x2905 /* Characteristic Aggregate Format*/ 42f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 43f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek#define BTIF_GATT_MAX_ENC_LINK_RECORDS 10 44f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 4576c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquentypedef struct 46f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 47f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek BD_ADDR bd_addr; 48f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek BOOLEAN in_use; 49f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek}__attribute__((packed)) btif_gatt_encrypted_link_t; 50f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 51f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekstatic char BASE_UUID[16] = { 52ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 53ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 54ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen}; 55ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 56f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekstatic btif_gatt_encrypted_link_t encrypted_links[BTIF_GATT_MAX_ENC_LINK_RECORDS]; 5776c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen 5876c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquenint uuidType(unsigned char* p_uuid) 5976c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen{ 6076c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen int i = 0; 6176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen int match = 0; 6276c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen int all_zero = 1; 6376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen 6476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen for(i = 0; i != 16; ++i) 65f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek { 66f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (i == 12 || i == 13) 67f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek continue; 687a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 69f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (p_uuid[i] == BASE_UUID[i]) 707a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen ++match; 7176c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen 727a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen if (p_uuid[i] != 0) 737a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen all_zero = 0; 747a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen } 757a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen if (all_zero) 76f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return 0; 77f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (match == 12) 78f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return LEN_UUID_32; 79f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (match == 14) 80f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return LEN_UUID_16; 81f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return LEN_UUID_128; 82f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 83f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 84f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/******************************************************************************* 85ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen * BTIF -> BTA conversion functions 86ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen *******************************************************************************/ 87ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 88f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid btif_to_bta_uuid(tBT_UUID *p_dest, bt_uuid_t *p_src) 89f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 90f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek char *p_byte = (char*)p_src; 91cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen int i = 0; 92cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 93cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->len = uuidType(p_src->uu); 94cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 95cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen switch (p_dest->len) 96cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen { 97f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek case LEN_UUID_16: 98f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->uu.uuid16 = (p_src->uu[13] << 8) + p_src->uu[12]; 99cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen break; 100cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 101cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen case LEN_UUID_32: 102ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->uu.uuid32 = (p_src->uu[13] << 8) + p_src->uu[12]; 103ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->uu.uuid32 += (p_src->uu[15] << 24) + (p_src->uu[14] << 16); 104ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen break; 105ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 106cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen case LEN_UUID_128: 107e3c63fce12a7a949106f04f251528c27bd81445bDmitri Gribenko for(i = 0; i != 16; ++i) 108e3c63fce12a7a949106f04f251528c27bd81445bDmitri Gribenko p_dest->uu.uuid128[i] = p_byte[i]; 109e3c63fce12a7a949106f04f251528c27bd81445bDmitri Gribenko break; 110f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 111f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek default: 112f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ALOGE("%s: Unknown UUID length %d!", __FUNCTION__, p_dest->len); 113f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek break; 114ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen } 115ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 116f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 117f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid btif_to_bta_char_id(tBTA_GATT_ID *p_dest, btgatt_char_id_t *p_src) 118f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 119f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->inst_id = p_src->inst_id; 120f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek btif_to_bta_uuid(&p_dest->uuid, &p_src->uuid); 121f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 122f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 123f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid btif_to_bta_srvc_id(tBTA_GATT_SRVC_ID *p_dest, btgatt_srvc_id_t *p_src) 124f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 125cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->id.inst_id = p_src->id.inst_id; 126cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen btif_to_bta_uuid(&p_dest->id.uuid, &p_src->id.uuid); 127cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->is_primary = p_src->is_primary; 128cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen} 129cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 130cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquenvoid btif_to_bta_response(tBTA_GATTS_RSP *p_dest, btgatt_response_t* p_src) 131cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen{ 132cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->attr_value.auth_req = p_src->attr_value.auth_req; 133cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->attr_value.handle = p_src->attr_value.handle; 134ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->attr_value.len = p_src->attr_value.len; 135ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->attr_value.offset = p_src->attr_value.offset; 136ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen memcpy(p_dest->attr_value.value, p_src->attr_value.value, GATT_MAX_ATTR_LEN); 137ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 138cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 139cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen/******************************************************************************* 140cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen * BTA -> BTIF conversion functions 141cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen *******************************************************************************/ 142ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 143ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquenvoid bta_to_btif_uuid(bt_uuid_t *p_dest, tBT_UUID *p_src) 144cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen{ 145cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen int i = 0; 146cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 147cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen if (p_src->len == LEN_UUID_16 || p_src->len == LEN_UUID_32) 148cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen { 149cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen for(i=0; i != 16; ++i) 150cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_dest->uu[i] = BASE_UUID[i]; 151f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 152f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 153f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek switch (p_src->len) 154f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek { 155f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek case 0: 156f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek break; 157ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 158f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek case LEN_UUID_16: 159f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->uu[12] = p_src->uu.uuid16 & 0xff; 160f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->uu[13] = (p_src->uu.uuid16 >> 8) & 0xff; 161f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek break; 162f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 16376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen case LEN_UUID_32: 16476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen p_dest->uu[12] = p_src->uu.uuid16 & 0xff; 165ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->uu[13] = (p_src->uu.uuid16 >> 8) & 0xff; 166f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->uu[14] = (p_src->uu.uuid32 >> 16) & 0xff; 167f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->uu[15] = (p_src->uu.uuid32 >> 24) & 0xff; 168ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen break; 169ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 170ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen case LEN_UUID_128: 171ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen for(i=0; i != 16; ++i) 172ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->uu[i] = p_src->uu.uuid128[i]; 173ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen break; 174ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 175ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen default: 176ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen ALOGE("%s: Unknown UUID length %d!", __FUNCTION__, p_src->len); 177ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen break; 178ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen } 179ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 180ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 181ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 182ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquenvoid bta_to_btif_char_id(btgatt_char_id_t *p_dest, tBTA_GATT_ID *p_src) 183ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen{ 184ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->inst_id = p_src->inst_id; 185ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen bta_to_btif_uuid(&p_dest->uuid, &p_src->uuid); 186ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 187ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 188ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquenvoid bta_to_btif_srvc_id(btgatt_srvc_id_t *p_dest, tBTA_GATT_SRVC_ID *p_src) 189ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen{ 190ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->id.inst_id = p_src->id.inst_id; 191ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen bta_to_btif_uuid(&p_dest->id.uuid, &p_src->id.uuid); 192ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->is_primary = p_src->is_primary; 193ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 194ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 195ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 196ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen/******************************************************************************* 197ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen * Utility functions 198ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen *******************************************************************************/ 199ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 200f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekuint16_t get_uuid16(tBT_UUID *p_uuid) 201f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 202ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen if (p_uuid->len == LEN_UUID_16) 203ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen { 204ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen return p_uuid->uu.uuid16; 205ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen } 206ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen else if (p_uuid->len == LEN_UUID_128) 207f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek { 208ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen UINT16 u16; 209f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek UINT8 *p = &p_uuid->uu.uuid128[LEN_UUID_128 - 4]; 210f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek STREAM_TO_UINT16(u16, p); 211f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return u16; 2127a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen } 213ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen else /* p_uuid->len == LEN_UUID_32 */ 214ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen { 215ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen return(UINT16) p_uuid->uu.uuid32; 216ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen } 217ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen} 218f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 219f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekuint16_t set_read_value(btgatt_read_params_t *p_dest, tBTA_GATTC_READ *p_src) 220ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen{ 221ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen int i = 0; 222f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek uint16_t descr_type = 0; 223f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek uint16_t len = 0; 2247a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 2257a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen p_dest->status = p_src->status; 226ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen bta_to_btif_srvc_id(&p_dest->srvc_id, &p_src->srvc_id); 227ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen bta_to_btif_char_id(&p_dest->char_id, &p_src->char_id); 228ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen bta_to_btif_uuid(&p_dest->descr_id, &p_src->descr_type); 229ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 230ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen descr_type = get_uuid16(&p_src->descr_type); 2317a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 2327a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen switch (descr_type) 2337a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen { 234ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen case GATT_UUID_CHAR_AGG_FORMAT: 235ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen /* not supported */ 236ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_dest->value_type = GATTC_READ_VALUE_TYPE_AGG_FORMAT; 2377a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen break; 2387a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 239cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen default: 240cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen if ( p_src->status == BTA_GATT_OK ) 241cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen { 242f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek ALOGI("%s unformat.len = %d ", __FUNCTION__, p_src->p_value->unformat.len); 243f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek p_dest->value.len = p_src->p_value->unformat.len; 244ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen if ( p_src->p_value->unformat.len > 0 && p_src->p_value->unformat.p_value != NULL ) 245ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen { 246ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen memcpy(p_dest->value.value, p_src->p_value->unformat.p_value, 247ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen p_src->p_value->unformat.len); 248f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 249cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen len += p_src->p_value->unformat.len; 250cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen } 251cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen else 252cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen { 25376c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen p_dest->value.len = 0; 25476c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen } 25576c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen 25676c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen p_dest->value_type = GATTC_READ_VALUE_TYPE_VALUE; 25776c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen break; 25876c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen } 259cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 260cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen return len; 261f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 26276c2f92c4b4ab7e02857661a05e53ba4b501d87aSamuel Benzaquen 263f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek/******************************************************************************* 264f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek * Encrypted link map handling 265ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen *******************************************************************************/ 266cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 267cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquenstatic void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result); 268ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen 269cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquenstatic BOOLEAN btif_gatt_is_link_encrypted (BD_ADDR bd_addr) 270f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 271cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen btif_gatt_encrypted_link_t *p_link = &encrypted_links[0]; 272cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen int i; 273cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 274cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen if (bd_addr == NULL) 275cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen return FALSE; 276cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen 277f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek for (i = 0; i != BTIF_GATT_MAX_ENC_LINK_RECORDS; ++i, ++p_link) 278f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek { 279cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen if (p_link->in_use && (!memcmp(p_link->bd_addr, bd_addr, BD_ADDR_LEN))) 280f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return TRUE; 281f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 282f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return FALSE; 283f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 284f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 285cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquenstatic BOOLEAN btif_gatt_add_encrypted_link (BD_ADDR bd_addr) 286cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen{ 287f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek btif_gatt_encrypted_link_t *p_link = &encrypted_links[0]; 288f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek int i; 289f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 290f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (bd_addr == NULL) 291f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return FALSE; 292f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 293cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen if (btif_gatt_is_link_encrypted(bd_addr)) 294cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen return TRUE; 295f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 296f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek for (i = 0; i != BTIF_GATT_MAX_ENC_LINK_RECORDS; ++i, ++p_link) 2977a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen { 2987a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen if (!p_link->in_use) 2997a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen { 3007a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen p_link->in_use = TRUE; 3017a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen memcpy( p_link->bd_addr, bd_addr, sizeof(BD_ADDR) ); 302cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen return TRUE; 303cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen } 3047a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen } 3057a337af9e8bc752a2d3b227e4058ed2baf7a19d1Samuel Benzaquen 306ef7eb024397a6a9d1455b31bc7b10288a817ac3bSamuel Benzaquen return FALSE; 307f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 308f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 309f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekvoid btif_gatt_remove_encrypted_link (BD_ADDR bd_addr) 310f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 311cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen btif_gatt_encrypted_link_t *p_link = &encrypted_links[0]; 312cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen int i; 313f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 314f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (bd_addr == NULL) 315f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek return; 316f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 317f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek for (i = 0; i != BTIF_GATT_MAX_ENC_LINK_RECORDS; ++i, ++p_link) 318f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek { 319f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (p_link->in_use && (!memcmp (p_link->bd_addr, bd_addr, BD_ADDR_LEN))) 320cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen { 321cf69590039a186e80b165619c8ac1aef599301b3Samuel Benzaquen p_link->in_use = FALSE; 322f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek break; 323f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 324f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek } 325f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek} 326f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek 327f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimekstatic void btif_gatt_set_encryption_cb (BD_ADDR bd_addr, tBTA_STATUS result) 328f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek{ 329f7f295f321fd434e1e542844a71f538a56f2f8fbManuel Klimek if (result == BTA_SUCCESS) 330 { 331 btif_gatt_add_encrypted_link(bd_addr); 332 } else { 333 btif_gatt_remove_encrypted_link(bd_addr); 334 } 335} 336 337void btif_gatt_check_encrypted_link (BD_ADDR bd_addr) 338{ 339 char buf[100]; 340 341 bt_bdaddr_t bda; 342 bdcpy(bda.address, bd_addr); 343 344 if ((btif_storage_get_ble_bonding_key(&bda, BTIF_DM_LE_KEY_PENC, 345 buf, sizeof(btif_dm_ble_penc_keys_t)) == BT_STATUS_SUCCESS) 346 && !btif_gatt_is_link_encrypted(bd_addr)) 347 { 348 BTA_DmSetEncryption(bd_addr, 349 &btif_gatt_set_encryption_cb, BTM_BLE_SEC_ENCRYPT); 350 } 351}