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}