• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright 2009-2013 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 #define LOG_TAG "bt_btif_gatt"
20 
21 #include "btif_gatt.h"
22 
23 #include <errno.h>
24 #include <hardware/bluetooth.h>
25 #include <hardware/bt_gatt.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 
30 #include "bta_gatt_api.h"
31 #include "bte_appl.h"
32 #include "btif_common.h"
33 #include "btif_dm.h"
34 #include "btif_gatt_util.h"
35 #include "btif_storage.h"
36 #include "btif_util.h"
37 #include "gatt_api.h"
38 #include "osi/include/log.h"
39 #include "osi/include/osi.h"
40 #include "types/bluetooth/uuid.h"
41 #include "types/raw_address.h"
42 
43 using bluetooth::Uuid;
44 /*******************************************************************************
45  * Typedefs & Macros
46  ******************************************************************************/
47 
48 typedef struct {
49   tGATT_IF gatt_if;
50   uint16_t conn_id;
51 } btif_test_cb_t;
52 
53 /*******************************************************************************
54  * Static variables
55  ******************************************************************************/
56 
57 static const char* disc_name[GATT_DISC_MAX] = {"Unknown",
58                                                "GATT_DISC_SRVC_ALL",
59                                                "GATT_DISC_SRVC_BY_UUID",
60                                                "GATT_DISC_INC_SRVC",
61                                                "GATT_DISC_CHAR",
62                                                "GATT_DISC_CHAR_DSCPT"};
63 
64 static btif_test_cb_t test_cb;
65 
66 /*******************************************************************************
67  * Callback functions
68  ******************************************************************************/
69 
btif_test_connect_cback(tGATT_IF,const RawAddress &,uint16_t conn_id,bool connected,tGATT_DISCONN_REASON,tBT_TRANSPORT)70 static void btif_test_connect_cback(tGATT_IF, const RawAddress&,
71                                     uint16_t conn_id, bool connected,
72                                     tGATT_DISCONN_REASON, tBT_TRANSPORT) {
73   LOG_INFO("%s: conn_id=%d, connected=%d", __func__, conn_id, connected);
74   test_cb.conn_id = connected ? conn_id : 0;
75 }
76 
btif_test_command_complete_cback(uint16_t conn_id,tGATTC_OPTYPE op,tGATT_STATUS status,tGATT_CL_COMPLETE * p_data)77 static void btif_test_command_complete_cback(uint16_t conn_id, tGATTC_OPTYPE op,
78                                              tGATT_STATUS status,
79                                              tGATT_CL_COMPLETE* p_data) {
80   LOG_INFO("%s: op_code=0x%02x, conn_id=0x%x. status=0x%x", __func__, op,
81            conn_id, status);
82 
83   switch (op) {
84     case GATTC_OPTYPE_READ:
85     case GATTC_OPTYPE_WRITE:
86     case GATTC_OPTYPE_CONFIG:
87     case GATTC_OPTYPE_EXE_WRITE:
88     case GATTC_OPTYPE_NOTIFICATION:
89       break;
90 
91     case GATTC_OPTYPE_INDICATION:
92       GATTC_SendHandleValueConfirm(conn_id, p_data->cid);
93       break;
94 
95     default:
96       LOG_INFO("%s: Unknown op_code (0x%02x)", __func__, op);
97       break;
98   }
99 }
100 
btif_test_discovery_result_cback(UNUSED_ATTR uint16_t conn_id,tGATT_DISC_TYPE disc_type,tGATT_DISC_RES * p_data)101 static void btif_test_discovery_result_cback(UNUSED_ATTR uint16_t conn_id,
102                                              tGATT_DISC_TYPE disc_type,
103                                              tGATT_DISC_RES* p_data) {
104   LOG_INFO("------ GATT Discovery result %-22s -------", disc_name[disc_type]);
105   LOG_INFO("      Attribute handle: 0x%04x (%d)", p_data->handle,
106            p_data->handle);
107 
108   if (disc_type != GATT_DISC_CHAR_DSCPT) {
109     LOG_INFO("        Attribute type: %s", p_data->type.ToString().c_str());
110   }
111 
112   switch (disc_type) {
113     case GATT_DISC_SRVC_ALL:
114       LOG_INFO("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
115                p_data->handle, p_data->value.group_value.e_handle,
116                p_data->handle, p_data->value.group_value.e_handle);
117       LOG_INFO("          Service UUID: %s",
118                p_data->value.group_value.service_type.ToString().c_str());
119       break;
120 
121     case GATT_DISC_SRVC_BY_UUID:
122       LOG_INFO("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
123                p_data->handle, p_data->value.handle, p_data->handle,
124                p_data->value.handle);
125       break;
126 
127     case GATT_DISC_INC_SRVC:
128       LOG_INFO("          Handle range: 0x%04x ~ 0x%04x (%d ~ %d)",
129                p_data->value.incl_service.s_handle,
130                p_data->value.incl_service.e_handle,
131                p_data->value.incl_service.s_handle,
132                p_data->value.incl_service.e_handle);
133       LOG_INFO("          Service UUID: %s",
134                p_data->value.incl_service.service_type.ToString().c_str());
135       break;
136 
137     case GATT_DISC_CHAR:
138       LOG_INFO("            Properties: 0x%02x",
139                p_data->value.dclr_value.char_prop);
140       LOG_INFO("   Characteristic UUID: %s",
141                p_data->value.dclr_value.char_uuid.ToString().c_str());
142       break;
143 
144     case GATT_DISC_CHAR_DSCPT:
145       LOG_INFO("       Descriptor UUID: %s", p_data->type.ToString().c_str());
146       break;
147     case GATT_DISC_MAX:
148       LOG_ERROR("      Unknown discovery item");
149       break;
150   }
151 
152   LOG_INFO("-----------------------------------------------------------");
153 }
154 
btif_test_discovery_complete_cback(UNUSED_ATTR uint16_t conn_id,UNUSED_ATTR tGATT_DISC_TYPE disc_type,tGATT_STATUS status)155 static void btif_test_discovery_complete_cback(
156     UNUSED_ATTR uint16_t conn_id, UNUSED_ATTR tGATT_DISC_TYPE disc_type,
157     tGATT_STATUS status) {
158   LOG_INFO("%s: status=%d", __func__, status);
159 }
160 
161 static tGATT_CBACK btif_test_callbacks = {btif_test_connect_cback,
162                                           btif_test_command_complete_cback,
163                                           btif_test_discovery_result_cback,
164                                           btif_test_discovery_complete_cback,
165                                           NULL,
166                                           NULL,
167                                           NULL,
168                                           NULL,
169                                           NULL};
170 
171 /*******************************************************************************
172  * Implementation
173  ******************************************************************************/
174 
btif_gattc_test_command_impl(int command,const btgatt_test_params_t * params)175 bt_status_t btif_gattc_test_command_impl(int command,
176                                          const btgatt_test_params_t* params) {
177   switch (command) {
178     case 0x01: /* Enable */
179     {
180       LOG_INFO("%s: ENABLE - enable=%d", __func__, params->u1);
181       if (params->u1) {
182         std::array<uint8_t, Uuid::kNumBytes128> tmp;
183         tmp.fill(0xAE);
184         test_cb.gatt_if =
185             GATT_Register(bluetooth::Uuid::From128BitBE(tmp),
186                           std::string("GattTest"), &btif_test_callbacks, false);
187         GATT_StartIf(test_cb.gatt_if);
188       } else {
189         GATT_Deregister(test_cb.gatt_if);
190         test_cb.gatt_if = 0;
191       }
192       break;
193     }
194 
195     case 0x02: /* Connect */
196     {
197       LOG_INFO("%s: CONNECT - device=%s (dev_type=%d, addr_type=%d)", __func__,
198                params->bda1->ToString().c_str(), params->u1, params->u2);
199 
200       if (params->u1 == BT_DEVICE_TYPE_BLE)
201         BTM_SecAddBleDevice(*params->bda1, BT_DEVICE_TYPE_BLE,
202                             static_cast<tBLE_ADDR_TYPE>(params->u2));
203 
204       if (!GATT_Connect(test_cb.gatt_if, *params->bda1,
205                         BTM_BLE_DIRECT_CONNECTION, BT_TRANSPORT_LE, false)) {
206         LOG_ERROR("%s: GATT_Connect failed!", __func__);
207       }
208       break;
209     }
210 
211     case 0x03: /* Disconnect */
212     {
213       LOG_INFO("%s: DISCONNECT - conn_id=%d", __func__, test_cb.conn_id);
214       GATT_Disconnect(test_cb.conn_id);
215       break;
216     }
217 
218     case 0x04: /* Discover */
219     {
220       if (params->u1 >= GATT_DISC_MAX) {
221         LOG_ERROR("%s: DISCOVER - Invalid type (%d)!", __func__, params->u1);
222         return (bt_status_t)0;
223       }
224 
225       LOG_INFO("%s: DISCOVER (%s), conn_id=%d, uuid=%s, handles=0x%04x-0x%04x",
226                __func__, disc_name[params->u1], test_cb.conn_id,
227                params->uuid1->ToString().c_str(), params->u2, params->u3);
228       GATTC_Discover(test_cb.conn_id, static_cast<tGATT_DISC_TYPE>(params->u1),
229                      params->u2, params->u3, *params->uuid1);
230       break;
231     }
232 
233     case 0xF0: /* Pairing configuration */
234       LOG_INFO("%s: Setting pairing config auth=%d, iocaps=%d, keys=%d/%d/%d",
235                __func__, params->u1, params->u2, params->u3, params->u4,
236                params->u5);
237 
238       bte_appl_cfg.ble_auth_req = params->u1;
239       bte_appl_cfg.ble_io_cap = params->u2;
240       bte_appl_cfg.ble_init_key = params->u3;
241       bte_appl_cfg.ble_resp_key = params->u4;
242       bte_appl_cfg.ble_max_key_size = params->u5;
243       break;
244 
245     default:
246       LOG_ERROR("%s: UNKNOWN TEST COMMAND 0x%02x", __func__, command);
247       break;
248   }
249   return (bt_status_t)0;
250 }
251