1 /****************************************************************************** 2 * 3 * Copyright (C) 2009-2014 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 /******************************************************************************* 20 * 21 * Filename: btif_gatt_client.c 22 * 23 * Description: GATT client implementation 24 * 25 *******************************************************************************/ 26 27 #define LOG_TAG "bt_btif_gattc" 28 29 #include <errno.h> 30 #include <hardware/bluetooth.h> 31 #include <stdio.h> 32 #include <stdlib.h> 33 #include <string.h> 34 #include "device/include/controller.h" 35 36 37 #include "btcore/include/bdaddr.h" 38 #include "btif_common.h" 39 #include "btif_util.h" 40 41 #if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) 42 43 #include <hardware/bt_gatt.h> 44 45 #include "bta_api.h" 46 #include "bta_gatt_api.h" 47 #include "btif_config.h" 48 #include "btif_dm.h" 49 #include "btif_gatt.h" 50 #include "btif_gatt_multi_adv_util.h" 51 #include "btif_gatt_util.h" 52 #include "btif_storage.h" 53 #include "btif_storage.h" 54 #include "osi/include/log.h" 55 #include "vendor_api.h" 56 57 /******************************************************************************* 58 ** Constants & Macros 59 ********************************************************************************/ 60 61 #define CHECK_BTGATT_INIT() if (bt_gatt_callbacks == NULL)\ 62 {\ 63 LOG_WARN(LOG_TAG, "%s: BTGATT not initialized", __FUNCTION__);\ 64 return BT_STATUS_NOT_READY;\ 65 } else {\ 66 LOG_VERBOSE(LOG_TAG, "%s", __FUNCTION__);\ 67 } 68 69 #define BLE_RESOLVE_ADDR_MSB 0x40 /* bit7, bit6 is 01 to be resolvable random */ 70 #define BLE_RESOLVE_ADDR_MASK 0xc0 /* bit 6, and bit7 */ 71 #define BTM_BLE_IS_RESOLVE_BDA(x) ((x[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB) 72 73 typedef enum { 74 BTIF_GATTC_REGISTER_APP = 1000, 75 BTIF_GATTC_UNREGISTER_APP, 76 BTIF_GATTC_SCAN_START, 77 BTIF_GATTC_SCAN_STOP, 78 BTIF_GATTC_OPEN, 79 BTIF_GATTC_CLOSE, 80 BTIF_GATTC_SEARCH_SERVICE, 81 BTIF_GATTC_READ_CHAR, 82 BTIF_GATTC_READ_CHAR_DESCR, 83 BTIF_GATTC_WRITE_CHAR, 84 BTIF_GATTC_WRITE_CHAR_DESCR, 85 BTIF_GATTC_EXECUTE_WRITE, 86 BTIF_GATTC_REG_FOR_NOTIFICATION, 87 BTIF_GATTC_DEREG_FOR_NOTIFICATION, 88 BTIF_GATTC_REFRESH, 89 BTIF_GATTC_READ_RSSI, 90 BTIF_GATTC_LISTEN, 91 BTIF_GATTC_SET_ADV_DATA, 92 BTIF_GATTC_CONFIGURE_MTU, 93 BTIF_GATTC_CONN_PARAM_UPDT, 94 BTIF_GATTC_SCAN_FILTER_PARAM_SETUP, 95 BTIF_GATTC_SCAN_FILTER_CONFIG, 96 BTIF_GATTC_SCAN_FILTER_CLEAR, 97 BTIF_GATTC_SCAN_FILTER_ENABLE, 98 BTIF_GATTC_SET_SCAN_PARAMS, 99 BTIF_GATTC_ADV_INSTANCE_ENABLE, 100 BTIF_GATTC_ADV_INSTANCE_UPDATE, 101 BTIF_GATTC_ADV_INSTANCE_SET_DATA, 102 BTIF_GATTC_ADV_INSTANCE_DISABLE, 103 BTIF_GATTC_CONFIG_STORAGE_PARAMS, 104 BTIF_GATTC_ENABLE_BATCH_SCAN, 105 BTIF_GATTC_READ_BATCH_SCAN_REPORTS, 106 BTIF_GATTC_DISABLE_BATCH_SCAN, 107 BTIF_GATTC_GET_GATT_DB 108 } btif_gattc_event_t; 109 110 #define BTIF_GATT_MAX_OBSERVED_DEV 40 111 112 #define BTIF_GATT_OBSERVE_EVT 0x1000 113 #define BTIF_GATTC_RSSI_EVT 0x1001 114 #define BTIF_GATTC_SCAN_FILTER_EVT 0x1003 115 #define BTIF_GATTC_SCAN_PARAM_EVT 0x1004 116 117 #define ENABLE_BATCH_SCAN 1 118 #define DISABLE_BATCH_SCAN 0 119 120 /******************************************************************************* 121 ** Local type definitions 122 ********************************************************************************/ 123 typedef struct 124 { 125 uint8_t report_format; 126 uint16_t data_len; 127 uint8_t num_records; 128 uint8_t *p_rep_data; 129 } btgatt_batch_reports; 130 131 typedef struct 132 { 133 uint8_t status; 134 uint8_t client_if; 135 uint8_t action; 136 uint8_t avbl_space; 137 uint8_t lost_timeout; 138 tBLE_ADDR_TYPE addr_type; 139 uint8_t batch_scan_full_max; 140 uint8_t batch_scan_trunc_max; 141 uint8_t batch_scan_notify_threshold; 142 tBTA_BLE_BATCH_SCAN_MODE scan_mode; 143 uint32_t scan_interval; 144 uint32_t scan_window; 145 tBTA_BLE_DISCARD_RULE discard_rule; 146 btgatt_batch_reports read_reports; 147 } btgatt_batch_track_cb_t; 148 149 typedef tBTA_DM_BLE_PF_FILT_PARAMS btgatt_adv_filt_param_t; 150 151 typedef struct 152 { 153 uint8_t client_if; 154 uint8_t action; 155 tBTA_DM_BLE_PF_COND_TYPE filt_type; 156 bt_bdaddr_t bd_addr; 157 uint8_t value[BTGATT_MAX_ATTR_LEN]; 158 uint8_t value_len; 159 uint8_t filt_index; 160 uint16_t conn_id; 161 uint16_t company_id_mask; 162 bt_uuid_t uuid; 163 bt_uuid_t uuid_mask; 164 uint8_t value_mask[BTGATT_MAX_ATTR_LEN]; 165 uint8_t value_mask_len; 166 uint8_t has_mask; 167 uint8_t addr_type; 168 uint8_t status; 169 tBTA_DM_BLE_PF_AVBL_SPACE avbl_space; 170 tBTA_DM_BLE_SCAN_COND_OP cond_op; 171 btgatt_adv_filt_param_t adv_filt_param; 172 } btgatt_adv_filter_cb_t; 173 174 typedef struct 175 { 176 uint8_t value[BTGATT_MAX_ATTR_LEN]; 177 uint8_t inst_id; 178 bt_bdaddr_t bd_addr; 179 btgatt_srvc_id_t srvc_id; 180 btgatt_srvc_id_t incl_srvc_id; 181 btgatt_gatt_id_t char_id; 182 btgatt_gatt_id_t descr_id; 183 uint16_t handle; 184 bt_uuid_t uuid; 185 bt_uuid_t uuid_mask; 186 uint16_t conn_id; 187 uint16_t len; 188 uint16_t mask; 189 uint32_t scan_interval; 190 uint32_t scan_window; 191 uint8_t client_if; 192 uint8_t action; 193 uint8_t is_direct; 194 uint8_t search_all; 195 uint8_t auth_req; 196 uint8_t write_type; 197 uint8_t status; 198 uint8_t addr_type; 199 uint8_t start; 200 uint8_t has_mask; 201 int8_t rssi; 202 uint8_t flag; 203 tBT_DEVICE_TYPE device_type; 204 btgatt_transport_t transport; 205 } __attribute__((packed)) btif_gattc_cb_t; 206 207 typedef struct 208 { 209 bt_bdaddr_t bd_addr; 210 uint16_t min_interval; 211 uint16_t max_interval; 212 uint16_t timeout; 213 uint16_t latency; 214 } btif_conn_param_cb_t; 215 216 typedef struct 217 { 218 bt_bdaddr_t bd_addr; 219 BOOLEAN in_use; 220 }__attribute__((packed)) btif_gattc_dev_t; 221 222 typedef struct 223 { 224 btif_gattc_dev_t remote_dev[BTIF_GATT_MAX_OBSERVED_DEV]; 225 uint8_t addr_type; 226 uint8_t next_storage_idx; 227 }__attribute__((packed)) btif_gattc_dev_cb_t; 228 229 /******************************************************************************* 230 ** Static variables 231 ********************************************************************************/ 232 233 extern const btgatt_callbacks_t *bt_gatt_callbacks; 234 static btif_gattc_dev_cb_t btif_gattc_dev_cb; 235 static btif_gattc_dev_cb_t *p_dev_cb = &btif_gattc_dev_cb; 236 static uint8_t rssi_request_client_if; 237 238 /******************************************************************************* 239 ** Static functions 240 ********************************************************************************/ 241 242 static bt_status_t btif_gattc_multi_adv_disable(int client_if); 243 static void btif_multi_adv_stop_cb(void *data) 244 { 245 int client_if = PTR_TO_INT(data); 246 btif_gattc_multi_adv_disable(client_if); // Does context switch 247 } 248 249 static btgattc_error_t btif_gattc_translate_btm_status(tBTM_STATUS status) 250 { 251 switch(status) 252 { 253 case BTM_SUCCESS: 254 case BTM_SUCCESS_NO_SECURITY: 255 return BT_GATTC_COMMAND_SUCCESS; 256 257 case BTM_CMD_STARTED: 258 return BT_GATTC_COMMAND_STARTED; 259 260 case BTM_BUSY: 261 return BT_GATTC_COMMAND_BUSY; 262 263 case BTM_CMD_STORED: 264 return BT_GATTC_COMMAND_STORED; 265 266 case BTM_NO_RESOURCES: 267 return BT_GATTC_NO_RESOURCES; 268 269 case BTM_MODE_UNSUPPORTED: 270 case BTM_WRONG_MODE: 271 case BTM_MODE4_LEVEL4_NOT_SUPPORTED: 272 return BT_GATTC_MODE_UNSUPPORTED; 273 274 case BTM_ILLEGAL_VALUE: 275 case BTM_SCO_BAD_LENGTH: 276 return BT_GATTC_ILLEGAL_VALUE; 277 278 case BTM_UNKNOWN_ADDR: 279 return BT_GATTC_UNKNOWN_ADDR; 280 281 case BTM_DEVICE_TIMEOUT: 282 return BT_GATTC_DEVICE_TIMEOUT; 283 284 case BTM_FAILED_ON_SECURITY: 285 case BTM_REPEATED_ATTEMPTS: 286 case BTM_NOT_AUTHORIZED: 287 return BT_GATTC_SECURITY_ERROR; 288 289 case BTM_DEV_RESET: 290 case BTM_ILLEGAL_ACTION: 291 return BT_GATTC_INCORRECT_STATE; 292 293 case BTM_BAD_VALUE_RET: 294 return BT_GATTC_INVALID_CONTROLLER_OUTPUT; 295 296 case BTM_DELAY_CHECK: 297 return BT_GATTC_DELAYED_ENCRYPTION_CHECK; 298 299 case BTM_ERR_PROCESSING: 300 default: 301 return BT_GATTC_ERR_PROCESSING; 302 } 303 } 304 305 static void btapp_gattc_req_data(UINT16 event, char *p_dest, char *p_src) 306 { 307 tBTA_GATTC *p_dest_data = (tBTA_GATTC*) p_dest; 308 tBTA_GATTC *p_src_data = (tBTA_GATTC*) p_src; 309 310 if (!p_src_data || !p_dest_data) 311 return; 312 313 // Copy basic structure first 314 maybe_non_aligned_memcpy(p_dest_data, p_src_data, sizeof(*p_src_data)); 315 316 // Allocate buffer for request data if necessary 317 switch (event) 318 { 319 case BTA_GATTC_READ_CHAR_EVT: 320 case BTA_GATTC_READ_DESCR_EVT: 321 322 if (p_src_data->read.p_value != NULL) 323 { 324 p_dest_data->read.p_value = osi_malloc(sizeof(tBTA_GATT_UNFMT)); 325 326 memcpy(p_dest_data->read.p_value, p_src_data->read.p_value, 327 sizeof(tBTA_GATT_UNFMT)); 328 329 // Allocate buffer for att value if necessary 330 if (p_src_data->read.p_value->len > 0 && 331 p_src_data->read.p_value->p_value != NULL) { 332 p_dest_data->read.p_value->p_value = 333 osi_malloc(p_src_data->read.p_value->len); 334 memcpy(p_dest_data->read.p_value->p_value, 335 p_src_data->read.p_value->p_value, 336 p_src_data->read.p_value->len); 337 } 338 } else { 339 BTIF_TRACE_WARNING("%s :Src read.p_value ptr is NULL for event 0x%x", 340 __FUNCTION__, event); 341 p_dest_data->read.p_value = NULL; 342 343 } 344 break; 345 346 default: 347 break; 348 } 349 } 350 351 static void btapp_gattc_free_req_data(UINT16 event, tBTA_GATTC *p_data) 352 { 353 switch (event) 354 { 355 case BTA_GATTC_READ_CHAR_EVT: 356 case BTA_GATTC_READ_DESCR_EVT: 357 if (p_data != NULL && p_data->read.p_value != NULL) 358 { 359 if (p_data->read.p_value->len > 0) 360 osi_free_and_reset((void **)&p_data->read.p_value->p_value); 361 362 osi_free_and_reset((void **)&p_data->read.p_value); 363 } 364 break; 365 366 default: 367 break; 368 } 369 } 370 371 static void btif_gattc_init_dev_cb(void) 372 { 373 memset(p_dev_cb, 0, sizeof(btif_gattc_dev_cb_t)); 374 } 375 376 static void btif_gattc_add_remote_bdaddr (BD_ADDR p_bda, uint8_t addr_type) 377 { 378 uint8_t i; 379 for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++) 380 { 381 if (!p_dev_cb->remote_dev[i].in_use ) 382 { 383 memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN); 384 p_dev_cb->addr_type = addr_type; 385 p_dev_cb->remote_dev[i].in_use = TRUE; 386 LOG_VERBOSE(LOG_TAG, "%s device added idx=%d", __FUNCTION__, i ); 387 break; 388 } 389 } 390 391 if ( i == BTIF_GATT_MAX_OBSERVED_DEV) 392 { 393 i= p_dev_cb->next_storage_idx; 394 memcpy(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN); 395 p_dev_cb->addr_type = addr_type; 396 p_dev_cb->remote_dev[i].in_use = TRUE; 397 LOG_VERBOSE(LOG_TAG, "%s device overwrite idx=%d", __FUNCTION__, i ); 398 p_dev_cb->next_storage_idx++; 399 if (p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV) 400 p_dev_cb->next_storage_idx = 0; 401 } 402 } 403 404 static BOOLEAN btif_gattc_find_bdaddr (BD_ADDR p_bda) 405 { 406 uint8_t i; 407 for (i = 0; i < BTIF_GATT_MAX_OBSERVED_DEV; i++) 408 { 409 if (p_dev_cb->remote_dev[i].in_use && 410 !memcmp(p_dev_cb->remote_dev[i].bd_addr.address, p_bda, BD_ADDR_LEN)) 411 { 412 return TRUE; 413 } 414 } 415 return FALSE; 416 } 417 418 static void btif_gattc_update_properties ( btif_gattc_cb_t *p_btif_cb ) 419 { 420 uint8_t remote_name_len; 421 uint8_t *p_eir_remote_name=NULL; 422 bt_bdname_t bdname; 423 424 p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value, 425 BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len); 426 427 if (p_eir_remote_name == NULL) 428 { 429 p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value, 430 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len); 431 } 432 433 if (p_eir_remote_name) 434 { 435 memcpy(bdname.name, p_eir_remote_name, remote_name_len); 436 bdname.name[remote_name_len]='\0'; 437 438 LOG_VERBOSE(LOG_TAG, "%s BLE device name=%s len=%d dev_type=%d", __FUNCTION__, bdname.name, 439 remote_name_len, p_btif_cb->device_type ); 440 btif_dm_update_ble_remote_properties( p_btif_cb->bd_addr.address, bdname.name, 441 p_btif_cb->device_type); 442 } 443 } 444 445 static void btif_gattc_upstreams_evt(uint16_t event, char* p_param) 446 { 447 LOG_VERBOSE(LOG_TAG, "%s: Event %d", __FUNCTION__, event); 448 449 tBTA_GATTC *p_data = (tBTA_GATTC*) p_param; 450 switch (event) 451 { 452 case BTA_GATTC_REG_EVT: 453 { 454 bt_uuid_t app_uuid; 455 bta_to_btif_uuid(&app_uuid, &p_data->reg_oper.app_uuid); 456 HAL_CBACK(bt_gatt_callbacks, client->register_client_cb 457 , p_data->reg_oper.status 458 , p_data->reg_oper.client_if 459 , &app_uuid 460 ); 461 break; 462 } 463 464 case BTA_GATTC_DEREG_EVT: 465 break; 466 467 case BTA_GATTC_READ_CHAR_EVT: 468 { 469 btgatt_read_params_t data; 470 set_read_value(&data, &p_data->read); 471 472 HAL_CBACK(bt_gatt_callbacks, client->read_characteristic_cb 473 , p_data->read.conn_id, p_data->read.status, &data); 474 break; 475 } 476 477 case BTA_GATTC_WRITE_CHAR_EVT: 478 case BTA_GATTC_PREP_WRITE_EVT: 479 { 480 HAL_CBACK(bt_gatt_callbacks, client->write_characteristic_cb, 481 p_data->write.conn_id, p_data->write.status, p_data->write.handle); 482 break; 483 } 484 485 case BTA_GATTC_EXEC_EVT: 486 { 487 HAL_CBACK(bt_gatt_callbacks, client->execute_write_cb 488 , p_data->exec_cmpl.conn_id, p_data->exec_cmpl.status 489 ); 490 break; 491 } 492 493 case BTA_GATTC_SEARCH_CMPL_EVT: 494 { 495 HAL_CBACK(bt_gatt_callbacks, client->search_complete_cb 496 , p_data->search_cmpl.conn_id, p_data->search_cmpl.status); 497 break; 498 } 499 500 case BTA_GATTC_SEARCH_RES_EVT: 501 { 502 /* Do nothing */ 503 break; 504 } 505 506 case BTA_GATTC_READ_DESCR_EVT: 507 { 508 btgatt_read_params_t data; 509 set_read_value(&data, &p_data->read); 510 511 HAL_CBACK(bt_gatt_callbacks, client->read_descriptor_cb 512 , p_data->read.conn_id, p_data->read.status, &data); 513 break; 514 } 515 516 case BTA_GATTC_WRITE_DESCR_EVT: 517 { 518 HAL_CBACK(bt_gatt_callbacks, client->write_descriptor_cb, 519 p_data->write.conn_id, p_data->write.status, p_data->write.handle); 520 break; 521 } 522 523 case BTA_GATTC_NOTIF_EVT: 524 { 525 btgatt_notify_params_t data; 526 527 bdcpy(data.bda.address, p_data->notify.bda); 528 memcpy(data.value, p_data->notify.value, p_data->notify.len); 529 530 data.handle = p_data->notify.handle; 531 data.is_notify = p_data->notify.is_notify; 532 data.len = p_data->notify.len; 533 534 HAL_CBACK(bt_gatt_callbacks, client->notify_cb, p_data->notify.conn_id, &data); 535 536 if (p_data->notify.is_notify == FALSE) 537 BTA_GATTC_SendIndConfirm(p_data->notify.conn_id, p_data->notify.handle); 538 539 break; 540 } 541 542 case BTA_GATTC_OPEN_EVT: 543 { 544 bt_bdaddr_t bda; 545 bdcpy(bda.address, p_data->open.remote_bda); 546 547 HAL_CBACK(bt_gatt_callbacks, client->open_cb, p_data->open.conn_id 548 , p_data->open.status, p_data->open.client_if, &bda); 549 550 if (GATT_DEF_BLE_MTU_SIZE != p_data->open.mtu && p_data->open.mtu) 551 { 552 HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb, p_data->open.conn_id 553 , p_data->open.status , p_data->open.mtu); 554 } 555 556 if (p_data->open.status == BTA_GATT_OK) 557 btif_gatt_check_encrypted_link(p_data->open.remote_bda, p_data->open.transport); 558 break; 559 } 560 561 case BTA_GATTC_CLOSE_EVT: 562 { 563 bt_bdaddr_t bda; 564 bdcpy(bda.address, p_data->close.remote_bda); 565 HAL_CBACK(bt_gatt_callbacks, client->close_cb, p_data->close.conn_id 566 , p_data->status, p_data->close.client_if, &bda); 567 break; 568 } 569 570 case BTA_GATTC_ACL_EVT: 571 LOG_DEBUG(LOG_TAG, "BTA_GATTC_ACL_EVT: status = %d", p_data->status); 572 /* Ignore for now */ 573 break; 574 575 case BTA_GATTC_CANCEL_OPEN_EVT: 576 break; 577 578 case BTIF_GATT_OBSERVE_EVT: 579 { 580 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 581 uint8_t remote_name_len; 582 uint8_t *p_eir_remote_name=NULL; 583 bt_device_type_t dev_type; 584 bt_property_t properties; 585 586 p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value, 587 BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len); 588 589 if (p_eir_remote_name == NULL) 590 { 591 p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value, 592 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len); 593 } 594 595 if ((p_btif_cb->addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name)) 596 { 597 if (!btif_gattc_find_bdaddr(p_btif_cb->bd_addr.address)) 598 { 599 btif_gattc_add_remote_bdaddr(p_btif_cb->bd_addr.address, p_btif_cb->addr_type); 600 btif_gattc_update_properties(p_btif_cb); 601 } 602 } 603 604 dev_type = p_btif_cb->device_type; 605 BTIF_STORAGE_FILL_PROPERTY(&properties, 606 BT_PROPERTY_TYPE_OF_DEVICE, sizeof(dev_type), &dev_type); 607 btif_storage_set_remote_device_property(&(p_btif_cb->bd_addr), &properties); 608 609 btif_storage_set_remote_addr_type( &p_btif_cb->bd_addr, p_btif_cb->addr_type); 610 611 HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb, 612 &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value); 613 break; 614 } 615 616 case BTIF_GATTC_RSSI_EVT: 617 { 618 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 619 HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if, 620 &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status); 621 break; 622 } 623 624 case BTA_GATTC_LISTEN_EVT: 625 { 626 HAL_CBACK(bt_gatt_callbacks, client->listen_cb 627 , p_data->reg_oper.status 628 , p_data->reg_oper.client_if 629 ); 630 break; 631 } 632 633 case BTA_GATTC_CFG_MTU_EVT: 634 { 635 HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb, p_data->cfg_mtu.conn_id 636 , p_data->cfg_mtu.status , p_data->cfg_mtu.mtu); 637 break; 638 } 639 640 case BTA_GATTC_MULT_ADV_ENB_EVT: 641 { 642 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 643 if (0xFF != p_btif_cb->inst_id) 644 btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false); 645 HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb 646 , p_btif_cb->client_if 647 , p_btif_cb->status 648 ); 649 btif_multi_adv_timer_ctrl(p_btif_cb->client_if, 650 (p_btif_cb->status == BTA_GATT_OK) ? 651 btif_multi_adv_stop_cb : NULL); 652 break; 653 } 654 655 case BTA_GATTC_MULT_ADV_UPD_EVT: 656 { 657 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 658 HAL_CBACK(bt_gatt_callbacks, client->multi_adv_update_cb 659 , p_btif_cb->client_if 660 , p_btif_cb->status 661 ); 662 btif_multi_adv_timer_ctrl(p_btif_cb->client_if, 663 (p_btif_cb->status == BTA_GATT_OK) ? 664 btif_multi_adv_stop_cb : NULL); 665 break; 666 } 667 668 case BTA_GATTC_MULT_ADV_DATA_EVT: 669 { 670 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 671 btif_gattc_clear_clientif(p_btif_cb->client_if, FALSE); 672 HAL_CBACK(bt_gatt_callbacks, client->multi_adv_data_cb 673 , p_btif_cb->client_if 674 , p_btif_cb->status 675 ); 676 break; 677 } 678 679 case BTA_GATTC_MULT_ADV_DIS_EVT: 680 { 681 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param; 682 btif_gattc_clear_clientif(p_btif_cb->client_if, TRUE); 683 HAL_CBACK(bt_gatt_callbacks, client->multi_adv_disable_cb 684 , p_btif_cb->client_if 685 , p_btif_cb->status 686 ); 687 break; 688 } 689 690 case BTA_GATTC_ADV_DATA_EVT: 691 { 692 btif_gattc_cleanup_inst_cb(STD_ADV_INSTID, FALSE); 693 /* No HAL callback available */ 694 break; 695 } 696 697 case BTA_GATTC_CONGEST_EVT: 698 HAL_CBACK(bt_gatt_callbacks, client->congestion_cb 699 , p_data->congest.conn_id 700 , p_data->congest.congested 701 ); 702 break; 703 704 case BTA_GATTC_BTH_SCAN_CFG_EVT: 705 { 706 btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param; 707 HAL_CBACK(bt_gatt_callbacks, client->batchscan_cfg_storage_cb 708 , p_data->client_if 709 , p_data->status 710 ); 711 break; 712 } 713 714 case BTA_GATTC_BTH_SCAN_ENB_EVT: 715 { 716 btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param; 717 HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb 718 , ENABLE_BATCH_SCAN 719 , p_data->client_if 720 , p_data->status); 721 break; 722 } 723 724 case BTA_GATTC_BTH_SCAN_DIS_EVT: 725 { 726 btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param; 727 HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb 728 , DISABLE_BATCH_SCAN 729 , p_data->client_if 730 , p_data->status); 731 break; 732 } 733 734 case BTA_GATTC_BTH_SCAN_THR_EVT: 735 { 736 btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param; 737 HAL_CBACK(bt_gatt_callbacks, client->batchscan_threshold_cb 738 , p_data->client_if); 739 break; 740 } 741 742 case BTA_GATTC_BTH_SCAN_RD_EVT: 743 { 744 btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param; 745 uint8_t *p_rep_data = NULL; 746 747 if (p_data->read_reports.data_len > 0 && NULL != p_data->read_reports.p_rep_data) 748 { 749 p_rep_data = osi_malloc(p_data->read_reports.data_len); 750 memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len); 751 } 752 753 HAL_CBACK(bt_gatt_callbacks, client->batchscan_reports_cb 754 , p_data->client_if, p_data->status, p_data->read_reports.report_format 755 , p_data->read_reports.num_records, p_data->read_reports.data_len, p_rep_data); 756 osi_free(p_rep_data); 757 break; 758 } 759 760 case BTA_GATTC_SCAN_FLT_CFG_EVT: 761 { 762 btgatt_adv_filter_cb_t *p_btif_cb = (btgatt_adv_filter_cb_t*) p_param; 763 HAL_CBACK(bt_gatt_callbacks, client->scan_filter_cfg_cb, p_btif_cb->action, 764 p_btif_cb->client_if, p_btif_cb->status, p_btif_cb->cond_op, 765 p_btif_cb->avbl_space); 766 break; 767 } 768 769 case BTA_GATTC_SCAN_FLT_PARAM_EVT: 770 { 771 btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param; 772 BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_PARAM_EVT: %d, %d, %d, %d",p_data->client_if, 773 p_data->action, p_data->avbl_space, p_data->status); 774 HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb 775 , p_data->action, p_data->client_if, p_data->status 776 , p_data->avbl_space); 777 break; 778 } 779 780 case BTA_GATTC_SCAN_FLT_STATUS_EVT: 781 { 782 btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param; 783 BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_STATUS_EVT: %d, %d, %d",p_data->client_if, 784 p_data->action, p_data->status); 785 HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb 786 , p_data->action, p_data->client_if, p_data->status); 787 break; 788 } 789 790 case BTA_GATTC_ADV_VSC_EVT: 791 { 792 btgatt_track_adv_info_t *p_data = (btgatt_track_adv_info_t*)p_param; 793 btgatt_track_adv_info_t adv_info_data; 794 795 memset(&adv_info_data, 0, sizeof(btgatt_track_adv_info_t)); 796 797 btif_gatt_move_track_adv_data(&adv_info_data, p_data); 798 HAL_CBACK(bt_gatt_callbacks, client->track_adv_event_cb, &adv_info_data); 799 break; 800 } 801 802 case BTIF_GATTC_SCAN_PARAM_EVT: 803 { 804 btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t *)p_param; 805 HAL_CBACK(bt_gatt_callbacks, client->scan_parameter_setup_completed_cb, 806 p_btif_cb->client_if, btif_gattc_translate_btm_status(p_btif_cb->status)); 807 break; 808 } 809 810 default: 811 LOG_ERROR(LOG_TAG, "%s: Unhandled event (%d)!", __FUNCTION__, event); 812 break; 813 } 814 815 btapp_gattc_free_req_data(event, p_data); 816 } 817 818 static void bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data) 819 { 820 bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt, 821 (uint16_t) event, (void*) p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data); 822 ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status); 823 } 824 825 static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_id, 826 void *p_ref, tBTA_STATUS call_status) 827 { 828 btif_gattc_cb_t btif_cb; 829 tBTA_GATTC_EVT upevt; 830 uint8_t client_if = 0; 831 832 if (NULL == p_ref) 833 { 834 BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__); 835 } 836 else 837 { 838 client_if = *(UINT8 *) p_ref; 839 } 840 841 BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status, 842 client_if); 843 btif_cb.status = call_status; 844 btif_cb.client_if = client_if; 845 btif_cb.inst_id = inst_id; 846 847 switch(event) 848 { 849 case BTA_BLE_MULTI_ADV_ENB_EVT: 850 upevt = BTA_GATTC_MULT_ADV_ENB_EVT; 851 break; 852 853 case BTA_BLE_MULTI_ADV_DISABLE_EVT: 854 upevt = BTA_GATTC_MULT_ADV_DIS_EVT; 855 break; 856 857 case BTA_BLE_MULTI_ADV_PARAM_EVT: 858 upevt = BTA_GATTC_MULT_ADV_UPD_EVT; 859 break; 860 861 case BTA_BLE_MULTI_ADV_DATA_EVT: 862 upevt = BTA_GATTC_MULT_ADV_DATA_EVT; 863 break; 864 865 default: 866 return; 867 } 868 869 bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt, (uint16_t) upevt, 870 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 871 ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status); 872 } 873 874 static void bta_gattc_set_adv_data_cback(tBTA_STATUS call_status) 875 { 876 UNUSED(call_status); 877 btif_gattc_cb_t btif_cb; 878 btif_cb.status = call_status; 879 btif_cb.action = 0; 880 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_DATA_EVT, 881 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 882 } 883 884 static void bta_batch_scan_setup_cb (tBTA_BLE_BATCH_SCAN_EVT evt, 885 tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status) 886 { 887 UINT8 upevt = 0; 888 btgatt_batch_track_cb_t btif_scan_track_cb; 889 890 btif_scan_track_cb.status = status; 891 btif_scan_track_cb.client_if = ref_value; 892 BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d", 893 status, ref_value, evt); 894 895 switch(evt) 896 { 897 case BTA_BLE_BATCH_SCAN_ENB_EVT: 898 { 899 upevt = BTA_GATTC_BTH_SCAN_ENB_EVT; 900 break; 901 } 902 903 case BTA_BLE_BATCH_SCAN_DIS_EVT: 904 { 905 upevt = BTA_GATTC_BTH_SCAN_DIS_EVT; 906 break; 907 } 908 909 case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT: 910 { 911 upevt = BTA_GATTC_BTH_SCAN_CFG_EVT; 912 break; 913 } 914 915 case BTA_BLE_BATCH_SCAN_DATA_EVT: 916 { 917 upevt = BTA_GATTC_BTH_SCAN_RD_EVT; 918 break; 919 } 920 921 case BTA_BLE_BATCH_SCAN_THRES_EVT: 922 { 923 upevt = BTA_GATTC_BTH_SCAN_THR_EVT; 924 break; 925 } 926 927 default: 928 return; 929 } 930 931 btif_transfer_context(btif_gattc_upstreams_evt, upevt,(char*) &btif_scan_track_cb, 932 sizeof(btgatt_batch_track_cb_t), NULL); 933 934 } 935 936 static void bta_batch_scan_threshold_cb(tBTA_DM_BLE_REF_VALUE ref_value) 937 { 938 btgatt_batch_track_cb_t btif_scan_track_cb; 939 btif_scan_track_cb.status = 0; 940 btif_scan_track_cb.client_if = ref_value; 941 942 BTIF_TRACE_DEBUG("%s - client_if:%d",__FUNCTION__, ref_value); 943 944 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_THR_EVT, 945 (char*) &btif_scan_track_cb, sizeof(btif_gattc_cb_t), NULL); 946 } 947 948 static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format, 949 UINT8 num_records, UINT16 data_len, 950 UINT8* p_rep_data, tBTA_STATUS status) 951 { 952 btgatt_batch_track_cb_t btif_scan_track_cb; 953 memset(&btif_scan_track_cb, 0, sizeof(btgatt_batch_track_cb_t)); 954 BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d",__FUNCTION__, ref_value, status, num_records, 955 data_len); 956 957 btif_scan_track_cb.status = status; 958 959 btif_scan_track_cb.client_if = ref_value; 960 btif_scan_track_cb.read_reports.report_format = report_format; 961 btif_scan_track_cb.read_reports.data_len = data_len; 962 btif_scan_track_cb.read_reports.num_records = num_records; 963 964 if (data_len > 0) 965 { 966 btif_scan_track_cb.read_reports.p_rep_data = osi_malloc(data_len); 967 memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len); 968 osi_free(p_rep_data); 969 } 970 971 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT, 972 (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL); 973 974 if (data_len > 0) 975 osi_free_and_reset((void **)&btif_scan_track_cb.read_reports.p_rep_data); 976 } 977 978 static void bta_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data) 979 { 980 btif_gattc_cb_t btif_cb; 981 uint8_t len; 982 983 switch (event) 984 { 985 case BTA_DM_INQ_RES_EVT: 986 { 987 bdcpy(btif_cb.bd_addr.address, p_data->inq_res.bd_addr); 988 btif_cb.device_type = p_data->inq_res.device_type; 989 btif_cb.rssi = p_data->inq_res.rssi; 990 btif_cb.addr_type = p_data->inq_res.ble_addr_type; 991 btif_cb.flag = p_data->inq_res.flag; 992 if (p_data->inq_res.p_eir) 993 { 994 memcpy(btif_cb.value, p_data->inq_res.p_eir, 62); 995 if (BTM_CheckEirData(p_data->inq_res.p_eir, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, 996 &len)) 997 { 998 p_data->inq_res.remt_name_not_required = TRUE; 999 } 1000 } 1001 } 1002 break; 1003 1004 case BTA_DM_INQ_CMPL_EVT: 1005 { 1006 BTIF_TRACE_DEBUG("%s BLE observe complete. Num Resp %d", 1007 __FUNCTION__,p_data->inq_cmpl.num_resps); 1008 return; 1009 } 1010 1011 default: 1012 BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event); 1013 return; 1014 } 1015 btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT, 1016 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1017 } 1018 1019 static void bta_track_adv_event_cb(tBTA_DM_BLE_TRACK_ADV_DATA *p_track_adv_data) 1020 { 1021 btgatt_track_adv_info_t btif_scan_track_cb; 1022 BTIF_TRACE_DEBUG("%s",__FUNCTION__); 1023 btif_gatt_move_track_adv_data(&btif_scan_track_cb, 1024 (btgatt_track_adv_info_t*)p_track_adv_data); 1025 1026 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_VSC_EVT, 1027 (char*) &btif_scan_track_cb, sizeof(btgatt_track_adv_info_t), NULL); 1028 } 1029 1030 static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result) 1031 { 1032 if (!p_result) 1033 return; 1034 1035 btif_gattc_cb_t btif_cb; 1036 1037 bdcpy(btif_cb.bd_addr.address, p_result->rem_bda); 1038 btif_cb.rssi = p_result->rssi; 1039 btif_cb.status = p_result->status; 1040 btif_cb.client_if = rssi_request_client_if; 1041 btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_RSSI_EVT, 1042 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1043 } 1044 1045 static void bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status) 1046 { 1047 btif_gattc_cb_t btif_cb; 1048 1049 btif_cb.status = status; 1050 btif_cb.client_if = client_if; 1051 btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_SCAN_PARAM_EVT, 1052 (char *)&btif_cb, sizeof(btif_gattc_cb_t), NULL); 1053 } 1054 1055 static void bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action, tBTA_DM_BLE_SCAN_COND_OP cfg_op, 1056 tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status, 1057 tBTA_DM_BLE_REF_VALUE ref_value) 1058 { 1059 btgatt_adv_filter_cb_t btif_cb; 1060 btif_cb.status = status; 1061 btif_cb.action = action; 1062 btif_cb.cond_op = cfg_op; 1063 btif_cb.avbl_space = avbl_space; 1064 btif_cb.client_if = ref_value; 1065 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_CFG_EVT, 1066 (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1067 } 1068 1069 static void bta_scan_filt_param_setup_cb(UINT8 action_type, 1070 tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, 1071 tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status) 1072 { 1073 btgatt_adv_filter_cb_t btif_cb; 1074 1075 btif_cb.status = status; 1076 btif_cb.action = action_type; 1077 btif_cb.client_if = ref_value; 1078 btif_cb.avbl_space = avbl_space; 1079 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_PARAM_EVT, 1080 (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1081 } 1082 1083 static void bta_scan_filt_status_cb(UINT8 action, tBTA_STATUS status, 1084 tBTA_DM_BLE_REF_VALUE ref_value) 1085 { 1086 btgatt_adv_filter_cb_t btif_cb; 1087 1088 btif_cb.status = status; 1089 btif_cb.action = action; 1090 btif_cb.client_if = ref_value; 1091 btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_STATUS_EVT, 1092 (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1093 } 1094 1095 static void btgattc_free_event_data(UINT16 event, char *event_data) 1096 { 1097 switch (event) 1098 { 1099 case BTIF_GATTC_ADV_INSTANCE_SET_DATA: 1100 case BTIF_GATTC_SET_ADV_DATA: 1101 { 1102 btif_adv_data_t *adv_data = (btif_adv_data_t *)event_data; 1103 btif_gattc_adv_data_cleanup(adv_data); 1104 break; 1105 } 1106 1107 default: 1108 break; 1109 } 1110 } 1111 1112 static void btgattc_handle_event(uint16_t event, char* p_param) 1113 { 1114 tBTA_GATT_STATUS status; 1115 tBT_UUID uuid; 1116 tBTA_GATT_UNFMT descr_val; 1117 1118 btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*) p_param; 1119 if (!p_cb) return; 1120 1121 LOG_VERBOSE(LOG_TAG, "%s: Event %d", __FUNCTION__, event); 1122 1123 switch (event) 1124 { 1125 case BTIF_GATTC_REGISTER_APP: 1126 btif_to_bta_uuid(&uuid, &p_cb->uuid); 1127 btif_gattc_incr_app_count(); 1128 BTA_GATTC_AppRegister(&uuid, bta_gattc_cback); 1129 break; 1130 1131 case BTIF_GATTC_UNREGISTER_APP: 1132 btif_gattc_clear_clientif(p_cb->client_if, TRUE); 1133 btif_gattc_decr_app_count(); 1134 BTA_GATTC_AppDeregister(p_cb->client_if); 1135 break; 1136 1137 case BTIF_GATTC_SCAN_START: 1138 btif_gattc_init_dev_cb(); 1139 BTA_DmBleObserve(TRUE, 0, bta_scan_results_cb); 1140 break; 1141 1142 case BTIF_GATTC_SCAN_STOP: 1143 BTA_DmBleObserve(FALSE, 0, 0); 1144 break; 1145 1146 case BTIF_GATTC_OPEN: 1147 { 1148 // Ensure device is in inquiry database 1149 int addr_type = 0; 1150 int device_type = 0; 1151 tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE; 1152 1153 if (btif_get_address_type(p_cb->bd_addr.address, &addr_type) && 1154 btif_get_device_type(p_cb->bd_addr.address, &device_type) && 1155 device_type != BT_DEVICE_TYPE_BREDR) 1156 { 1157 BTA_DmAddBleDevice(p_cb->bd_addr.address, addr_type, device_type); 1158 } 1159 1160 // Check for background connections 1161 if (!p_cb->is_direct) 1162 { 1163 // Check for privacy 1.0 and 1.1 controller and do not start background 1164 // connection if RPA offloading is not supported, since it will not 1165 // connect after change of random address 1166 if (!controller_get_interface()->supports_ble_privacy() && 1167 (p_cb->addr_type == BLE_ADDR_RANDOM) && 1168 BTM_BLE_IS_RESOLVE_BDA(p_cb->bd_addr.address)) 1169 { 1170 tBTM_BLE_VSC_CB vnd_capabilities; 1171 BTM_BleGetVendorCapabilities(&vnd_capabilities); 1172 if (!vnd_capabilities.rpa_offloading) 1173 { 1174 HAL_CBACK(bt_gatt_callbacks, client->open_cb, 0, BT_STATUS_UNSUPPORTED, 1175 p_cb->client_if, &p_cb->bd_addr); 1176 return; 1177 } 1178 } 1179 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL); 1180 } 1181 1182 // Determine transport 1183 if (p_cb->transport != GATT_TRANSPORT_AUTO) 1184 { 1185 transport = p_cb->transport; 1186 } else { 1187 switch(device_type) 1188 { 1189 case BT_DEVICE_TYPE_BREDR: 1190 transport = BTA_GATT_TRANSPORT_BR_EDR; 1191 break; 1192 1193 case BT_DEVICE_TYPE_BLE: 1194 transport = BTA_GATT_TRANSPORT_LE; 1195 break; 1196 1197 case BT_DEVICE_TYPE_DUMO: 1198 if (p_cb->transport == GATT_TRANSPORT_LE) 1199 transport = BTA_GATT_TRANSPORT_LE; 1200 else 1201 transport = BTA_GATT_TRANSPORT_BR_EDR; 1202 break; 1203 } 1204 } 1205 1206 // Connect! 1207 BTIF_TRACE_DEBUG ("%s Transport=%d, device type=%d", 1208 __func__, transport, device_type); 1209 BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct, transport); 1210 break; 1211 } 1212 1213 case BTIF_GATTC_CLOSE: 1214 // Disconnect established connections 1215 if (p_cb->conn_id != 0) 1216 BTA_GATTC_Close(p_cb->conn_id); 1217 else 1218 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, TRUE); 1219 1220 // Cancel pending background connections (remove from whitelist) 1221 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, FALSE); 1222 break; 1223 1224 case BTIF_GATTC_SEARCH_SERVICE: 1225 { 1226 if (p_cb->search_all) 1227 { 1228 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, NULL); 1229 } else { 1230 btif_to_bta_uuid(&uuid, &p_cb->uuid); 1231 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &uuid); 1232 } 1233 break; 1234 } 1235 1236 case BTIF_GATTC_GET_GATT_DB: 1237 { 1238 btgatt_db_element_t *db = NULL; 1239 int count = 0; 1240 BTA_GATTC_GetGattDb(p_cb->conn_id, 0x0000, 0xFFFF, &db, &count); 1241 1242 HAL_CBACK(bt_gatt_callbacks, client->get_gatt_db_cb, 1243 p_cb->conn_id, db, count); 1244 osi_free(db); 1245 break; 1246 } 1247 1248 case BTIF_GATTC_READ_CHAR: 1249 BTA_GATTC_ReadCharacteristic(p_cb->conn_id, p_cb->handle, p_cb->auth_req); 1250 break; 1251 1252 case BTIF_GATTC_READ_CHAR_DESCR: 1253 BTA_GATTC_ReadCharDescr(p_cb->conn_id, p_cb->handle, p_cb->auth_req); 1254 break; 1255 1256 case BTIF_GATTC_WRITE_CHAR: 1257 BTA_GATTC_WriteCharValue(p_cb->conn_id, p_cb->handle, p_cb->write_type, 1258 p_cb->len, p_cb->value, p_cb->auth_req); 1259 break; 1260 1261 case BTIF_GATTC_WRITE_CHAR_DESCR: 1262 descr_val.len = p_cb->len; 1263 descr_val.p_value = p_cb->value; 1264 1265 BTA_GATTC_WriteCharDescr(p_cb->conn_id, p_cb->handle, 1266 p_cb->write_type, &descr_val, 1267 p_cb->auth_req); 1268 break; 1269 1270 case BTIF_GATTC_EXECUTE_WRITE: 1271 BTA_GATTC_ExecuteWrite(p_cb->conn_id, p_cb->action); 1272 break; 1273 1274 case BTIF_GATTC_REG_FOR_NOTIFICATION: 1275 status = BTA_GATTC_RegisterForNotifications(p_cb->client_if, 1276 p_cb->bd_addr.address, p_cb->handle); 1277 1278 HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb, 1279 p_cb->conn_id, 1, status, p_cb->handle); 1280 break; 1281 1282 case BTIF_GATTC_DEREG_FOR_NOTIFICATION: 1283 status = BTA_GATTC_DeregisterForNotifications(p_cb->client_if, 1284 p_cb->bd_addr.address, p_cb->handle); 1285 1286 HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb, 1287 p_cb->conn_id, 0, status, p_cb->handle); 1288 break; 1289 1290 case BTIF_GATTC_REFRESH: 1291 BTA_GATTC_Refresh(p_cb->bd_addr.address); 1292 break; 1293 1294 case BTIF_GATTC_READ_RSSI: 1295 rssi_request_client_if = p_cb->client_if; 1296 BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb); 1297 break; 1298 1299 case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP: 1300 { 1301 btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param; 1302 if (1 == p_adv_filt_cb->adv_filt_param.dely_mode) 1303 BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb); 1304 BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index, 1305 &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb, 1306 p_adv_filt_cb->client_if); 1307 break; 1308 } 1309 1310 case BTIF_GATTC_SCAN_FILTER_CONFIG: 1311 { 1312 btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param; 1313 tBTA_DM_BLE_PF_COND_PARAM cond; 1314 memset(&cond, 0, sizeof(cond)); 1315 1316 switch (p_adv_filt_cb->filt_type) 1317 { 1318 case BTA_DM_BLE_PF_ADDR_FILTER: // 0 1319 bdcpy(cond.target_addr.bda, p_adv_filt_cb->bd_addr.address); 1320 cond.target_addr.type = p_adv_filt_cb->addr_type; 1321 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1322 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1323 &cond, bta_scan_filt_cfg_cb, 1324 p_adv_filt_cb->client_if); 1325 break; 1326 1327 case BTA_DM_BLE_PF_SRVC_DATA: // 1 1328 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1329 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1330 NULL, bta_scan_filt_cfg_cb, p_adv_filt_cb->client_if); 1331 break; 1332 1333 case BTA_DM_BLE_PF_SRVC_UUID: // 2 1334 { 1335 tBTA_DM_BLE_PF_COND_MASK uuid_mask; 1336 1337 cond.srvc_uuid.p_target_addr = NULL; 1338 cond.srvc_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND; 1339 btif_to_bta_uuid(&cond.srvc_uuid.uuid, &p_adv_filt_cb->uuid); 1340 1341 cond.srvc_uuid.p_uuid_mask = NULL; 1342 if (p_adv_filt_cb->has_mask) 1343 { 1344 btif_to_bta_uuid_mask(&uuid_mask, &p_adv_filt_cb->uuid_mask); 1345 cond.srvc_uuid.p_uuid_mask = &uuid_mask; 1346 } 1347 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1348 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1349 &cond, bta_scan_filt_cfg_cb, 1350 p_adv_filt_cb->client_if); 1351 break; 1352 } 1353 1354 case BTA_DM_BLE_PF_SRVC_SOL_UUID: // 3 1355 { 1356 cond.solicitate_uuid.p_target_addr = NULL; 1357 cond.solicitate_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND; 1358 btif_to_bta_uuid(&cond.solicitate_uuid.uuid, &p_adv_filt_cb->uuid); 1359 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1360 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1361 &cond, bta_scan_filt_cfg_cb, 1362 p_adv_filt_cb->client_if); 1363 break; 1364 } 1365 1366 case BTA_DM_BLE_PF_LOCAL_NAME: // 4 1367 { 1368 cond.local_name.data_len = p_adv_filt_cb->value_len; 1369 cond.local_name.p_data = p_adv_filt_cb->value; 1370 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1371 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1372 &cond, bta_scan_filt_cfg_cb, 1373 p_adv_filt_cb->client_if); 1374 break; 1375 } 1376 1377 case BTA_DM_BLE_PF_MANU_DATA: // 5 1378 { 1379 cond.manu_data.company_id = p_adv_filt_cb->conn_id; 1380 cond.manu_data.company_id_mask = p_adv_filt_cb->company_id_mask; 1381 cond.manu_data.data_len = p_adv_filt_cb->value_len; 1382 cond.manu_data.p_pattern = p_adv_filt_cb->value; 1383 cond.manu_data.p_pattern_mask = p_adv_filt_cb->value_mask; 1384 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1385 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1386 &cond, bta_scan_filt_cfg_cb, 1387 p_adv_filt_cb->client_if); 1388 break; 1389 } 1390 1391 case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: //6 1392 { 1393 cond.srvc_data.data_len = p_adv_filt_cb->value_len; 1394 cond.srvc_data.p_pattern = p_adv_filt_cb->value; 1395 cond.srvc_data.p_pattern_mask = p_adv_filt_cb->value_mask; 1396 BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action, 1397 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index, 1398 &cond, bta_scan_filt_cfg_cb, 1399 p_adv_filt_cb->client_if); 1400 break; 1401 } 1402 1403 default: 1404 LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __FUNCTION__, p_cb->action); 1405 break; 1406 } 1407 break; 1408 } 1409 1410 case BTIF_GATTC_SCAN_FILTER_CLEAR: 1411 { 1412 btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param; 1413 BTA_DmBleCfgFilterCondition(BTA_DM_BLE_SCAN_COND_CLEAR, BTA_DM_BLE_PF_TYPE_ALL, 1414 p_adv_filt_cb->filt_index, NULL, bta_scan_filt_cfg_cb, 1415 p_adv_filt_cb->client_if); 1416 break; 1417 } 1418 1419 case BTIF_GATTC_SCAN_FILTER_ENABLE: 1420 { 1421 btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param; 1422 BTA_DmEnableScanFilter(p_adv_filt_cb->action, bta_scan_filt_status_cb, 1423 p_adv_filt_cb->client_if); 1424 break; 1425 } 1426 1427 case BTIF_GATTC_LISTEN: 1428 #if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE)) 1429 BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL); 1430 #else 1431 BTA_GATTC_Broadcast(p_cb->client_if, p_cb->start); 1432 #endif 1433 break; 1434 1435 case BTIF_GATTC_SET_ADV_DATA: 1436 { 1437 const btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param; 1438 const int cbindex = CLNT_IF_IDX; 1439 if (cbindex >= 0 && btif_gattc_copy_datacb(cbindex, p_adv_data, false)) 1440 { 1441 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb(); 1442 if (!p_adv_data->set_scan_rsp) 1443 { 1444 BTA_DmBleSetAdvConfig(p_multi_adv_data_cb->inst_cb[cbindex].mask, 1445 &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback); 1446 } 1447 else 1448 { 1449 BTA_DmBleSetScanRsp(p_multi_adv_data_cb->inst_cb[cbindex].mask, 1450 &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback); 1451 } 1452 } 1453 else 1454 { 1455 BTIF_TRACE_ERROR("%s:%s: failed to get instance data cbindex: %d", 1456 __func__, "BTIF_GATTC_SET_ADV_DATA", cbindex); 1457 } 1458 break; 1459 } 1460 1461 case BTIF_GATTC_ADV_INSTANCE_ENABLE: 1462 { 1463 btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param; 1464 1465 int cbindex = -1, arrindex = -1; 1466 1467 arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true); 1468 if (arrindex >= 0) 1469 cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX); 1470 1471 if (cbindex >= 0 && arrindex >= 0) 1472 { 1473 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb(); 1474 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, 1475 &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS)); 1476 p_multi_adv_data_cb->inst_cb[cbindex].timeout_s = p_inst_cb->timeout_s; 1477 BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__, 1478 p_multi_adv_data_cb->clntif_map[arrindex + arrindex]); 1479 BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param), 1480 bta_gattc_multi_adv_cback, 1481 &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex])); 1482 } 1483 else 1484 { 1485 /* let the error propagate up from BTA layer */ 1486 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__); 1487 BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL); 1488 } 1489 break; 1490 } 1491 1492 case BTIF_GATTC_ADV_INSTANCE_UPDATE: 1493 { 1494 btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param; 1495 int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if); 1496 int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX); 1497 if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb) 1498 { 1499 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb(); 1500 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param, 1501 sizeof(tBTA_BLE_ADV_PARAMS)); 1502 BTA_BleUpdateAdvInstParam((UINT8)inst_id, 1503 &(p_multi_adv_data_cb->inst_cb[cbindex].param)); 1504 } 1505 else 1506 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_UPDATE_ADV", __FUNCTION__); 1507 break; 1508 } 1509 1510 case BTIF_GATTC_ADV_INSTANCE_SET_DATA: 1511 { 1512 btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param; 1513 int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX); 1514 int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if); 1515 if (inst_id >= 0 && cbindex >= 0 && btif_gattc_copy_datacb(cbindex, p_adv_data, true)) 1516 { 1517 btgatt_multi_adv_common_data *p_multi_adv_data_cb = 1518 btif_obtain_multi_adv_data_cb(); 1519 BTA_BleCfgAdvInstData( 1520 (UINT8)inst_id, 1521 p_adv_data->set_scan_rsp, 1522 p_multi_adv_data_cb->inst_cb[cbindex].mask, 1523 &p_multi_adv_data_cb->inst_cb[cbindex].data); 1524 } 1525 else 1526 { 1527 BTIF_TRACE_ERROR( 1528 "%s:%s: failed to get invalid instance data: inst_id:%d " 1529 "cbindex:%d", 1530 __func__, "BTIF_GATTC_ADV_INSTANCE_SET_DATA", inst_id, cbindex); 1531 } 1532 break; 1533 } 1534 1535 case BTIF_GATTC_ADV_INSTANCE_DISABLE: 1536 { 1537 btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param; 1538 int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if); 1539 if (inst_id >=0) 1540 BTA_BleDisableAdvInstance((UINT8)inst_id); 1541 else 1542 BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__); 1543 break; 1544 } 1545 1546 case BTIF_GATTC_CONFIGURE_MTU: 1547 BTA_GATTC_ConfigureMTU(p_cb->conn_id, p_cb->len); 1548 break; 1549 1550 case BTIF_GATTC_CONN_PARAM_UPDT: 1551 { 1552 btif_conn_param_cb_t *p_conn_param_cb = (btif_conn_param_cb_t*) p_param; 1553 if (BTA_DmGetConnectionState(p_conn_param_cb->bd_addr.address)) 1554 { 1555 BTA_DmBleUpdateConnectionParams(p_conn_param_cb->bd_addr.address, 1556 p_conn_param_cb->min_interval, p_conn_param_cb->max_interval, 1557 p_conn_param_cb->latency, p_conn_param_cb->timeout); 1558 } else { 1559 BTA_DmSetBlePrefConnParams(p_conn_param_cb->bd_addr.address, 1560 p_conn_param_cb->min_interval, p_conn_param_cb->max_interval, 1561 p_conn_param_cb->latency, p_conn_param_cb->timeout); 1562 } 1563 break; 1564 } 1565 1566 case BTIF_GATTC_SET_SCAN_PARAMS: 1567 { 1568 BTA_DmSetBleScanParams(p_cb->client_if, p_cb->scan_interval, p_cb->scan_window, 1569 BTM_BLE_SCAN_MODE_ACTI, bta_scan_param_setup_cb); 1570 break; 1571 } 1572 1573 case BTIF_GATTC_CONFIG_STORAGE_PARAMS: 1574 { 1575 btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param; 1576 BTA_DmBleSetStorageParams(p_scan_track_cb->batch_scan_full_max, 1577 p_scan_track_cb->batch_scan_trunc_max, p_scan_track_cb->batch_scan_notify_threshold, 1578 bta_batch_scan_setup_cb, bta_batch_scan_threshold_cb, bta_batch_scan_reports_cb, 1579 (tBTA_DM_BLE_REF_VALUE) p_scan_track_cb->client_if); 1580 break; 1581 } 1582 1583 case BTIF_GATTC_ENABLE_BATCH_SCAN: 1584 { 1585 btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param; 1586 BTA_DmBleEnableBatchScan(p_scan_track_cb->scan_mode, p_scan_track_cb->scan_interval, 1587 p_scan_track_cb->scan_window, p_scan_track_cb->discard_rule, 1588 p_scan_track_cb->addr_type, p_scan_track_cb->client_if); 1589 break; 1590 } 1591 1592 case BTIF_GATTC_DISABLE_BATCH_SCAN: 1593 { 1594 btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param; 1595 BTA_DmBleDisableBatchScan(p_scan_track_cb->client_if); 1596 break; 1597 } 1598 1599 case BTIF_GATTC_READ_BATCH_SCAN_REPORTS: 1600 { 1601 btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param; 1602 BTA_DmBleReadScanReports(p_scan_track_cb->scan_mode, p_scan_track_cb->client_if); 1603 break; 1604 } 1605 1606 default: 1607 LOG_ERROR(LOG_TAG, "%s: Unknown event (%d)!", __FUNCTION__, event); 1608 break; 1609 } 1610 1611 btgattc_free_event_data(event, p_param); 1612 } 1613 1614 /******************************************************************************* 1615 ** Client API Functions 1616 ********************************************************************************/ 1617 1618 static bt_status_t btif_gattc_register_app(bt_uuid_t *uuid) 1619 { 1620 CHECK_BTGATT_INIT(); 1621 btif_gattc_cb_t btif_cb; 1622 memcpy(&btif_cb.uuid, uuid, sizeof(bt_uuid_t)); 1623 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REGISTER_APP, 1624 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1625 } 1626 1627 static bt_status_t btif_gattc_unregister_app(int client_if ) 1628 { 1629 CHECK_BTGATT_INIT(); 1630 btif_gattc_cb_t btif_cb; 1631 btif_cb.client_if = (uint8_t) client_if; 1632 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_UNREGISTER_APP, 1633 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1634 } 1635 1636 static bt_status_t btif_gattc_scan( bool start ) 1637 { 1638 CHECK_BTGATT_INIT(); 1639 btif_gattc_cb_t btif_cb; 1640 return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP, 1641 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1642 } 1643 1644 static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr, 1645 bool is_direct,int transport) 1646 { 1647 CHECK_BTGATT_INIT(); 1648 btif_gattc_cb_t btif_cb; 1649 btif_cb.client_if = (uint8_t) client_if; 1650 btif_cb.is_direct = is_direct ? 1 : 0; 1651 btif_cb.transport = (btgatt_transport_t)transport; 1652 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1653 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN, 1654 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1655 } 1656 1657 static bt_status_t btif_gattc_close( int client_if, const bt_bdaddr_t *bd_addr, int conn_id) 1658 { 1659 CHECK_BTGATT_INIT(); 1660 btif_gattc_cb_t btif_cb; 1661 btif_cb.client_if = (uint8_t) client_if; 1662 btif_cb.conn_id = (uint16_t) conn_id; 1663 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1664 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CLOSE, 1665 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1666 } 1667 1668 static bt_status_t btif_gattc_listen(int client_if, bool start) 1669 { 1670 CHECK_BTGATT_INIT(); 1671 btif_gattc_cb_t btif_cb; 1672 btif_cb.client_if = (uint8_t) client_if; 1673 btif_cb.start = start ? 1 : 0; 1674 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_LISTEN, 1675 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1676 } 1677 1678 static void btif_gattc_deep_copy(UINT16 event, char *p_dest, char *p_src) 1679 { 1680 switch (event) 1681 { 1682 case BTIF_GATTC_ADV_INSTANCE_SET_DATA: 1683 case BTIF_GATTC_SET_ADV_DATA: 1684 { 1685 const btif_adv_data_t *src = (btif_adv_data_t*) p_src; 1686 btif_adv_data_t *dst = (btif_adv_data_t*) p_dest; 1687 maybe_non_aligned_memcpy(dst, src, sizeof(*src)); 1688 1689 if (src->p_manufacturer_data) 1690 { 1691 dst->p_manufacturer_data = osi_malloc(src->manufacturer_len); 1692 memcpy(dst->p_manufacturer_data, src->p_manufacturer_data, 1693 src->manufacturer_len); 1694 } 1695 1696 if (src->p_service_data) 1697 { 1698 dst->p_service_data = osi_malloc(src->service_data_len); 1699 memcpy(dst->p_service_data, src->p_service_data, src->service_data_len); 1700 } 1701 1702 if (src->p_service_uuid) 1703 { 1704 dst->p_service_uuid = osi_malloc(src->service_uuid_len); 1705 memcpy(dst->p_service_uuid, src->p_service_uuid, src->service_uuid_len); 1706 } 1707 break; 1708 } 1709 1710 default: 1711 ASSERTC(false, "Unhandled deep copy", event); 1712 break; 1713 } 1714 } 1715 1716 static bt_status_t btif_gattc_set_adv_data(int client_if, bool set_scan_rsp, bool include_name, 1717 bool include_txpower, int min_interval, int max_interval, int appearance, 1718 uint16_t manufacturer_len, char* manufacturer_data, 1719 uint16_t service_data_len, char* service_data, 1720 uint16_t service_uuid_len, char* service_uuid) 1721 { 1722 CHECK_BTGATT_INIT(); 1723 btif_adv_data_t adv_data; 1724 1725 btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name, 1726 include_txpower, min_interval, max_interval, appearance, manufacturer_len, 1727 manufacturer_data, service_data_len, service_data, service_uuid_len, service_uuid, 1728 &adv_data); 1729 1730 bt_status_t status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA, 1731 (char*) &adv_data, sizeof(adv_data), btif_gattc_deep_copy); 1732 btif_gattc_adv_data_cleanup(&adv_data); 1733 return status; 1734 } 1735 1736 static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr ) 1737 { 1738 CHECK_BTGATT_INIT(); 1739 btif_gattc_cb_t btif_cb; 1740 btif_cb.client_if = (uint8_t) client_if; 1741 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1742 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REFRESH, 1743 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1744 } 1745 1746 static bt_status_t btif_gattc_search_service(int conn_id, bt_uuid_t *filter_uuid ) 1747 { 1748 CHECK_BTGATT_INIT(); 1749 btif_gattc_cb_t btif_cb; 1750 btif_cb.conn_id = (uint16_t) conn_id; 1751 btif_cb.search_all = filter_uuid ? 0 : 1; 1752 if (filter_uuid) 1753 memcpy(&btif_cb.uuid, filter_uuid, sizeof(bt_uuid_t)); 1754 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SEARCH_SERVICE, 1755 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1756 } 1757 1758 static bt_status_t btif_gattc_get_gatt_db(int conn_id) 1759 { 1760 CHECK_BTGATT_INIT(); 1761 btif_gattc_cb_t btif_cb; 1762 btif_cb.conn_id = (uint16_t) conn_id; 1763 1764 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_GATT_DB, 1765 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1766 } 1767 1768 1769 static bt_status_t btif_gattc_read_char(int conn_id, uint16_t handle, int auth_req) 1770 { 1771 CHECK_BTGATT_INIT(); 1772 btif_gattc_cb_t btif_cb; 1773 btif_cb.conn_id = (uint16_t) conn_id; 1774 btif_cb.handle = (uint16_t) handle; 1775 btif_cb.auth_req = (uint8_t) auth_req; 1776 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR, 1777 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1778 } 1779 1780 static bt_status_t btif_gattc_read_char_descr(int conn_id, uint16_t handle, int auth_req) 1781 { 1782 CHECK_BTGATT_INIT(); 1783 btif_gattc_cb_t btif_cb; 1784 btif_cb.conn_id = (uint16_t) conn_id; 1785 btif_cb.handle = (uint16_t) handle; 1786 btif_cb.auth_req = (uint8_t) auth_req; 1787 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR_DESCR, 1788 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1789 } 1790 1791 static bt_status_t btif_gattc_write_char(int conn_id, uint16_t handle, int write_type, 1792 int len, int auth_req, char* p_value) 1793 { 1794 CHECK_BTGATT_INIT(); 1795 btif_gattc_cb_t btif_cb; 1796 btif_cb.conn_id = (uint16_t) conn_id; 1797 btif_cb.handle = (uint16_t) handle; 1798 btif_cb.auth_req = (uint8_t) auth_req; 1799 btif_cb.write_type = (uint8_t) write_type; 1800 btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len; 1801 memcpy(btif_cb.value, p_value, btif_cb.len); 1802 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR, 1803 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1804 } 1805 1806 static bt_status_t btif_gattc_write_char_descr(int conn_id, uint16_t handle, 1807 int write_type, int len, int auth_req, 1808 char* p_value) 1809 { 1810 CHECK_BTGATT_INIT(); 1811 btif_gattc_cb_t btif_cb; 1812 btif_cb.conn_id = (uint16_t) conn_id; 1813 btif_cb.handle = (uint16_t) handle; 1814 btif_cb.auth_req = (uint8_t) auth_req; 1815 btif_cb.write_type = (uint8_t) write_type; 1816 btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len; 1817 memcpy(btif_cb.value, p_value, btif_cb.len); 1818 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR_DESCR, 1819 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1820 } 1821 1822 static bt_status_t btif_gattc_execute_write(int conn_id, int execute) 1823 { 1824 CHECK_BTGATT_INIT(); 1825 btif_gattc_cb_t btif_cb; 1826 btif_cb.conn_id = (uint16_t) conn_id; 1827 btif_cb.action = (uint8_t) execute; 1828 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_EXECUTE_WRITE, 1829 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1830 } 1831 1832 static bt_status_t btif_gattc_reg_for_notification(int client_if, const bt_bdaddr_t *bd_addr, 1833 uint16_t handle) 1834 { 1835 CHECK_BTGATT_INIT(); 1836 btif_gattc_cb_t btif_cb; 1837 btif_cb.client_if = (uint8_t) client_if; 1838 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1839 btif_cb.handle = handle; 1840 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REG_FOR_NOTIFICATION, 1841 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1842 } 1843 1844 static bt_status_t btif_gattc_dereg_for_notification(int client_if, const bt_bdaddr_t *bd_addr, 1845 uint16_t handle) 1846 { 1847 CHECK_BTGATT_INIT(); 1848 btif_gattc_cb_t btif_cb; 1849 btif_cb.client_if = (uint8_t) client_if; 1850 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1851 btif_cb.handle = handle; 1852 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DEREG_FOR_NOTIFICATION, 1853 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1854 } 1855 1856 static bt_status_t btif_gattc_read_remote_rssi(int client_if, const bt_bdaddr_t *bd_addr) 1857 { 1858 CHECK_BTGATT_INIT(); 1859 btif_gattc_cb_t btif_cb; 1860 btif_cb.client_if = (uint8_t) client_if; 1861 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1862 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_RSSI, 1863 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1864 } 1865 1866 static bt_status_t btif_gattc_configure_mtu(int conn_id, int mtu) 1867 { 1868 CHECK_BTGATT_INIT(); 1869 btif_gattc_cb_t btif_cb; 1870 btif_cb.conn_id = conn_id; 1871 btif_cb.len = mtu; // Re-use len field 1872 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIGURE_MTU, 1873 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1874 } 1875 1876 static bt_status_t btif_gattc_conn_parameter_update(const bt_bdaddr_t *bd_addr, int min_interval, 1877 int max_interval, int latency, int timeout) 1878 { 1879 CHECK_BTGATT_INIT(); 1880 btif_conn_param_cb_t btif_cb; 1881 btif_cb.min_interval = min_interval; 1882 btif_cb.max_interval = max_interval; 1883 btif_cb.latency = latency; 1884 btif_cb.timeout = timeout; 1885 bdcpy(btif_cb.bd_addr.address, bd_addr->address); 1886 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONN_PARAM_UPDT, 1887 (char*) &btif_cb, sizeof(btif_conn_param_cb_t), NULL); 1888 } 1889 1890 static bt_status_t btif_gattc_scan_filter_param_setup(btgatt_filt_param_setup_t 1891 filt_param) 1892 { 1893 CHECK_BTGATT_INIT(); 1894 BTIF_TRACE_DEBUG("%s", __FUNCTION__); 1895 btgatt_adv_filter_cb_t btif_filt_cb; 1896 memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t)); 1897 btif_filt_cb.client_if = filt_param.client_if; 1898 btif_filt_cb.action = filt_param.action; 1899 btif_filt_cb.filt_index = filt_param.filt_index; 1900 btif_filt_cb.adv_filt_param.feat_seln = filt_param.feat_seln; 1901 btif_filt_cb.adv_filt_param.list_logic_type = filt_param.list_logic_type; 1902 btif_filt_cb.adv_filt_param.filt_logic_type = filt_param.filt_logic_type; 1903 btif_filt_cb.adv_filt_param.rssi_high_thres = filt_param.rssi_high_thres; 1904 btif_filt_cb.adv_filt_param.rssi_low_thres = filt_param.rssi_low_thres; 1905 btif_filt_cb.adv_filt_param.dely_mode = filt_param.dely_mode; 1906 btif_filt_cb.adv_filt_param.found_timeout = filt_param.found_timeout; 1907 btif_filt_cb.adv_filt_param.lost_timeout = filt_param.lost_timeout; 1908 btif_filt_cb.adv_filt_param.found_timeout_cnt = filt_param.found_timeout_cnt; 1909 btif_filt_cb.adv_filt_param.num_of_tracking_entries = filt_param.num_of_tracking_entries; 1910 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_PARAM_SETUP, 1911 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1912 } 1913 1914 static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action, 1915 int filt_type, int filt_index, int company_id, 1916 int company_id_mask, const bt_uuid_t *p_uuid, 1917 const bt_uuid_t *p_uuid_mask, const bt_bdaddr_t *bd_addr, 1918 char addr_type, int data_len, char* p_data, int mask_len, 1919 char* p_mask) 1920 { 1921 CHECK_BTGATT_INIT(); 1922 btgatt_adv_filter_cb_t btif_filt_cb; 1923 memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t)); 1924 BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type); 1925 1926 /* If data is passed, both mask and data have to be the same length */ 1927 if (data_len != mask_len && NULL != p_data && NULL != p_mask) 1928 return BT_STATUS_PARM_INVALID; 1929 1930 btif_filt_cb.client_if = client_if; 1931 btif_filt_cb.action = action; 1932 btif_filt_cb.filt_index = filt_index; 1933 btif_filt_cb.filt_type = filt_type; 1934 btif_filt_cb.conn_id = company_id; 1935 btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF; 1936 if (bd_addr) 1937 bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address); 1938 1939 btif_filt_cb.addr_type = addr_type; 1940 btif_filt_cb.has_mask = (p_uuid_mask != NULL); 1941 1942 if (p_uuid != NULL) 1943 memcpy(&btif_filt_cb.uuid, p_uuid, sizeof(bt_uuid_t)); 1944 if (p_uuid_mask != NULL) 1945 memcpy(&btif_filt_cb.uuid_mask, p_uuid_mask, sizeof(bt_uuid_t)); 1946 if (p_data != NULL && data_len != 0) 1947 { 1948 memcpy(btif_filt_cb.value, p_data, data_len); 1949 btif_filt_cb.value_len = data_len; 1950 memcpy(btif_filt_cb.value_mask, p_mask, mask_len); 1951 btif_filt_cb.value_mask_len = mask_len; 1952 } 1953 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG, 1954 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1955 } 1956 1957 static bt_status_t btif_gattc_scan_filter_clear(int client_if, int filt_index) 1958 { 1959 CHECK_BTGATT_INIT(); 1960 BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, filt_index); 1961 1962 btgatt_adv_filter_cb_t btif_filt_cb; 1963 memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t)); 1964 btif_filt_cb.client_if = client_if; 1965 btif_filt_cb.filt_index = filt_index; 1966 btif_filt_cb.action = BTA_DM_BLE_SCAN_COND_CLEAR; 1967 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG, 1968 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1969 } 1970 1971 static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable) 1972 { 1973 int action = 0; 1974 CHECK_BTGATT_INIT(); 1975 BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, enable); 1976 1977 btgatt_adv_filter_cb_t btif_filt_cb; 1978 memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t)); 1979 btif_filt_cb.client_if = client_if; 1980 if (true == enable) 1981 action = 1; 1982 btif_filt_cb.action = action; 1983 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE, 1984 (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL); 1985 } 1986 1987 static bt_status_t btif_gattc_set_scan_parameters(int client_if, int scan_interval, 1988 int scan_window) 1989 { 1990 CHECK_BTGATT_INIT(); 1991 btif_gattc_cb_t btif_cb; 1992 btif_cb.client_if = client_if; 1993 btif_cb.scan_interval = scan_interval; 1994 btif_cb.scan_window = scan_window; 1995 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_SCAN_PARAMS, 1996 (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL); 1997 } 1998 1999 static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr ) 2000 { 2001 int device_type = 0; 2002 char bd_addr_str[18] = {0}; 2003 2004 bdaddr_to_string(bd_addr, bd_addr_str, sizeof(bd_addr_str)); 2005 if (btif_config_get_int(bd_addr_str, "DevType", &device_type)) 2006 return device_type; 2007 return 0; 2008 } 2009 2010 static bt_status_t btif_gattc_multi_adv_enable(int client_if, int min_interval, int max_interval, 2011 int adv_type, int chnl_map, int tx_power, int timeout_s) 2012 { 2013 CHECK_BTGATT_INIT(); 2014 btgatt_multi_adv_inst_cb adv_cb; 2015 memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb)); 2016 adv_cb.client_if = (uint8_t) client_if; 2017 2018 adv_cb.param.adv_int_min = min_interval; 2019 adv_cb.param.adv_int_max = max_interval; 2020 adv_cb.param.adv_type = adv_type; 2021 adv_cb.param.channel_map = chnl_map; 2022 adv_cb.param.adv_filter_policy = 0; 2023 adv_cb.param.tx_power = tx_power; 2024 adv_cb.timeout_s = timeout_s; 2025 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_ENABLE, 2026 (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL); 2027 } 2028 2029 static bt_status_t btif_gattc_multi_adv_update(int client_if, int min_interval, int max_interval, 2030 int adv_type, int chnl_map,int tx_power, int timeout_s) 2031 { 2032 CHECK_BTGATT_INIT(); 2033 btgatt_multi_adv_inst_cb adv_cb; 2034 memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb)); 2035 adv_cb.client_if = (uint8_t) client_if; 2036 2037 adv_cb.param.adv_int_min = min_interval; 2038 adv_cb.param.adv_int_max = max_interval; 2039 adv_cb.param.adv_type = adv_type; 2040 adv_cb.param.channel_map = chnl_map; 2041 adv_cb.param.adv_filter_policy = 0; 2042 adv_cb.param.tx_power = tx_power; 2043 adv_cb.timeout_s = timeout_s; 2044 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_UPDATE, 2045 (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL); 2046 } 2047 2048 static bt_status_t btif_gattc_multi_adv_setdata(int client_if, bool set_scan_rsp, 2049 bool include_name, bool incl_txpower, int appearance, 2050 int manufacturer_len, char* manufacturer_data, 2051 int service_data_len, char* service_data, 2052 int service_uuid_len, char* service_uuid) 2053 { 2054 CHECK_BTGATT_INIT(); 2055 2056 btif_adv_data_t multi_adv_data_inst; 2057 memset(&multi_adv_data_inst, 0, sizeof(multi_adv_data_inst)); 2058 2059 const int min_interval = 0; 2060 const int max_interval = 0; 2061 2062 btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name, incl_txpower, 2063 min_interval, max_interval, appearance, manufacturer_len, manufacturer_data, 2064 service_data_len, service_data, service_uuid_len, service_uuid, &multi_adv_data_inst); 2065 2066 bt_status_t status = btif_transfer_context( 2067 btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_SET_DATA, 2068 (char *)&multi_adv_data_inst, sizeof(multi_adv_data_inst), 2069 btif_gattc_deep_copy); 2070 btif_gattc_adv_data_cleanup(&multi_adv_data_inst); 2071 return status; 2072 } 2073 2074 static bt_status_t btif_gattc_multi_adv_disable(int client_if) 2075 { 2076 CHECK_BTGATT_INIT(); 2077 btgatt_multi_adv_inst_cb adv_cb; 2078 memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb)); 2079 adv_cb.client_if = (uint8_t) client_if; 2080 2081 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_DISABLE, 2082 (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL); 2083 } 2084 2085 static bt_status_t btif_gattc_cfg_storage(int client_if,int batch_scan_full_max, 2086 int batch_scan_trunc_max, int batch_scan_notify_threshold) 2087 { 2088 CHECK_BTGATT_INIT(); 2089 btgatt_batch_track_cb_t bt_scan_cb; 2090 memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t)); 2091 bt_scan_cb.client_if = (uint8_t) client_if; 2092 bt_scan_cb.batch_scan_full_max = batch_scan_full_max; 2093 bt_scan_cb.batch_scan_trunc_max = batch_scan_trunc_max; 2094 bt_scan_cb.batch_scan_notify_threshold = batch_scan_notify_threshold; 2095 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIG_STORAGE_PARAMS, 2096 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL); 2097 } 2098 2099 static bt_status_t btif_gattc_enb_batch_scan(int client_if,int scan_mode, int scan_interval, 2100 int scan_window, int addr_type, int discard_rule) 2101 { 2102 CHECK_BTGATT_INIT(); 2103 btgatt_batch_track_cb_t bt_scan_cb; 2104 memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t)); 2105 bt_scan_cb.client_if = (uint8_t) client_if; 2106 bt_scan_cb.scan_mode = scan_mode; 2107 bt_scan_cb.scan_interval = scan_interval; 2108 bt_scan_cb.scan_window = scan_window; 2109 bt_scan_cb.discard_rule = discard_rule; 2110 bt_scan_cb.addr_type = addr_type; 2111 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ENABLE_BATCH_SCAN, 2112 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL); 2113 } 2114 2115 static bt_status_t btif_gattc_dis_batch_scan(int client_if) 2116 { 2117 CHECK_BTGATT_INIT(); 2118 btgatt_batch_track_cb_t bt_scan_cb; 2119 memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t)); 2120 bt_scan_cb.client_if = (uint8_t) client_if; 2121 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DISABLE_BATCH_SCAN, 2122 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL); 2123 } 2124 2125 static bt_status_t btif_gattc_read_batch_scan_reports(int client_if, int scan_mode) 2126 { 2127 CHECK_BTGATT_INIT(); 2128 btgatt_batch_track_cb_t bt_scan_cb; 2129 memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t)); 2130 bt_scan_cb.client_if = (uint8_t) client_if; 2131 bt_scan_cb.scan_mode = scan_mode; 2132 return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_BATCH_SCAN_REPORTS, 2133 (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL); 2134 } 2135 2136 extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params); 2137 2138 static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params) 2139 { 2140 return btif_gattc_test_command_impl(command, params); 2141 } 2142 2143 const btgatt_client_interface_t btgattClientInterface = { 2144 btif_gattc_register_app, 2145 btif_gattc_unregister_app, 2146 btif_gattc_scan, 2147 btif_gattc_open, 2148 btif_gattc_close, 2149 btif_gattc_listen, 2150 btif_gattc_refresh, 2151 btif_gattc_search_service, 2152 btif_gattc_read_char, 2153 btif_gattc_write_char, 2154 btif_gattc_read_char_descr, 2155 btif_gattc_write_char_descr, 2156 btif_gattc_execute_write, 2157 btif_gattc_reg_for_notification, 2158 btif_gattc_dereg_for_notification, 2159 btif_gattc_read_remote_rssi, 2160 btif_gattc_scan_filter_param_setup, 2161 btif_gattc_scan_filter_add_remove, 2162 btif_gattc_scan_filter_clear, 2163 btif_gattc_scan_filter_enable, 2164 btif_gattc_get_device_type, 2165 btif_gattc_set_adv_data, 2166 btif_gattc_configure_mtu, 2167 btif_gattc_conn_parameter_update, 2168 btif_gattc_set_scan_parameters, 2169 btif_gattc_multi_adv_enable, 2170 btif_gattc_multi_adv_update, 2171 btif_gattc_multi_adv_setdata, 2172 btif_gattc_multi_adv_disable, 2173 btif_gattc_cfg_storage, 2174 btif_gattc_enb_batch_scan, 2175 btif_gattc_dis_batch_scan, 2176 btif_gattc_read_batch_scan_reports, 2177 btif_gattc_test_command, 2178 btif_gattc_get_gatt_db 2179 }; 2180 2181 #endif 2182