Home | History | Annotate | Download | only in src
      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_READ_DESCR_EVT:
    501         {
    502             btgatt_read_params_t data;
    503             set_read_value(&data, &p_data->read);
    504 
    505             HAL_CBACK(bt_gatt_callbacks, client->read_descriptor_cb
    506                 , p_data->read.conn_id, p_data->read.status, &data);
    507             break;
    508         }
    509 
    510         case BTA_GATTC_WRITE_DESCR_EVT:
    511         {
    512             HAL_CBACK(bt_gatt_callbacks, client->write_descriptor_cb,
    513                 p_data->write.conn_id, p_data->write.status, p_data->write.handle);
    514             break;
    515         }
    516 
    517         case BTA_GATTC_NOTIF_EVT:
    518         {
    519             btgatt_notify_params_t data;
    520 
    521             bdcpy(data.bda.address, p_data->notify.bda);
    522             memcpy(data.value, p_data->notify.value, p_data->notify.len);
    523 
    524             data.handle = p_data->notify.handle;
    525             data.is_notify = p_data->notify.is_notify;
    526             data.len = p_data->notify.len;
    527 
    528             HAL_CBACK(bt_gatt_callbacks, client->notify_cb, p_data->notify.conn_id, &data);
    529 
    530             if (p_data->notify.is_notify == FALSE)
    531                 BTA_GATTC_SendIndConfirm(p_data->notify.conn_id, p_data->notify.handle);
    532 
    533             break;
    534         }
    535 
    536         case BTA_GATTC_OPEN_EVT:
    537         {
    538             bt_bdaddr_t bda;
    539             bdcpy(bda.address, p_data->open.remote_bda);
    540 
    541             HAL_CBACK(bt_gatt_callbacks, client->open_cb, p_data->open.conn_id
    542                 , p_data->open.status, p_data->open.client_if, &bda);
    543 
    544             if (GATT_DEF_BLE_MTU_SIZE != p_data->open.mtu && p_data->open.mtu)
    545             {
    546                 HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb, p_data->open.conn_id
    547                     , p_data->open.status , p_data->open.mtu);
    548             }
    549 
    550             if (p_data->open.status == BTA_GATT_OK)
    551                 btif_gatt_check_encrypted_link(p_data->open.remote_bda, p_data->open.transport);
    552             break;
    553         }
    554 
    555         case BTA_GATTC_CLOSE_EVT:
    556         {
    557             bt_bdaddr_t bda;
    558             bdcpy(bda.address, p_data->close.remote_bda);
    559             HAL_CBACK(bt_gatt_callbacks, client->close_cb, p_data->close.conn_id
    560                 , p_data->status, p_data->close.client_if, &bda);
    561             break;
    562         }
    563 
    564         case BTA_GATTC_ACL_EVT:
    565             LOG_DEBUG(LOG_TAG, "BTA_GATTC_ACL_EVT: status = %d", p_data->status);
    566             /* Ignore for now */
    567             break;
    568 
    569         case BTA_GATTC_CANCEL_OPEN_EVT:
    570             break;
    571 
    572         case BTIF_GATT_OBSERVE_EVT:
    573         {
    574             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    575             uint8_t remote_name_len;
    576             uint8_t *p_eir_remote_name=NULL;
    577             bt_device_type_t dev_type;
    578             bt_property_t properties;
    579 
    580             p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value,
    581                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
    582 
    583             if (p_eir_remote_name == NULL)
    584             {
    585                 p_eir_remote_name = BTM_CheckEirData(p_btif_cb->value,
    586                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
    587             }
    588 
    589             if ((p_btif_cb->addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name))
    590             {
    591                if (!btif_gattc_find_bdaddr(p_btif_cb->bd_addr.address))
    592                {
    593                   btif_gattc_add_remote_bdaddr(p_btif_cb->bd_addr.address, p_btif_cb->addr_type);
    594                   btif_gattc_update_properties(p_btif_cb);
    595                }
    596             }
    597 
    598              dev_type =  p_btif_cb->device_type;
    599              BTIF_STORAGE_FILL_PROPERTY(&properties,
    600                         BT_PROPERTY_TYPE_OF_DEVICE, sizeof(dev_type), &dev_type);
    601              btif_storage_set_remote_device_property(&(p_btif_cb->bd_addr), &properties);
    602 
    603             btif_storage_set_remote_addr_type( &p_btif_cb->bd_addr, p_btif_cb->addr_type);
    604 
    605             HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb,
    606                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->value);
    607             break;
    608         }
    609 
    610         case BTIF_GATTC_RSSI_EVT:
    611         {
    612             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    613             HAL_CBACK(bt_gatt_callbacks, client->read_remote_rssi_cb, p_btif_cb->client_if,
    614                       &p_btif_cb->bd_addr, p_btif_cb->rssi, p_btif_cb->status);
    615             break;
    616         }
    617 
    618         case BTA_GATTC_LISTEN_EVT:
    619         {
    620             HAL_CBACK(bt_gatt_callbacks, client->listen_cb
    621                 , p_data->reg_oper.status
    622                 , p_data->reg_oper.client_if
    623             );
    624             break;
    625         }
    626 
    627         case BTA_GATTC_CFG_MTU_EVT:
    628         {
    629             HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb, p_data->cfg_mtu.conn_id
    630                 , p_data->cfg_mtu.status , p_data->cfg_mtu.mtu);
    631             break;
    632         }
    633 
    634         case BTA_GATTC_MULT_ADV_ENB_EVT:
    635         {
    636             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    637             if (0xFF != p_btif_cb->inst_id)
    638                 btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false);
    639             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb
    640                     , p_btif_cb->client_if
    641                     , p_btif_cb->status
    642                 );
    643             btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
    644                                       (p_btif_cb->status == BTA_GATT_OK) ?
    645                                       btif_multi_adv_stop_cb : NULL);
    646             break;
    647         }
    648 
    649         case BTA_GATTC_MULT_ADV_UPD_EVT:
    650         {
    651             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    652             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_update_cb
    653                 , p_btif_cb->client_if
    654                 , p_btif_cb->status
    655             );
    656             btif_multi_adv_timer_ctrl(p_btif_cb->client_if,
    657                                       (p_btif_cb->status == BTA_GATT_OK) ?
    658                                       btif_multi_adv_stop_cb : NULL);
    659             break;
    660         }
    661 
    662         case BTA_GATTC_MULT_ADV_DATA_EVT:
    663          {
    664             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    665             btif_gattc_clear_clientif(p_btif_cb->client_if, FALSE);
    666             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_data_cb
    667                 , p_btif_cb->client_if
    668                 , p_btif_cb->status
    669             );
    670             break;
    671         }
    672 
    673         case BTA_GATTC_MULT_ADV_DIS_EVT:
    674         {
    675             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
    676             btif_gattc_clear_clientif(p_btif_cb->client_if, TRUE);
    677             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_disable_cb
    678                 , p_btif_cb->client_if
    679                 , p_btif_cb->status
    680             );
    681             break;
    682         }
    683 
    684         case BTA_GATTC_ADV_DATA_EVT:
    685         {
    686             btif_gattc_cleanup_inst_cb(STD_ADV_INSTID, FALSE);
    687             /* No HAL callback available */
    688             break;
    689         }
    690 
    691         case BTA_GATTC_CONGEST_EVT:
    692             HAL_CBACK(bt_gatt_callbacks, client->congestion_cb
    693                 , p_data->congest.conn_id
    694                 , p_data->congest.congested
    695             );
    696             break;
    697 
    698         case BTA_GATTC_BTH_SCAN_CFG_EVT:
    699         {
    700             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
    701             HAL_CBACK(bt_gatt_callbacks, client->batchscan_cfg_storage_cb
    702                 , p_data->client_if
    703                 , p_data->status
    704             );
    705             break;
    706         }
    707 
    708         case BTA_GATTC_BTH_SCAN_ENB_EVT:
    709         {
    710             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
    711             HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
    712                     , ENABLE_BATCH_SCAN
    713                     , p_data->client_if
    714                     , p_data->status);
    715             break;
    716         }
    717 
    718         case BTA_GATTC_BTH_SCAN_DIS_EVT:
    719         {
    720             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
    721             HAL_CBACK(bt_gatt_callbacks, client->batchscan_enb_disable_cb
    722                     , DISABLE_BATCH_SCAN
    723                     , p_data->client_if
    724                     , p_data->status);
    725             break;
    726         }
    727 
    728         case BTA_GATTC_BTH_SCAN_THR_EVT:
    729         {
    730             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
    731             HAL_CBACK(bt_gatt_callbacks, client->batchscan_threshold_cb
    732                     , p_data->client_if);
    733             break;
    734         }
    735 
    736         case BTA_GATTC_BTH_SCAN_RD_EVT:
    737         {
    738             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
    739             uint8_t *p_rep_data = NULL;
    740 
    741             if (p_data->read_reports.data_len > 0 && NULL != p_data->read_reports.p_rep_data)
    742             {
    743                 p_rep_data = osi_malloc(p_data->read_reports.data_len);
    744                 memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len);
    745             }
    746 
    747             HAL_CBACK(bt_gatt_callbacks, client->batchscan_reports_cb
    748                     , p_data->client_if, p_data->status, p_data->read_reports.report_format
    749                     , p_data->read_reports.num_records, p_data->read_reports.data_len, p_rep_data);
    750             osi_free(p_rep_data);
    751             break;
    752         }
    753 
    754         case BTA_GATTC_SCAN_FLT_CFG_EVT:
    755         {
    756             btgatt_adv_filter_cb_t *p_btif_cb = (btgatt_adv_filter_cb_t*) p_param;
    757             HAL_CBACK(bt_gatt_callbacks, client->scan_filter_cfg_cb, p_btif_cb->action,
    758                       p_btif_cb->client_if, p_btif_cb->status, p_btif_cb->cond_op,
    759                       p_btif_cb->avbl_space);
    760             break;
    761         }
    762 
    763         case BTA_GATTC_SCAN_FLT_PARAM_EVT:
    764         {
    765             btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
    766             BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_PARAM_EVT: %d, %d, %d, %d",p_data->client_if,
    767                 p_data->action, p_data->avbl_space, p_data->status);
    768             HAL_CBACK(bt_gatt_callbacks, client->scan_filter_param_cb
    769                     , p_data->action, p_data->client_if, p_data->status
    770                     , p_data->avbl_space);
    771             break;
    772         }
    773 
    774         case BTA_GATTC_SCAN_FLT_STATUS_EVT:
    775         {
    776             btgatt_adv_filter_cb_t *p_data = (btgatt_adv_filter_cb_t*) p_param;
    777             BTIF_TRACE_DEBUG("BTA_GATTC_SCAN_FLT_STATUS_EVT: %d, %d, %d",p_data->client_if,
    778                 p_data->action, p_data->status);
    779             HAL_CBACK(bt_gatt_callbacks, client->scan_filter_status_cb
    780                     , p_data->action, p_data->client_if, p_data->status);
    781             break;
    782         }
    783 
    784         case BTA_GATTC_ADV_VSC_EVT:
    785         {
    786             btgatt_track_adv_info_t *p_data = (btgatt_track_adv_info_t*)p_param;
    787             btgatt_track_adv_info_t adv_info_data;
    788 
    789             memset(&adv_info_data, 0, sizeof(btgatt_track_adv_info_t));
    790 
    791             btif_gatt_move_track_adv_data(&adv_info_data, p_data);
    792             HAL_CBACK(bt_gatt_callbacks, client->track_adv_event_cb, &adv_info_data);
    793             break;
    794         }
    795 
    796         case BTIF_GATTC_SCAN_PARAM_EVT:
    797         {
    798             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t *)p_param;
    799             HAL_CBACK(bt_gatt_callbacks, client->scan_parameter_setup_completed_cb,
    800                       p_btif_cb->client_if, btif_gattc_translate_btm_status(p_btif_cb->status));
    801             break;
    802         }
    803 
    804         default:
    805             LOG_ERROR(LOG_TAG, "%s: Unhandled event (%d)!", __FUNCTION__, event);
    806             break;
    807     }
    808 
    809     btapp_gattc_free_req_data(event, p_data);
    810 }
    811 
    812 static void bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
    813 {
    814     bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt,
    815                     (uint16_t) event, (void*) p_data, sizeof(tBTA_GATTC), btapp_gattc_req_data);
    816     ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
    817 }
    818 
    819 static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_id,
    820                                     void *p_ref, tBTA_STATUS call_status)
    821 {
    822     btif_gattc_cb_t btif_cb;
    823     tBTA_GATTC_EVT upevt;
    824     uint8_t client_if = 0;
    825 
    826     if (NULL == p_ref)
    827     {
    828         BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__);
    829     }
    830     else
    831     {
    832         client_if = *(UINT8 *) p_ref;
    833     }
    834 
    835     BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status,
    836                        client_if);
    837     btif_cb.status = call_status;
    838     btif_cb.client_if = client_if;
    839     btif_cb.inst_id = inst_id;
    840 
    841     switch(event)
    842     {
    843         case BTA_BLE_MULTI_ADV_ENB_EVT:
    844             upevt = BTA_GATTC_MULT_ADV_ENB_EVT;
    845             break;
    846 
    847         case BTA_BLE_MULTI_ADV_DISABLE_EVT:
    848             upevt = BTA_GATTC_MULT_ADV_DIS_EVT;
    849             break;
    850 
    851         case BTA_BLE_MULTI_ADV_PARAM_EVT:
    852             upevt = BTA_GATTC_MULT_ADV_UPD_EVT;
    853             break;
    854 
    855         case BTA_BLE_MULTI_ADV_DATA_EVT:
    856             upevt = BTA_GATTC_MULT_ADV_DATA_EVT;
    857             break;
    858 
    859         default:
    860             return;
    861     }
    862 
    863     bt_status_t status = btif_transfer_context(btif_gattc_upstreams_evt, (uint16_t) upevt,
    864                         (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    865     ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
    866 }
    867 
    868 static void bta_gattc_set_adv_data_cback(tBTA_STATUS call_status)
    869 {
    870     UNUSED(call_status);
    871     btif_gattc_cb_t btif_cb;
    872     btif_cb.status = call_status;
    873     btif_cb.action = 0;
    874     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_DATA_EVT,
    875                           (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
    876 }
    877 
    878 static void bta_batch_scan_setup_cb (tBTA_BLE_BATCH_SCAN_EVT evt,
    879                                             tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
    880 {
    881     UINT8 upevt = 0;
    882     btgatt_batch_track_cb_t btif_scan_track_cb;
    883 
    884     btif_scan_track_cb.status = status;
    885     btif_scan_track_cb.client_if = ref_value;
    886     BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d",
    887             status, ref_value, evt);
    888 
    889     switch(evt)
    890     {
    891         case BTA_BLE_BATCH_SCAN_ENB_EVT:
    892         {
    893            upevt = BTA_GATTC_BTH_SCAN_ENB_EVT;
    894            break;
    895         }
    896 
    897         case BTA_BLE_BATCH_SCAN_DIS_EVT:
    898         {
    899            upevt = BTA_GATTC_BTH_SCAN_DIS_EVT;
    900            break;
    901         }
    902 
    903         case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT:
    904         {
    905            upevt = BTA_GATTC_BTH_SCAN_CFG_EVT;
    906            break;
    907         }
    908 
    909         case BTA_BLE_BATCH_SCAN_DATA_EVT:
    910         {
    911            upevt = BTA_GATTC_BTH_SCAN_RD_EVT;
    912            break;
    913         }
    914 
    915         case BTA_BLE_BATCH_SCAN_THRES_EVT:
    916         {
    917            upevt = BTA_GATTC_BTH_SCAN_THR_EVT;
    918            break;
    919         }
    920 
    921         default:
    922             return;
    923     }
    924 
    925     btif_transfer_context(btif_gattc_upstreams_evt, upevt,(char*) &btif_scan_track_cb,
    926                           sizeof(btgatt_batch_track_cb_t), NULL);
    927 
    928 }
    929 
    930 static void bta_batch_scan_threshold_cb(tBTA_DM_BLE_REF_VALUE ref_value)
    931 {
    932     btgatt_batch_track_cb_t btif_scan_track_cb;
    933     btif_scan_track_cb.status = 0;
    934     btif_scan_track_cb.client_if = ref_value;
    935 
    936     BTIF_TRACE_DEBUG("%s - client_if:%d",__FUNCTION__, ref_value);
    937 
    938     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_THR_EVT,
    939                           (char*) &btif_scan_track_cb, sizeof(btif_gattc_cb_t), NULL);
    940 }
    941 
    942 static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 report_format,
    943                                             UINT8 num_records, UINT16 data_len,
    944                                             UINT8* p_rep_data, tBTA_STATUS status)
    945 {
    946     btgatt_batch_track_cb_t btif_scan_track_cb;
    947     memset(&btif_scan_track_cb, 0, sizeof(btgatt_batch_track_cb_t));
    948     BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d",__FUNCTION__, ref_value, status, num_records,
    949                                     data_len);
    950 
    951     btif_scan_track_cb.status = status;
    952 
    953     btif_scan_track_cb.client_if = ref_value;
    954     btif_scan_track_cb.read_reports.report_format = report_format;
    955     btif_scan_track_cb.read_reports.data_len = data_len;
    956     btif_scan_track_cb.read_reports.num_records = num_records;
    957 
    958     if (data_len > 0)
    959     {
    960         btif_scan_track_cb.read_reports.p_rep_data = osi_malloc(data_len);
    961         memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len);
    962         osi_free(p_rep_data);
    963     }
    964 
    965     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT,
    966         (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
    967 
    968     if (data_len > 0)
    969         osi_free_and_reset((void **)&btif_scan_track_cb.read_reports.p_rep_data);
    970 }
    971 
    972 static void bta_scan_results_cb (tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH *p_data)
    973 {
    974     btif_gattc_cb_t btif_cb;
    975     uint8_t len;
    976 
    977     switch (event)
    978     {
    979         case BTA_DM_INQ_RES_EVT:
    980         {
    981             bdcpy(btif_cb.bd_addr.address, p_data->inq_res.bd_addr);
    982             btif_cb.device_type = p_data->inq_res.device_type;
    983             btif_cb.rssi = p_data->inq_res.rssi;
    984             btif_cb.addr_type = p_data->inq_res.ble_addr_type;
    985             btif_cb.flag = p_data->inq_res.flag;
    986             if (p_data->inq_res.p_eir)
    987             {
    988                 memcpy(btif_cb.value, p_data->inq_res.p_eir, 62);
    989                 if (BTM_CheckEirData(p_data->inq_res.p_eir, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE,
    990                                       &len))
    991                 {
    992                     p_data->inq_res.remt_name_not_required  = TRUE;
    993                 }
    994             }
    995         }
    996         break;
    997 
    998         case BTA_DM_INQ_CMPL_EVT:
    999         {
   1000             BTIF_TRACE_DEBUG("%s  BLE observe complete. Num Resp %d",
   1001                               __FUNCTION__,p_data->inq_cmpl.num_resps);
   1002             return;
   1003         }
   1004 
   1005         default:
   1006         BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
   1007         return;
   1008     }
   1009     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATT_OBSERVE_EVT,
   1010                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1011 }
   1012 
   1013 static void bta_track_adv_event_cb(tBTA_DM_BLE_TRACK_ADV_DATA *p_track_adv_data)
   1014 {
   1015     btgatt_track_adv_info_t btif_scan_track_cb;
   1016     BTIF_TRACE_DEBUG("%s",__FUNCTION__);
   1017     btif_gatt_move_track_adv_data(&btif_scan_track_cb,
   1018                 (btgatt_track_adv_info_t*)p_track_adv_data);
   1019 
   1020     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_ADV_VSC_EVT,
   1021                           (char*) &btif_scan_track_cb, sizeof(btgatt_track_adv_info_t), NULL);
   1022 }
   1023 
   1024 static void btm_read_rssi_cb (tBTM_RSSI_RESULTS *p_result)
   1025 {
   1026     btif_gattc_cb_t btif_cb;
   1027 
   1028     bdcpy(btif_cb.bd_addr.address, p_result->rem_bda);
   1029     btif_cb.rssi = p_result->rssi;
   1030     btif_cb.status = p_result->status;
   1031     btif_cb.client_if = rssi_request_client_if;
   1032     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_RSSI_EVT,
   1033                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1034 }
   1035 
   1036 static void bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status)
   1037 {
   1038     btif_gattc_cb_t btif_cb;
   1039 
   1040     btif_cb.status = status;
   1041     btif_cb.client_if = client_if;
   1042     btif_transfer_context(btif_gattc_upstreams_evt, BTIF_GATTC_SCAN_PARAM_EVT,
   1043                           (char *)&btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1044 }
   1045 
   1046 static void bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action, tBTA_DM_BLE_SCAN_COND_OP cfg_op,
   1047                                 tBTA_DM_BLE_PF_AVBL_SPACE avbl_space, tBTA_STATUS status,
   1048                                 tBTA_DM_BLE_REF_VALUE ref_value)
   1049 {
   1050     btgatt_adv_filter_cb_t btif_cb;
   1051     btif_cb.status = status;
   1052     btif_cb.action = action;
   1053     btif_cb.cond_op = cfg_op;
   1054     btif_cb.avbl_space = avbl_space;
   1055     btif_cb.client_if = ref_value;
   1056     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_CFG_EVT,
   1057                           (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1058 }
   1059 
   1060 static void bta_scan_filt_param_setup_cb(UINT8 action_type,
   1061                                         tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
   1062                                         tBTA_DM_BLE_REF_VALUE ref_value, tBTA_STATUS status)
   1063 {
   1064     btgatt_adv_filter_cb_t btif_cb;
   1065 
   1066     btif_cb.status = status;
   1067     btif_cb.action = action_type;
   1068     btif_cb.client_if = ref_value;
   1069     btif_cb.avbl_space = avbl_space;
   1070     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_PARAM_EVT,
   1071                           (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1072 }
   1073 
   1074 static void bta_scan_filt_status_cb(UINT8 action, tBTA_STATUS status,
   1075                                     tBTA_DM_BLE_REF_VALUE ref_value)
   1076 {
   1077     btgatt_adv_filter_cb_t btif_cb;
   1078 
   1079     btif_cb.status = status;
   1080     btif_cb.action = action;
   1081     btif_cb.client_if = ref_value;
   1082     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_SCAN_FLT_STATUS_EVT,
   1083                           (char*) &btif_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1084 }
   1085 
   1086 static void btgattc_free_event_data(UINT16 event, char *event_data)
   1087 {
   1088     switch (event)
   1089     {
   1090         case BTIF_GATTC_ADV_INSTANCE_SET_DATA:
   1091         case BTIF_GATTC_SET_ADV_DATA:
   1092         {
   1093             btif_adv_data_t *adv_data = (btif_adv_data_t *)event_data;
   1094             btif_gattc_adv_data_cleanup(adv_data);
   1095             break;
   1096         }
   1097 
   1098         default:
   1099             break;
   1100     }
   1101 }
   1102 
   1103 static void btgattc_handle_event(uint16_t event, char* p_param)
   1104 {
   1105     tBTA_GATT_STATUS           status;
   1106     tBT_UUID                   uuid;
   1107     tBTA_GATT_UNFMT            descr_val;
   1108 
   1109     btif_gattc_cb_t* p_cb = (btif_gattc_cb_t*) p_param;
   1110     if (!p_cb) return;
   1111 
   1112     LOG_VERBOSE(LOG_TAG, "%s: Event %d", __FUNCTION__, event);
   1113 
   1114     switch (event)
   1115     {
   1116         case BTIF_GATTC_REGISTER_APP:
   1117             btif_to_bta_uuid(&uuid, &p_cb->uuid);
   1118             btif_gattc_incr_app_count();
   1119             BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
   1120             break;
   1121 
   1122         case BTIF_GATTC_UNREGISTER_APP:
   1123             btif_gattc_clear_clientif(p_cb->client_if, TRUE);
   1124             btif_gattc_decr_app_count();
   1125             BTA_GATTC_AppDeregister(p_cb->client_if);
   1126             break;
   1127 
   1128         case BTIF_GATTC_SCAN_START:
   1129             btif_gattc_init_dev_cb();
   1130             BTA_DmBleObserve(TRUE, 0, bta_scan_results_cb);
   1131             break;
   1132 
   1133         case BTIF_GATTC_SCAN_STOP:
   1134             BTA_DmBleObserve(FALSE, 0, 0);
   1135             break;
   1136 
   1137         case BTIF_GATTC_OPEN:
   1138         {
   1139             // Ensure device is in inquiry database
   1140             int addr_type = 0;
   1141             int device_type = 0;
   1142             tBTA_GATT_TRANSPORT transport = BTA_GATT_TRANSPORT_LE;
   1143 
   1144             if (btif_get_address_type(p_cb->bd_addr.address, &addr_type) &&
   1145                 btif_get_device_type(p_cb->bd_addr.address, &device_type) &&
   1146                 device_type != BT_DEVICE_TYPE_BREDR)
   1147             {
   1148                 BTA_DmAddBleDevice(p_cb->bd_addr.address, addr_type, device_type);
   1149             }
   1150 
   1151             // Check for background connections
   1152             if (!p_cb->is_direct)
   1153             {
   1154                 // Check for privacy 1.0 and 1.1 controller and do not start background
   1155                 // connection if RPA offloading is not supported, since it will not
   1156                 // connect after change of random address
   1157                 if (!controller_get_interface()->supports_ble_privacy() &&
   1158                    (p_cb->addr_type == BLE_ADDR_RANDOM) &&
   1159                    BTM_BLE_IS_RESOLVE_BDA(p_cb->bd_addr.address))
   1160                 {
   1161                     tBTM_BLE_VSC_CB vnd_capabilities;
   1162                     BTM_BleGetVendorCapabilities(&vnd_capabilities);
   1163                     if (!vnd_capabilities.rpa_offloading)
   1164                     {
   1165                         HAL_CBACK(bt_gatt_callbacks, client->open_cb, 0, BT_STATUS_UNSUPPORTED,
   1166                                         p_cb->client_if, &p_cb->bd_addr);
   1167                         return;
   1168                     }
   1169                 }
   1170                 BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
   1171             }
   1172 
   1173             // Determine transport
   1174             if (p_cb->transport != GATT_TRANSPORT_AUTO)
   1175             {
   1176                 transport = p_cb->transport;
   1177             } else {
   1178                 switch(device_type)
   1179                 {
   1180                     case BT_DEVICE_TYPE_BREDR:
   1181                         transport = BTA_GATT_TRANSPORT_BR_EDR;
   1182                         break;
   1183 
   1184                     case BT_DEVICE_TYPE_BLE:
   1185                         transport = BTA_GATT_TRANSPORT_LE;
   1186                         break;
   1187 
   1188                     case BT_DEVICE_TYPE_DUMO:
   1189                         if (p_cb->transport == GATT_TRANSPORT_LE)
   1190                             transport = BTA_GATT_TRANSPORT_LE;
   1191                         else
   1192                             transport = BTA_GATT_TRANSPORT_BR_EDR;
   1193                         break;
   1194                 }
   1195             }
   1196 
   1197             // Connect!
   1198             BTIF_TRACE_DEBUG ("%s Transport=%d, device type=%d",
   1199                                 __func__, transport, device_type);
   1200             BTA_GATTC_Open(p_cb->client_if, p_cb->bd_addr.address, p_cb->is_direct, transport);
   1201             break;
   1202         }
   1203 
   1204         case BTIF_GATTC_CLOSE:
   1205             // Disconnect established connections
   1206             if (p_cb->conn_id != 0)
   1207                 BTA_GATTC_Close(p_cb->conn_id);
   1208             else
   1209                 BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, TRUE);
   1210 
   1211             // Cancel pending background connections (remove from whitelist)
   1212             BTA_GATTC_CancelOpen(p_cb->client_if, p_cb->bd_addr.address, FALSE);
   1213             break;
   1214 
   1215         case BTIF_GATTC_SEARCH_SERVICE:
   1216         {
   1217             if (p_cb->search_all)
   1218             {
   1219                 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, NULL);
   1220             } else {
   1221                 btif_to_bta_uuid(&uuid, &p_cb->uuid);
   1222                 BTA_GATTC_ServiceSearchRequest(p_cb->conn_id, &uuid);
   1223             }
   1224             break;
   1225         }
   1226 
   1227         case BTIF_GATTC_GET_GATT_DB:
   1228         {
   1229             btgatt_db_element_t *db = NULL;
   1230             int count = 0;
   1231             BTA_GATTC_GetGattDb(p_cb->conn_id, 0x0000, 0xFFFF, &db, &count);
   1232 
   1233             HAL_CBACK(bt_gatt_callbacks, client->get_gatt_db_cb,
   1234                 p_cb->conn_id, db, count);
   1235             osi_free(db);
   1236             break;
   1237         }
   1238 
   1239         case BTIF_GATTC_READ_CHAR:
   1240             BTA_GATTC_ReadCharacteristic(p_cb->conn_id, p_cb->handle, p_cb->auth_req);
   1241             break;
   1242 
   1243         case BTIF_GATTC_READ_CHAR_DESCR:
   1244             BTA_GATTC_ReadCharDescr(p_cb->conn_id, p_cb->handle, p_cb->auth_req);
   1245             break;
   1246 
   1247         case BTIF_GATTC_WRITE_CHAR:
   1248             BTA_GATTC_WriteCharValue(p_cb->conn_id, p_cb->handle, p_cb->write_type,
   1249                                      p_cb->len, p_cb->value, p_cb->auth_req);
   1250             break;
   1251 
   1252         case BTIF_GATTC_WRITE_CHAR_DESCR:
   1253             descr_val.len = p_cb->len;
   1254             descr_val.p_value = p_cb->value;
   1255 
   1256             BTA_GATTC_WriteCharDescr(p_cb->conn_id, p_cb->handle,
   1257                                      p_cb->write_type, &descr_val,
   1258                                      p_cb->auth_req);
   1259             break;
   1260 
   1261         case BTIF_GATTC_EXECUTE_WRITE:
   1262             BTA_GATTC_ExecuteWrite(p_cb->conn_id, p_cb->action);
   1263             break;
   1264 
   1265         case BTIF_GATTC_REG_FOR_NOTIFICATION:
   1266             status = BTA_GATTC_RegisterForNotifications(p_cb->client_if,
   1267                                     p_cb->bd_addr.address, p_cb->handle);
   1268 
   1269             HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
   1270                 p_cb->conn_id, 1, status, p_cb->handle);
   1271             break;
   1272 
   1273         case BTIF_GATTC_DEREG_FOR_NOTIFICATION:
   1274             status = BTA_GATTC_DeregisterForNotifications(p_cb->client_if,
   1275                                         p_cb->bd_addr.address, p_cb->handle);
   1276 
   1277             HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
   1278                 p_cb->conn_id, 0, status, p_cb->handle);
   1279             break;
   1280 
   1281         case BTIF_GATTC_REFRESH:
   1282             BTA_GATTC_Refresh(p_cb->bd_addr.address);
   1283             break;
   1284 
   1285         case BTIF_GATTC_READ_RSSI:
   1286             rssi_request_client_if = p_cb->client_if;
   1287             BTM_ReadRSSI (p_cb->bd_addr.address, (tBTM_CMPL_CB *)btm_read_rssi_cb);
   1288             break;
   1289 
   1290         case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP:
   1291         {
   1292             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
   1293             if (1 == p_adv_filt_cb->adv_filt_param.dely_mode)
   1294                BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
   1295             BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
   1296                 &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
   1297                 p_adv_filt_cb->client_if);
   1298             break;
   1299         }
   1300 
   1301         case BTIF_GATTC_SCAN_FILTER_CONFIG:
   1302         {
   1303             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
   1304             tBTA_DM_BLE_PF_COND_PARAM cond;
   1305             memset(&cond, 0, sizeof(cond));
   1306 
   1307             switch (p_adv_filt_cb->filt_type)
   1308             {
   1309                 case BTA_DM_BLE_PF_ADDR_FILTER: // 0
   1310                     bdcpy(cond.target_addr.bda, p_adv_filt_cb->bd_addr.address);
   1311                     cond.target_addr.type = p_adv_filt_cb->addr_type;
   1312                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1313                                               p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1314                                               &cond, bta_scan_filt_cfg_cb,
   1315                                               p_adv_filt_cb->client_if);
   1316                     break;
   1317 
   1318                 case BTA_DM_BLE_PF_SRVC_DATA: // 1
   1319                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1320                                             p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1321                                             NULL, bta_scan_filt_cfg_cb, p_adv_filt_cb->client_if);
   1322                     break;
   1323 
   1324                 case BTA_DM_BLE_PF_SRVC_UUID: // 2
   1325                 {
   1326                     tBTA_DM_BLE_PF_COND_MASK uuid_mask;
   1327 
   1328                     cond.srvc_uuid.p_target_addr = NULL;
   1329                     cond.srvc_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
   1330                     btif_to_bta_uuid(&cond.srvc_uuid.uuid, &p_adv_filt_cb->uuid);
   1331 
   1332                     cond.srvc_uuid.p_uuid_mask = NULL;
   1333                     if (p_adv_filt_cb->has_mask)
   1334                     {
   1335                         btif_to_bta_uuid_mask(&uuid_mask, &p_adv_filt_cb->uuid_mask);
   1336                         cond.srvc_uuid.p_uuid_mask = &uuid_mask;
   1337                     }
   1338                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1339                                               p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1340                                               &cond, bta_scan_filt_cfg_cb,
   1341                                               p_adv_filt_cb->client_if);
   1342                     break;
   1343                 }
   1344 
   1345                 case BTA_DM_BLE_PF_SRVC_SOL_UUID: // 3
   1346                 {
   1347                     cond.solicitate_uuid.p_target_addr = NULL;
   1348                     cond.solicitate_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
   1349                     btif_to_bta_uuid(&cond.solicitate_uuid.uuid, &p_adv_filt_cb->uuid);
   1350                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1351                                               p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1352                                               &cond, bta_scan_filt_cfg_cb,
   1353                                               p_adv_filt_cb->client_if);
   1354                     break;
   1355                 }
   1356 
   1357                 case BTA_DM_BLE_PF_LOCAL_NAME: // 4
   1358                 {
   1359                     cond.local_name.data_len = p_adv_filt_cb->value_len;
   1360                     cond.local_name.p_data = p_adv_filt_cb->value;
   1361                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1362                                               p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1363                                               &cond, bta_scan_filt_cfg_cb,
   1364                                               p_adv_filt_cb->client_if);
   1365                     break;
   1366                 }
   1367 
   1368                 case BTA_DM_BLE_PF_MANU_DATA: // 5
   1369                 {
   1370                     cond.manu_data.company_id = p_adv_filt_cb->conn_id;
   1371                     cond.manu_data.company_id_mask = p_adv_filt_cb->company_id_mask;
   1372                     cond.manu_data.data_len = p_adv_filt_cb->value_len;
   1373                     cond.manu_data.p_pattern = p_adv_filt_cb->value;
   1374                     cond.manu_data.p_pattern_mask = p_adv_filt_cb->value_mask;
   1375                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1376                                               p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1377                                               &cond, bta_scan_filt_cfg_cb,
   1378                                               p_adv_filt_cb->client_if);
   1379                     break;
   1380                 }
   1381 
   1382                 case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: //6
   1383                 {
   1384                     cond.srvc_data.data_len = p_adv_filt_cb->value_len;
   1385                     cond.srvc_data.p_pattern = p_adv_filt_cb->value;
   1386                     cond.srvc_data.p_pattern_mask = p_adv_filt_cb->value_mask;
   1387                     BTA_DmBleCfgFilterCondition(p_adv_filt_cb->action,
   1388                                                 p_adv_filt_cb->filt_type, p_adv_filt_cb->filt_index,
   1389                                                 &cond, bta_scan_filt_cfg_cb,
   1390                                                 p_adv_filt_cb->client_if);
   1391                    break;
   1392                 }
   1393 
   1394                 default:
   1395                     LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __FUNCTION__, p_cb->action);
   1396                     break;
   1397             }
   1398             break;
   1399         }
   1400 
   1401         case BTIF_GATTC_SCAN_FILTER_CLEAR:
   1402         {
   1403             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
   1404             BTA_DmBleCfgFilterCondition(BTA_DM_BLE_SCAN_COND_CLEAR, BTA_DM_BLE_PF_TYPE_ALL,
   1405                                         p_adv_filt_cb->filt_index, NULL, bta_scan_filt_cfg_cb,
   1406                                         p_adv_filt_cb->client_if);
   1407             break;
   1408         }
   1409 
   1410         case BTIF_GATTC_SCAN_FILTER_ENABLE:
   1411         {
   1412             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
   1413             BTA_DmEnableScanFilter(p_adv_filt_cb->action, bta_scan_filt_status_cb,
   1414                                    p_adv_filt_cb->client_if);
   1415             break;
   1416         }
   1417 
   1418         case BTIF_GATTC_LISTEN:
   1419 #if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && (BLE_PERIPHERAL_MODE_SUPPORT == TRUE))
   1420             BTA_GATTC_Listen(p_cb->client_if, p_cb->start, NULL);
   1421 #else
   1422             BTA_GATTC_Broadcast(p_cb->client_if, p_cb->start);
   1423 #endif
   1424             break;
   1425 
   1426         case BTIF_GATTC_SET_ADV_DATA:
   1427         {
   1428             const btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
   1429             const int cbindex = CLNT_IF_IDX;
   1430             if (cbindex >= 0 && btif_gattc_copy_datacb(cbindex, p_adv_data, false))
   1431             {
   1432                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
   1433                 if (!p_adv_data->set_scan_rsp)
   1434                 {
   1435                     BTA_DmBleSetAdvConfig(p_multi_adv_data_cb->inst_cb[cbindex].mask,
   1436                         &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
   1437                 }
   1438                 else
   1439                 {
   1440                     BTA_DmBleSetScanRsp(p_multi_adv_data_cb->inst_cb[cbindex].mask,
   1441                         &p_multi_adv_data_cb->inst_cb[cbindex].data, bta_gattc_set_adv_data_cback);
   1442                 }
   1443             }
   1444             else
   1445             {
   1446                 BTIF_TRACE_ERROR("%s:%s: failed to get instance data cbindex: %d",
   1447                                  __func__, "BTIF_GATTC_SET_ADV_DATA", cbindex);
   1448             }
   1449             break;
   1450         }
   1451 
   1452         case BTIF_GATTC_ADV_INSTANCE_ENABLE:
   1453         {
   1454             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
   1455 
   1456             int cbindex = -1, arrindex = -1;
   1457 
   1458             arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true);
   1459             if (arrindex >= 0)
   1460                 cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
   1461 
   1462             if (cbindex >= 0 && arrindex >= 0)
   1463             {
   1464                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
   1465                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param,
   1466                        &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS));
   1467                 p_multi_adv_data_cb->inst_cb[cbindex].timeout_s = p_inst_cb->timeout_s;
   1468                 BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__,
   1469                             p_multi_adv_data_cb->clntif_map[arrindex + arrindex]);
   1470                 BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param),
   1471                     bta_gattc_multi_adv_cback,
   1472                     &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex]));
   1473             }
   1474             else
   1475             {
   1476                 /* let the error propagate up from BTA layer */
   1477                 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__);
   1478                 BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL);
   1479             }
   1480             break;
   1481         }
   1482 
   1483         case BTIF_GATTC_ADV_INSTANCE_UPDATE:
   1484         {
   1485             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
   1486             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
   1487             int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
   1488             if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
   1489             {
   1490                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
   1491                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param,
   1492                         sizeof(tBTA_BLE_ADV_PARAMS));
   1493                 BTA_BleUpdateAdvInstParam((UINT8)inst_id,
   1494                     &(p_multi_adv_data_cb->inst_cb[cbindex].param));
   1495             }
   1496             else
   1497                 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_UPDATE_ADV", __FUNCTION__);
   1498             break;
   1499         }
   1500 
   1501         case BTIF_GATTC_ADV_INSTANCE_SET_DATA:
   1502         {
   1503             btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
   1504             int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX);
   1505             int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if);
   1506             if (inst_id >= 0 && cbindex >= 0 && btif_gattc_copy_datacb(cbindex, p_adv_data, true))
   1507             {
   1508                 btgatt_multi_adv_common_data *p_multi_adv_data_cb =
   1509                     btif_obtain_multi_adv_data_cb();
   1510                 BTA_BleCfgAdvInstData(
   1511                     (UINT8)inst_id,
   1512                     p_adv_data->set_scan_rsp,
   1513                     p_multi_adv_data_cb->inst_cb[cbindex].mask,
   1514                     &p_multi_adv_data_cb->inst_cb[cbindex].data);
   1515             }
   1516             else
   1517             {
   1518                 BTIF_TRACE_ERROR(
   1519                     "%s:%s: failed to get invalid instance data: inst_id:%d "
   1520                     "cbindex:%d",
   1521                     __func__, "BTIF_GATTC_ADV_INSTANCE_SET_DATA", inst_id, cbindex);
   1522             }
   1523             break;
   1524         }
   1525 
   1526         case BTIF_GATTC_ADV_INSTANCE_DISABLE:
   1527         {
   1528             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
   1529             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
   1530             if (inst_id >=0)
   1531                 BTA_BleDisableAdvInstance((UINT8)inst_id);
   1532             else
   1533                 BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__);
   1534             break;
   1535         }
   1536 
   1537         case BTIF_GATTC_CONFIGURE_MTU:
   1538             BTA_GATTC_ConfigureMTU(p_cb->conn_id, p_cb->len);
   1539             break;
   1540 
   1541         case BTIF_GATTC_CONN_PARAM_UPDT:
   1542         {
   1543             btif_conn_param_cb_t *p_conn_param_cb = (btif_conn_param_cb_t*) p_param;
   1544             if (BTA_DmGetConnectionState(p_conn_param_cb->bd_addr.address))
   1545             {
   1546                 BTA_DmBleUpdateConnectionParams(p_conn_param_cb->bd_addr.address,
   1547                                p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
   1548                                p_conn_param_cb->latency, p_conn_param_cb->timeout);
   1549             } else {
   1550                 BTA_DmSetBlePrefConnParams(p_conn_param_cb->bd_addr.address,
   1551                                p_conn_param_cb->min_interval, p_conn_param_cb->max_interval,
   1552                                p_conn_param_cb->latency, p_conn_param_cb->timeout);
   1553             }
   1554             break;
   1555         }
   1556 
   1557         case BTIF_GATTC_SET_SCAN_PARAMS:
   1558         {
   1559             BTA_DmSetBleScanParams(p_cb->client_if, p_cb->scan_interval, p_cb->scan_window,
   1560                                    BTM_BLE_SCAN_MODE_ACTI, bta_scan_param_setup_cb);
   1561             break;
   1562         }
   1563 
   1564         case BTIF_GATTC_CONFIG_STORAGE_PARAMS:
   1565         {
   1566             btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
   1567             BTA_DmBleSetStorageParams(p_scan_track_cb->batch_scan_full_max,
   1568                p_scan_track_cb->batch_scan_trunc_max, p_scan_track_cb->batch_scan_notify_threshold,
   1569                bta_batch_scan_setup_cb, bta_batch_scan_threshold_cb, bta_batch_scan_reports_cb,
   1570                (tBTA_DM_BLE_REF_VALUE) p_scan_track_cb->client_if);
   1571             break;
   1572         }
   1573 
   1574         case BTIF_GATTC_ENABLE_BATCH_SCAN:
   1575         {
   1576             btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
   1577             BTA_DmBleEnableBatchScan(p_scan_track_cb->scan_mode, p_scan_track_cb->scan_interval,
   1578                p_scan_track_cb->scan_window, p_scan_track_cb->discard_rule,
   1579                p_scan_track_cb->addr_type, p_scan_track_cb->client_if);
   1580             break;
   1581         }
   1582 
   1583         case BTIF_GATTC_DISABLE_BATCH_SCAN:
   1584         {
   1585             btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
   1586             BTA_DmBleDisableBatchScan(p_scan_track_cb->client_if);
   1587             break;
   1588         }
   1589 
   1590         case BTIF_GATTC_READ_BATCH_SCAN_REPORTS:
   1591         {
   1592             btgatt_batch_track_cb_t *p_scan_track_cb = (btgatt_batch_track_cb_t *) p_param;
   1593             BTA_DmBleReadScanReports(p_scan_track_cb->scan_mode, p_scan_track_cb->client_if);
   1594             break;
   1595         }
   1596 
   1597         default:
   1598             LOG_ERROR(LOG_TAG, "%s: Unknown event (%d)!", __FUNCTION__, event);
   1599             break;
   1600     }
   1601 
   1602     btgattc_free_event_data(event, p_param);
   1603 }
   1604 
   1605 /*******************************************************************************
   1606 **  Client API Functions
   1607 ********************************************************************************/
   1608 
   1609 static bt_status_t btif_gattc_register_app(bt_uuid_t *uuid)
   1610 {
   1611     CHECK_BTGATT_INIT();
   1612     btif_gattc_cb_t btif_cb;
   1613     memcpy(&btif_cb.uuid, uuid, sizeof(bt_uuid_t));
   1614     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REGISTER_APP,
   1615                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1616 }
   1617 
   1618 static bt_status_t btif_gattc_unregister_app(int client_if )
   1619 {
   1620     CHECK_BTGATT_INIT();
   1621     btif_gattc_cb_t btif_cb;
   1622     btif_cb.client_if = (uint8_t) client_if;
   1623     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_UNREGISTER_APP,
   1624                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1625 }
   1626 
   1627 static bt_status_t btif_gattc_scan( bool start )
   1628 {
   1629     CHECK_BTGATT_INIT();
   1630     btif_gattc_cb_t btif_cb;
   1631     return btif_transfer_context(btgattc_handle_event, start ? BTIF_GATTC_SCAN_START : BTIF_GATTC_SCAN_STOP,
   1632                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1633 }
   1634 
   1635 static bt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t *bd_addr,
   1636                                         bool is_direct,int transport)
   1637 {
   1638     CHECK_BTGATT_INIT();
   1639     btif_gattc_cb_t btif_cb;
   1640     btif_cb.client_if = (uint8_t) client_if;
   1641     btif_cb.is_direct = is_direct ? 1 : 0;
   1642     btif_cb.transport = (btgatt_transport_t)transport;
   1643     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1644     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_OPEN,
   1645                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1646 }
   1647 
   1648 static bt_status_t btif_gattc_close( int client_if, const bt_bdaddr_t *bd_addr, int conn_id)
   1649 {
   1650     CHECK_BTGATT_INIT();
   1651     btif_gattc_cb_t btif_cb;
   1652     btif_cb.client_if = (uint8_t) client_if;
   1653     btif_cb.conn_id = (uint16_t) conn_id;
   1654     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1655     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CLOSE,
   1656                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1657 }
   1658 
   1659 static bt_status_t btif_gattc_listen(int client_if, bool start)
   1660 {
   1661     CHECK_BTGATT_INIT();
   1662     btif_gattc_cb_t btif_cb;
   1663     btif_cb.client_if = (uint8_t) client_if;
   1664     btif_cb.start = start ? 1 : 0;
   1665     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_LISTEN,
   1666                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1667 }
   1668 
   1669 static void btif_gattc_deep_copy(UINT16 event, char *p_dest, char *p_src)
   1670 {
   1671     switch (event)
   1672     {
   1673         case BTIF_GATTC_ADV_INSTANCE_SET_DATA:
   1674         case BTIF_GATTC_SET_ADV_DATA:
   1675         {
   1676             const btif_adv_data_t *src = (btif_adv_data_t*) p_src;
   1677             btif_adv_data_t *dst = (btif_adv_data_t*) p_dest;
   1678             maybe_non_aligned_memcpy(dst, src, sizeof(*src));
   1679 
   1680             if (src->p_manufacturer_data)
   1681             {
   1682                 dst->p_manufacturer_data = osi_malloc(src->manufacturer_len);
   1683                 memcpy(dst->p_manufacturer_data, src->p_manufacturer_data,
   1684                        src->manufacturer_len);
   1685             }
   1686 
   1687             if (src->p_service_data)
   1688             {
   1689                 dst->p_service_data = osi_malloc(src->service_data_len);
   1690                 memcpy(dst->p_service_data, src->p_service_data, src->service_data_len);
   1691             }
   1692 
   1693             if (src->p_service_uuid)
   1694             {
   1695                 dst->p_service_uuid = osi_malloc(src->service_uuid_len);
   1696                 memcpy(dst->p_service_uuid, src->p_service_uuid, src->service_uuid_len);
   1697             }
   1698             break;
   1699         }
   1700 
   1701         default:
   1702             ASSERTC(false, "Unhandled deep copy", event);
   1703             break;
   1704     }
   1705 }
   1706 
   1707 static bt_status_t btif_gattc_set_adv_data(int client_if, bool set_scan_rsp, bool include_name,
   1708                 bool include_txpower, int min_interval, int max_interval, int appearance,
   1709                 uint16_t manufacturer_len, char* manufacturer_data,
   1710                 uint16_t service_data_len, char* service_data,
   1711                 uint16_t service_uuid_len, char* service_uuid)
   1712 {
   1713     CHECK_BTGATT_INIT();
   1714     btif_adv_data_t adv_data;
   1715 
   1716     btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name,
   1717         include_txpower, min_interval, max_interval, appearance, manufacturer_len,
   1718         manufacturer_data, service_data_len, service_data, service_uuid_len, service_uuid,
   1719         &adv_data);
   1720 
   1721     bt_status_t status = btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_ADV_DATA,
   1722                        (char*) &adv_data, sizeof(adv_data), btif_gattc_deep_copy);
   1723     btif_gattc_adv_data_cleanup(&adv_data);
   1724     return status;
   1725 }
   1726 
   1727 static bt_status_t btif_gattc_refresh( int client_if, const bt_bdaddr_t *bd_addr )
   1728 {
   1729     CHECK_BTGATT_INIT();
   1730     btif_gattc_cb_t btif_cb;
   1731     btif_cb.client_if = (uint8_t) client_if;
   1732     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1733     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REFRESH,
   1734                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1735 }
   1736 
   1737 static bt_status_t btif_gattc_search_service(int conn_id, bt_uuid_t *filter_uuid )
   1738 {
   1739     CHECK_BTGATT_INIT();
   1740     btif_gattc_cb_t btif_cb;
   1741     btif_cb.conn_id = (uint16_t) conn_id;
   1742     btif_cb.search_all = filter_uuid ? 0 : 1;
   1743     if (filter_uuid)
   1744         memcpy(&btif_cb.uuid, filter_uuid, sizeof(bt_uuid_t));
   1745     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SEARCH_SERVICE,
   1746                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1747 }
   1748 
   1749 static bt_status_t btif_gattc_get_gatt_db(int conn_id)
   1750 {
   1751     CHECK_BTGATT_INIT();
   1752     btif_gattc_cb_t btif_cb;
   1753     btif_cb.conn_id = (uint16_t) conn_id;
   1754 
   1755     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_GET_GATT_DB,
   1756                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1757 }
   1758 
   1759 
   1760 static bt_status_t btif_gattc_read_char(int conn_id, uint16_t handle, int auth_req)
   1761 {
   1762     CHECK_BTGATT_INIT();
   1763     btif_gattc_cb_t btif_cb;
   1764     btif_cb.conn_id = (uint16_t) conn_id;
   1765     btif_cb.handle = (uint16_t) handle;
   1766     btif_cb.auth_req = (uint8_t) auth_req;
   1767     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR,
   1768                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1769 }
   1770 
   1771 static bt_status_t btif_gattc_read_char_descr(int conn_id, uint16_t handle, int auth_req)
   1772 {
   1773     CHECK_BTGATT_INIT();
   1774     btif_gattc_cb_t btif_cb;
   1775     btif_cb.conn_id = (uint16_t) conn_id;
   1776     btif_cb.handle = (uint16_t) handle;
   1777     btif_cb.auth_req = (uint8_t) auth_req;
   1778     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_CHAR_DESCR,
   1779                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1780 }
   1781 
   1782 static bt_status_t btif_gattc_write_char(int conn_id, uint16_t handle, int write_type,
   1783                                          int len, int auth_req, char* p_value)
   1784 {
   1785     CHECK_BTGATT_INIT();
   1786     btif_gattc_cb_t btif_cb;
   1787     btif_cb.conn_id = (uint16_t) conn_id;
   1788     btif_cb.handle = (uint16_t) handle;
   1789     btif_cb.auth_req = (uint8_t) auth_req;
   1790     btif_cb.write_type = (uint8_t) write_type;
   1791     btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
   1792     memcpy(btif_cb.value, p_value, btif_cb.len);
   1793     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR,
   1794                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1795 }
   1796 
   1797 static bt_status_t btif_gattc_write_char_descr(int conn_id, uint16_t handle,
   1798                                                int write_type, int len, int auth_req,
   1799                                                char* p_value)
   1800 {
   1801     CHECK_BTGATT_INIT();
   1802     btif_gattc_cb_t btif_cb;
   1803     btif_cb.conn_id = (uint16_t) conn_id;
   1804     btif_cb.handle = (uint16_t) handle;
   1805     btif_cb.auth_req = (uint8_t) auth_req;
   1806     btif_cb.write_type = (uint8_t) write_type;
   1807     btif_cb.len = len > BTGATT_MAX_ATTR_LEN ? BTGATT_MAX_ATTR_LEN : len;
   1808     memcpy(btif_cb.value, p_value, btif_cb.len);
   1809     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_WRITE_CHAR_DESCR,
   1810                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1811 }
   1812 
   1813 static bt_status_t btif_gattc_execute_write(int conn_id, int execute)
   1814 {
   1815     CHECK_BTGATT_INIT();
   1816     btif_gattc_cb_t btif_cb;
   1817     btif_cb.conn_id = (uint16_t) conn_id;
   1818     btif_cb.action = (uint8_t) execute;
   1819     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_EXECUTE_WRITE,
   1820                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1821 }
   1822 
   1823 static bt_status_t btif_gattc_reg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
   1824                                                    uint16_t handle)
   1825 {
   1826     CHECK_BTGATT_INIT();
   1827     btif_gattc_cb_t btif_cb;
   1828     btif_cb.client_if = (uint8_t) client_if;
   1829     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1830     btif_cb.handle = handle;
   1831     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_REG_FOR_NOTIFICATION,
   1832                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1833 }
   1834 
   1835 static bt_status_t btif_gattc_dereg_for_notification(int client_if, const bt_bdaddr_t *bd_addr,
   1836                                                      uint16_t handle)
   1837 {
   1838     CHECK_BTGATT_INIT();
   1839     btif_gattc_cb_t btif_cb;
   1840     btif_cb.client_if = (uint8_t) client_if;
   1841     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1842     btif_cb.handle = handle;
   1843     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DEREG_FOR_NOTIFICATION,
   1844                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1845 }
   1846 
   1847 static bt_status_t btif_gattc_read_remote_rssi(int client_if, const bt_bdaddr_t *bd_addr)
   1848 {
   1849     CHECK_BTGATT_INIT();
   1850     btif_gattc_cb_t btif_cb;
   1851     btif_cb.client_if = (uint8_t) client_if;
   1852     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1853     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_RSSI,
   1854                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1855 }
   1856 
   1857 static bt_status_t btif_gattc_configure_mtu(int conn_id, int mtu)
   1858 {
   1859     CHECK_BTGATT_INIT();
   1860     btif_gattc_cb_t btif_cb;
   1861     btif_cb.conn_id = conn_id;
   1862     btif_cb.len = mtu; // Re-use len field
   1863     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIGURE_MTU,
   1864                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1865 }
   1866 
   1867 static bt_status_t btif_gattc_conn_parameter_update(const bt_bdaddr_t *bd_addr, int min_interval,
   1868                     int max_interval, int latency, int timeout)
   1869 {
   1870     CHECK_BTGATT_INIT();
   1871     btif_conn_param_cb_t btif_cb;
   1872     btif_cb.min_interval = min_interval;
   1873     btif_cb.max_interval = max_interval;
   1874     btif_cb.latency = latency;
   1875     btif_cb.timeout = timeout;
   1876     bdcpy(btif_cb.bd_addr.address, bd_addr->address);
   1877     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONN_PARAM_UPDT,
   1878                                  (char*) &btif_cb, sizeof(btif_conn_param_cb_t), NULL);
   1879 }
   1880 
   1881 static bt_status_t btif_gattc_scan_filter_param_setup(btgatt_filt_param_setup_t
   1882                                                       filt_param)
   1883 {
   1884     CHECK_BTGATT_INIT();
   1885     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
   1886     btgatt_adv_filter_cb_t btif_filt_cb;
   1887     memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
   1888     btif_filt_cb.client_if = filt_param.client_if;
   1889     btif_filt_cb.action = filt_param.action;
   1890     btif_filt_cb.filt_index = filt_param.filt_index;
   1891     btif_filt_cb.adv_filt_param.feat_seln = filt_param.feat_seln;
   1892     btif_filt_cb.adv_filt_param.list_logic_type = filt_param.list_logic_type;
   1893     btif_filt_cb.adv_filt_param.filt_logic_type = filt_param.filt_logic_type;
   1894     btif_filt_cb.adv_filt_param.rssi_high_thres = filt_param.rssi_high_thres;
   1895     btif_filt_cb.adv_filt_param.rssi_low_thres = filt_param.rssi_low_thres;
   1896     btif_filt_cb.adv_filt_param.dely_mode = filt_param.dely_mode;
   1897     btif_filt_cb.adv_filt_param.found_timeout = filt_param.found_timeout;
   1898     btif_filt_cb.adv_filt_param.lost_timeout = filt_param.lost_timeout;
   1899     btif_filt_cb.adv_filt_param.found_timeout_cnt = filt_param.found_timeout_cnt;
   1900     btif_filt_cb.adv_filt_param.num_of_tracking_entries = filt_param.num_of_tracking_entries;
   1901     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_PARAM_SETUP,
   1902                                  (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1903 }
   1904 
   1905 static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
   1906                               int filt_type, int filt_index, int company_id,
   1907                               int company_id_mask, const bt_uuid_t *p_uuid,
   1908                               const bt_uuid_t *p_uuid_mask, const bt_bdaddr_t *bd_addr,
   1909                               char addr_type, int data_len, char* p_data, int mask_len,
   1910                               char* p_mask)
   1911 {
   1912     CHECK_BTGATT_INIT();
   1913     btgatt_adv_filter_cb_t btif_filt_cb;
   1914     memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
   1915     BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type);
   1916 
   1917     /* If data is passed, both mask and data have to be the same length */
   1918     if (data_len != mask_len && NULL != p_data && NULL != p_mask)
   1919         return BT_STATUS_PARM_INVALID;
   1920 
   1921     btif_filt_cb.client_if = client_if;
   1922     btif_filt_cb.action = action;
   1923     btif_filt_cb.filt_index = filt_index;
   1924     btif_filt_cb.filt_type = filt_type;
   1925     btif_filt_cb.conn_id = company_id;
   1926     btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
   1927     if (bd_addr)
   1928         bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
   1929 
   1930     btif_filt_cb.addr_type = addr_type;
   1931     btif_filt_cb.has_mask = (p_uuid_mask != NULL);
   1932 
   1933     if (p_uuid != NULL)
   1934         memcpy(&btif_filt_cb.uuid, p_uuid, sizeof(bt_uuid_t));
   1935     if (p_uuid_mask != NULL)
   1936         memcpy(&btif_filt_cb.uuid_mask, p_uuid_mask, sizeof(bt_uuid_t));
   1937     if (p_data != NULL && data_len != 0)
   1938     {
   1939         memcpy(btif_filt_cb.value, p_data, data_len);
   1940         btif_filt_cb.value_len = data_len;
   1941         memcpy(btif_filt_cb.value_mask, p_mask, mask_len);
   1942         btif_filt_cb.value_mask_len = mask_len;
   1943     }
   1944     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
   1945                                  (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1946 }
   1947 
   1948 static bt_status_t btif_gattc_scan_filter_clear(int client_if, int filt_index)
   1949 {
   1950     CHECK_BTGATT_INIT();
   1951     BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, filt_index);
   1952 
   1953     btgatt_adv_filter_cb_t btif_filt_cb;
   1954     memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
   1955     btif_filt_cb.client_if = client_if;
   1956     btif_filt_cb.filt_index = filt_index;
   1957     btif_filt_cb.action = BTA_DM_BLE_SCAN_COND_CLEAR;
   1958     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_CONFIG,
   1959                                  (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1960 }
   1961 
   1962 static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable)
   1963 {
   1964     int action = 0;
   1965     CHECK_BTGATT_INIT();
   1966     BTIF_TRACE_DEBUG("%s, %d", __FUNCTION__, enable);
   1967 
   1968     btgatt_adv_filter_cb_t btif_filt_cb;
   1969     memset(&btif_filt_cb, 0, sizeof(btgatt_adv_filter_cb_t));
   1970     btif_filt_cb.client_if = client_if;
   1971     if (true == enable)
   1972         action = 1;
   1973     btif_filt_cb.action = action;
   1974     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE,
   1975                                  (char*) &btif_filt_cb, sizeof(btgatt_adv_filter_cb_t), NULL);
   1976 }
   1977 
   1978 static bt_status_t btif_gattc_set_scan_parameters(int client_if, int scan_interval,
   1979                                                   int scan_window)
   1980 {
   1981     CHECK_BTGATT_INIT();
   1982     btif_gattc_cb_t btif_cb;
   1983     btif_cb.client_if = client_if;
   1984     btif_cb.scan_interval = scan_interval;
   1985     btif_cb.scan_window = scan_window;
   1986     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SET_SCAN_PARAMS,
   1987                                  (char*) &btif_cb, sizeof(btif_gattc_cb_t), NULL);
   1988 }
   1989 
   1990 static int btif_gattc_get_device_type( const bt_bdaddr_t *bd_addr )
   1991 {
   1992     int device_type = 0;
   1993     char bd_addr_str[18] = {0};
   1994 
   1995     bdaddr_to_string(bd_addr, bd_addr_str, sizeof(bd_addr_str));
   1996     if (btif_config_get_int(bd_addr_str, "DevType", &device_type))
   1997         return device_type;
   1998     return 0;
   1999 }
   2000 
   2001 static bt_status_t btif_gattc_multi_adv_enable(int client_if, int min_interval, int max_interval,
   2002                                             int adv_type, int chnl_map, int tx_power, int timeout_s)
   2003 {
   2004     CHECK_BTGATT_INIT();
   2005     btgatt_multi_adv_inst_cb adv_cb;
   2006     memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
   2007     adv_cb.client_if = (uint8_t) client_if;
   2008 
   2009     adv_cb.param.adv_int_min = min_interval;
   2010     adv_cb.param.adv_int_max = max_interval;
   2011     adv_cb.param.adv_type = adv_type;
   2012     adv_cb.param.channel_map = chnl_map;
   2013     adv_cb.param.adv_filter_policy = 0;
   2014     adv_cb.param.tx_power = tx_power;
   2015     adv_cb.timeout_s = timeout_s;
   2016     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_ENABLE,
   2017                              (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
   2018 }
   2019 
   2020 static bt_status_t btif_gattc_multi_adv_update(int client_if, int min_interval, int max_interval,
   2021                                             int adv_type, int chnl_map,int tx_power, int timeout_s)
   2022 {
   2023     CHECK_BTGATT_INIT();
   2024     btgatt_multi_adv_inst_cb adv_cb;
   2025     memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
   2026     adv_cb.client_if = (uint8_t) client_if;
   2027 
   2028     adv_cb.param.adv_int_min = min_interval;
   2029     adv_cb.param.adv_int_max = max_interval;
   2030     adv_cb.param.adv_type = adv_type;
   2031     adv_cb.param.channel_map = chnl_map;
   2032     adv_cb.param.adv_filter_policy = 0;
   2033     adv_cb.param.tx_power = tx_power;
   2034     adv_cb.timeout_s = timeout_s;
   2035     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_UPDATE,
   2036                          (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
   2037 }
   2038 
   2039 static bt_status_t btif_gattc_multi_adv_setdata(int client_if, bool set_scan_rsp,
   2040                 bool include_name, bool incl_txpower, int appearance,
   2041                 int manufacturer_len, char* manufacturer_data,
   2042                 int service_data_len, char* service_data,
   2043                 int service_uuid_len, char* service_uuid)
   2044 {
   2045     CHECK_BTGATT_INIT();
   2046 
   2047     btif_adv_data_t multi_adv_data_inst;
   2048     memset(&multi_adv_data_inst, 0, sizeof(multi_adv_data_inst));
   2049 
   2050     const int min_interval = 0;
   2051     const int max_interval = 0;
   2052 
   2053     btif_gattc_adv_data_packager(client_if, set_scan_rsp, include_name, incl_txpower,
   2054         min_interval, max_interval, appearance, manufacturer_len, manufacturer_data,
   2055         service_data_len, service_data, service_uuid_len, service_uuid, &multi_adv_data_inst);
   2056 
   2057     bt_status_t status = btif_transfer_context(
   2058         btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_SET_DATA,
   2059         (char *)&multi_adv_data_inst, sizeof(multi_adv_data_inst),
   2060         btif_gattc_deep_copy);
   2061     btif_gattc_adv_data_cleanup(&multi_adv_data_inst);
   2062     return status;
   2063 }
   2064 
   2065 static bt_status_t btif_gattc_multi_adv_disable(int client_if)
   2066 {
   2067     CHECK_BTGATT_INIT();
   2068     btgatt_multi_adv_inst_cb adv_cb;
   2069     memset(&adv_cb, 0, sizeof(btgatt_multi_adv_inst_cb));
   2070     adv_cb.client_if = (uint8_t) client_if;
   2071 
   2072     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ADV_INSTANCE_DISABLE,
   2073                            (char*) &adv_cb, sizeof(btgatt_multi_adv_inst_cb), NULL);
   2074 }
   2075 
   2076 static bt_status_t btif_gattc_cfg_storage(int client_if,int batch_scan_full_max,
   2077     int batch_scan_trunc_max, int batch_scan_notify_threshold)
   2078 {
   2079     CHECK_BTGATT_INIT();
   2080     btgatt_batch_track_cb_t bt_scan_cb;
   2081     memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
   2082     bt_scan_cb.client_if = (uint8_t) client_if;
   2083     bt_scan_cb.batch_scan_full_max = batch_scan_full_max;
   2084     bt_scan_cb.batch_scan_trunc_max = batch_scan_trunc_max;
   2085     bt_scan_cb.batch_scan_notify_threshold = batch_scan_notify_threshold;
   2086     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_CONFIG_STORAGE_PARAMS,
   2087                                  (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
   2088 }
   2089 
   2090 static bt_status_t btif_gattc_enb_batch_scan(int client_if,int scan_mode, int scan_interval,
   2091                 int scan_window, int addr_type, int discard_rule)
   2092 {
   2093     CHECK_BTGATT_INIT();
   2094     btgatt_batch_track_cb_t bt_scan_cb;
   2095     memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
   2096     bt_scan_cb.client_if = (uint8_t) client_if;
   2097     bt_scan_cb.scan_mode = scan_mode;
   2098     bt_scan_cb.scan_interval = scan_interval;
   2099     bt_scan_cb.scan_window = scan_window;
   2100     bt_scan_cb.discard_rule = discard_rule;
   2101     bt_scan_cb.addr_type = addr_type;
   2102     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_ENABLE_BATCH_SCAN,
   2103                                  (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
   2104 }
   2105 
   2106 static bt_status_t btif_gattc_dis_batch_scan(int client_if)
   2107 {
   2108     CHECK_BTGATT_INIT();
   2109     btgatt_batch_track_cb_t bt_scan_cb;
   2110     memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
   2111     bt_scan_cb.client_if = (uint8_t) client_if;
   2112     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_DISABLE_BATCH_SCAN,
   2113                                  (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
   2114 }
   2115 
   2116 static bt_status_t btif_gattc_read_batch_scan_reports(int client_if, int scan_mode)
   2117 {
   2118     CHECK_BTGATT_INIT();
   2119     btgatt_batch_track_cb_t bt_scan_cb;
   2120     memset(&bt_scan_cb, 0, sizeof(btgatt_batch_track_cb_t));
   2121     bt_scan_cb.client_if = (uint8_t) client_if;
   2122     bt_scan_cb.scan_mode = scan_mode;
   2123     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_READ_BATCH_SCAN_REPORTS,
   2124                                  (char*) &bt_scan_cb, sizeof(btgatt_batch_track_cb_t), NULL);
   2125 }
   2126 
   2127 extern bt_status_t btif_gattc_test_command_impl(int command, btgatt_test_params_t* params);
   2128 
   2129 static bt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params)
   2130 {
   2131     return btif_gattc_test_command_impl(command, params);
   2132 }
   2133 
   2134 const btgatt_client_interface_t btgattClientInterface = {
   2135     btif_gattc_register_app,
   2136     btif_gattc_unregister_app,
   2137     btif_gattc_scan,
   2138     btif_gattc_open,
   2139     btif_gattc_close,
   2140     btif_gattc_listen,
   2141     btif_gattc_refresh,
   2142     btif_gattc_search_service,
   2143     btif_gattc_read_char,
   2144     btif_gattc_write_char,
   2145     btif_gattc_read_char_descr,
   2146     btif_gattc_write_char_descr,
   2147     btif_gattc_execute_write,
   2148     btif_gattc_reg_for_notification,
   2149     btif_gattc_dereg_for_notification,
   2150     btif_gattc_read_remote_rssi,
   2151     btif_gattc_scan_filter_param_setup,
   2152     btif_gattc_scan_filter_add_remove,
   2153     btif_gattc_scan_filter_clear,
   2154     btif_gattc_scan_filter_enable,
   2155     btif_gattc_get_device_type,
   2156     btif_gattc_set_adv_data,
   2157     btif_gattc_configure_mtu,
   2158     btif_gattc_conn_parameter_update,
   2159     btif_gattc_set_scan_parameters,
   2160     btif_gattc_multi_adv_enable,
   2161     btif_gattc_multi_adv_update,
   2162     btif_gattc_multi_adv_setdata,
   2163     btif_gattc_multi_adv_disable,
   2164     btif_gattc_cfg_storage,
   2165     btif_gattc_enb_batch_scan,
   2166     btif_gattc_dis_batch_scan,
   2167     btif_gattc_read_batch_scan_reports,
   2168     btif_gattc_test_command,
   2169     btif_gattc_get_gatt_db
   2170 };
   2171 
   2172 #endif
   2173