btif_gatt_client.cc revision 6bd442f543972b072ef2cbbcf2f7c91202de1045
1ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************
2ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
3c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji *  Copyright (C) 2009-2014 Broadcom Corporation
4ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
5ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Licensed under the Apache License, Version 2.0 (the "License");
6ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  you may not use this file except in compliance with the License.
7ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  You may obtain a copy of the License at:
8ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
9ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  http://www.apache.org/licenses/LICENSE-2.0
10ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
11ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Unless required by applicable law or agreed to in writing, software
12ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  distributed under the License is distributed on an "AS IS" BASIS,
13ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  See the License for the specific language governing permissions and
15ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  limitations under the License.
16ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
17ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ******************************************************************************/
18ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
19ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
20ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
21ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Filename:      btif_gatt_client.c
22ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
23ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *  Description:   GATT client implementation
24ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *
25ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *******************************************************************************/
26ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2749120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_btif_gattc"
2849120dc867c7818511b5afec461dfc97d17eef58Marie Janssen
29140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/at_exit.h>
30140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/bind.h>
31140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/threading/thread.h>
3249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <errno.h>
33ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <hardware/bluetooth.h>
34ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdio.h>
35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <stdlib.h>
36ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <string.h>
37ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski#include <unordered_set>
386ed1548be2295fc1bec14f10cd0fade4f63daa6aSatya Calloji#include "device/include/controller.h"
396ed1548be2295fc1bec14f10cd0fade4f63daa6aSatya Calloji
4095b74f252f534ec757aab1fc08e086e02b2cfe8dSharvil Nanavati#include "btcore/include/bdaddr.h"
41ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_common.h"
42ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_util.h"
43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
44b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen#if (BLE_INCLUDED == TRUE)
45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
466975b4d711142b885af479721cada448952c6b41Andre Eisenbach#include <hardware/bt_gatt.h>
47db554581079863974af8e1289646f5deea6fc044Marie Janssen
48ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bta_api.h"
49ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bta_gatt_api.h"
50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_config.h"
51db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_dm.h"
52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt.h"
53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_gatt_util.h"
54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btif_storage.h"
5544802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h"
56b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach#include "vendor_api.h"
57b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
58140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowskiusing base::Bind;
59140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowskiusing base::Owned;
6026ecec06be48502eba1c24a6b1fdbb66eafa8032Jakub Pawlowskiusing std::vector;
61140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski
626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonextern bt_status_t do_in_jni_thread(const base::Closure& task);
6344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskiextern bt_status_t btif_gattc_test_command_impl(int command,
646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                                btgatt_test_params_t* params);
656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonextern const btgatt_callbacks_t* bt_gatt_callbacks;
66140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski
67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Constants & Macros
696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *******************************************************************************/
70ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
71da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski#define CLI_CBACK_IN_JNI(P_CBACK, ...)                                       \
72da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  if (bt_gatt_callbacks && bt_gatt_callbacks->client->P_CBACK) {             \
73da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski    BTIF_TRACE_API("HAL bt_gatt_callbacks->client->%s", #P_CBACK);           \
74da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski    do_in_jni_thread(Bind(bt_gatt_callbacks->client->P_CBACK, __VA_ARGS__)); \
75da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  } else {                                                                   \
76da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski    ASSERTC(0, "Callback is NULL", 0);                                       \
77da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  }
78da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski
796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define CHECK_BTGATT_INIT()                                    \
806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (bt_gatt_callbacks == NULL) {                             \
81b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    LOG_WARN(LOG_TAG, "%s: BTGATT not initialized", __func__); \
826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return BT_STATUS_NOT_READY;                                \
836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  } else {                                                     \
84b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    LOG_VERBOSE(LOG_TAG, "%s", __func__);                      \
8544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  }
86ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define BLE_RESOLVE_ADDR_MSB                                                   \
886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  0x40                             /* bit7, bit6 is 01 to be resolvable random \
8944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                      */
9044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski#define BLE_RESOLVE_ADDR_MASK 0xc0 /* bit 6, and bit7 */
9144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski#define BTM_BLE_IS_RESOLVE_BDA(x) \
9263b0519c3f0d1c0cc523e0e9553c60fc68651accChih-Hung Hsieh  (((x)[0] & BLE_RESOLVE_ADDR_MASK) == BLE_RESOLVE_ADDR_MSB)
93ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
94ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowskinamespace std {
95ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowskitemplate <>
96ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowskistruct hash<bt_bdaddr_t> {
976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  size_t operator()(const bt_bdaddr_t& f) const {
98ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski    return f.address[0] + f.address[1] + f.address[2] + f.address[3] +
99ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski           f.address[4] + f.address[5];
100ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  }
101ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski};
102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskitemplate <>
104ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowskistruct equal_to<bt_bdaddr_t> {
1056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  size_t operator()(const bt_bdaddr_t& x, const bt_bdaddr_t& y) const {
106ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski    return memcmp(x.address, y.address, BD_ADDR_LEN);
107ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  }
108ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski};
109ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski}
110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
11144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskinamespace {
112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
11344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskistd::unordered_set<bt_bdaddr_t> p_dev_cb;
11444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskiuint8_t rssi_request_client_if;
115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
11644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibtgattc_error_t btif_gattc_translate_btm_status(tBTM_STATUS status) {
11744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  switch (status) {
11844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_SUCCESS:
11944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_SUCCESS_NO_SECURITY:
12044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_COMMAND_SUCCESS;
121979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
12244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_CMD_STARTED:
12344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_COMMAND_STARTED;
124979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
12544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_BUSY:
12644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_COMMAND_BUSY;
127979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
12844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_CMD_STORED:
12944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_COMMAND_STORED;
130979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
13144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_NO_RESOURCES:
13244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_NO_RESOURCES;
133979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
13444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_MODE_UNSUPPORTED:
13544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_WRONG_MODE:
13644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_MODE4_LEVEL4_NOT_SUPPORTED:
13744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_MODE_UNSUPPORTED;
138979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
13944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_ILLEGAL_VALUE:
14044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_SCO_BAD_LENGTH:
14144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_ILLEGAL_VALUE;
142979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
14344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_UNKNOWN_ADDR:
14444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_UNKNOWN_ADDR;
145979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
14644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_DEVICE_TIMEOUT:
14744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_DEVICE_TIMEOUT;
148979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
14944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_FAILED_ON_SECURITY:
15044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_REPEATED_ATTEMPTS:
15144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_NOT_AUTHORIZED:
15244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_SECURITY_ERROR;
153979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
15444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_DEV_RESET:
15544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_ILLEGAL_ACTION:
15644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_INCORRECT_STATE;
157979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
15844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_BAD_VALUE_RET:
15944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_INVALID_CONTROLLER_OUTPUT;
160979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
16144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_DELAY_CHECK:
16244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_DELAYED_ENCRYPTION_CHECK;
163979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
16444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTM_ERR_PROCESSING:
16544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    default:
16644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      return BT_GATTC_ERR_PROCESSING;
16744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  }
168979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach}
169979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
17044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_init_dev_cb(void) { p_dev_cb.clear(); }
171c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
17244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_add_remote_bdaddr(BD_ADDR p_bda, uint8_t addr_type) {
173ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  bt_bdaddr_t bd_addr;
174ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  memcpy(bd_addr.address, p_bda, BD_ADDR_LEN);
175ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  p_dev_cb.insert(bd_addr);
176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
178b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenbool btif_gattc_find_bdaddr(BD_ADDR p_bda) {
179ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  bt_bdaddr_t bd_addr;
180ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  memcpy(bd_addr.address, p_bda, BD_ADDR_LEN);
181ce7d46a263d8e0e7877b62b99b046c7e08ee75f8Jakub Pawlowski  return (p_dev_cb.count(bd_addr) != 0);
182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_gattc_upstreams_evt(uint16_t event, char* p_param) {
185b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  LOG_VERBOSE(LOG_TAG, "%s: Event %d", __func__, event);
186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  tBTA_GATTC* p_data = (tBTA_GATTC*)p_param;
18844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  switch (event) {
18944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_REG_EVT: {
19044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bt_uuid_t app_uuid;
19144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bta_to_btif_uuid(&app_uuid, &p_data->reg_oper.app_uuid);
19244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->register_client_cb,
19344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->reg_oper.status, p_data->reg_oper.client_if, &app_uuid);
19444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
19544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
19744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_DEREG_EVT:
19844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_EXEC_EVT: {
20144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->execute_write_cb,
20244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->exec_cmpl.conn_id, p_data->exec_cmpl.status);
20344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
20444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_SEARCH_CMPL_EVT: {
20744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->search_complete_cb,
20844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
20944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
21044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
211ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
21244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_NOTIF_EVT: {
21344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      btgatt_notify_params_t data;
214ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
21544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bdcpy(data.bda.address, p_data->notify.bda);
21644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      memcpy(data.value, p_data->notify.value, p_data->notify.len);
217ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
21844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      data.handle = p_data->notify.handle;
21944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      data.is_notify = p_data->notify.is_notify;
22044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      data.len = p_data->notify.len;
221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
22244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->notify_cb, p_data->notify.conn_id,
22344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                &data);
224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
225b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen      if (p_data->notify.is_notify == false)
22644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski        BTA_GATTC_SendIndConfirm(p_data->notify.conn_id, p_data->notify.handle);
2279dc998503590163068845827d951fc2f05a17bdaJakub Pawlowski
22844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
22944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
23144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_OPEN_EVT: {
23244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bt_bdaddr_t bda;
23344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bdcpy(bda.address, p_data->open.remote_bda);
234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
23544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->open_cb, p_data->open.conn_id,
23644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->open.status, p_data->open.client_if, &bda);
2376975b4d711142b885af479721cada448952c6b41Andre Eisenbach
23844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      if (GATT_DEF_BLE_MTU_SIZE != p_data->open.mtu && p_data->open.mtu) {
23944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski        HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb,
24044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                  p_data->open.conn_id, p_data->open.status, p_data->open.mtu);
24144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      }
2429426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
24344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      if (p_data->open.status == BTA_GATT_OK)
24444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski        btif_gatt_check_encrypted_link(p_data->open.remote_bda,
24544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                       p_data->open.transport);
24644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
24744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
24944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_CLOSE_EVT: {
25044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bt_bdaddr_t bda;
25144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      bdcpy(bda.address, p_data->close.remote_bda);
25244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->close_cb, p_data->close.conn_id,
25344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->status, p_data->close.client_if, &bda);
25444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
25544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
25744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_ACL_EVT:
25844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      LOG_DEBUG(LOG_TAG, "BTA_GATTC_ACL_EVT: status = %d", p_data->status);
25944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      /* Ignore for now */
26044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
2619426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
26244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_CANCEL_OPEN_EVT:
26344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
26417b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
26544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_LISTEN_EVT: {
26644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->listen_cb, p_data->reg_oper.status,
26744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->reg_oper.client_if);
26844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
26944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    }
27017b04bd498405f2bb109a85562ebbdcb6bb06e95Andre Eisenbach
27144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_CFG_MTU_EVT: {
27244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->configure_mtu_cb,
27344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->cfg_mtu.conn_id, p_data->cfg_mtu.status,
27444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->cfg_mtu.mtu);
27544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2778444d1e649864c28b0c124bc2d16f7c153f01f14Andre Eisenbach
27844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    case BTA_GATTC_CONGEST_EVT:
27944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      HAL_CBACK(bt_gatt_callbacks, client->congestion_cb,
28044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                p_data->congest.conn_id, p_data->congest.congested);
28144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
28244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski
28344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    default:
284b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen      LOG_ERROR(LOG_TAG, "%s: Unhandled event (%d)!", __func__, event);
28544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski      break;
28644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  }
287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid bta_gattc_cback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data) {
29024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  bt_status_t status =
29124ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski      btif_transfer_context(btif_gattc_upstreams_evt, (uint16_t)event,
2926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                            (char*)p_data, sizeof(tBTA_GATTC), NULL);
29344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status);
294ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
295ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
29644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_batch_scan_setup_cb(tBTA_BLE_BATCH_SCAN_EVT evt,
29744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                             tBTA_DM_BLE_REF_VALUE ref_value,
29844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                             tBTA_STATUS status) {
2995f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  BTIF_TRACE_DEBUG("bta_batch_scan_setup_cb-Status:%x, client_if:%d, evt=%d",
3005f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski                   status, ref_value, evt);
301c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3025f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  switch (evt) {
3035f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    case BTA_BLE_BATCH_SCAN_ENB_EVT: {
3045f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      CLI_CBACK_IN_JNI(batchscan_enb_disable_cb, 1, ref_value, status);
3055f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
3065f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    }
307c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3085f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    case BTA_BLE_BATCH_SCAN_DIS_EVT: {
3095f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      CLI_CBACK_IN_JNI(batchscan_enb_disable_cb, 0, ref_value, status);
3105f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
3115f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    }
312c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3135f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    case BTA_BLE_BATCH_SCAN_CFG_STRG_EVT: {
3145f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      CLI_CBACK_IN_JNI(batchscan_cfg_storage_cb, ref_value, status);
3155f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
3165f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    }
317c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3185f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    case BTA_BLE_BATCH_SCAN_DATA_EVT: {
3196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      CLI_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, 0, 0,
3206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                       vector<uint8_t>());
3215f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
322c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    }
323c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3245f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    case BTA_BLE_BATCH_SCAN_THRES_EVT: {
3255f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      CLI_CBACK_IN_JNI(batchscan_threshold_cb, ref_value);
3265f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
3275f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    }
328c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
3295f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    default:
3305f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski      return;
3315f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  }
332c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
333c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
33444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_batch_scan_threshold_cb(tBTA_DM_BLE_REF_VALUE ref_value) {
33544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  CLI_CBACK_IN_JNI(batchscan_threshold_cb, ref_value);
336c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
337c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
33844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value,
339b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen                               uint8_t report_format, uint8_t num_records,
3406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                               uint16_t data_len, uint8_t* p_rep_data,
34144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                               tBTA_STATUS status) {
3426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_DEBUG("%s - client_if:%d, %d, %d, %d", __func__, ref_value, status,
3436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                   num_records, data_len);
3445f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski
3455f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  if (data_len > 0) {
34616102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski    vector<uint8_t> data(p_rep_data, p_rep_data + data_len);
3475f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    osi_free(p_rep_data);
3485f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski
3495f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    CLI_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format,
35016102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                     num_records, std::move(data));
3515f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  } else {
3525f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski    CLI_CBACK_IN_JNI(batchscan_reports_cb, ref_value, status, report_format,
35316102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                     num_records, vector<uint8_t>());
3545f848b4d24f596d56da335ee07dd976b3101cfd2Jakub Pawlowski  }
355c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
356c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
35744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_scan_results_cb_impl(bt_bdaddr_t bd_addr, tBT_DEVICE_TYPE device_type,
35816102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                              int8_t rssi, uint8_t addr_type,
35916102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                              vector<uint8_t> value) {
36092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  uint8_t remote_name_len;
3616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  const uint8_t* p_eir_remote_name = NULL;
36292519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  bt_device_type_t dev_type;
36392519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  bt_property_t properties;
364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
3656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  p_eir_remote_name = BTM_CheckEirData(
3666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      value.data(), BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
367ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
36892519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  if (p_eir_remote_name == NULL) {
3696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    p_eir_remote_name = BTM_CheckEirData(
3706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        value.data(), BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
37192519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  }
372ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
37392519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  if ((addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name)) {
37492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    if (!btif_gattc_find_bdaddr(bd_addr.address)) {
37592519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski      btif_gattc_add_remote_bdaddr(bd_addr.address, addr_type);
37692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
37792519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski      if (p_eir_remote_name) {
37892519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski        bt_bdname_t bdname;
37992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski        memcpy(bdname.name, p_eir_remote_name, remote_name_len);
38092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski        bdname.name[remote_name_len] = '\0';
38192519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
3826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        LOG_VERBOSE(LOG_TAG, "%s BLE device name=%s len=%d dev_type=%d",
3836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                    __func__, bdname.name, remote_name_len, device_type);
38492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski        btif_dm_update_ble_remote_properties(bd_addr.address, bdname.name,
38592519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski                                             device_type);
38692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski      }
38792519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    }
38892519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  }
38992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
39092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  dev_type = (bt_device_type_t)device_type;
39192519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  BTIF_STORAGE_FILL_PROPERTY(&properties, BT_PROPERTY_TYPE_OF_DEVICE,
39292519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski                             sizeof(dev_type), &dev_type);
39392519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  btif_storage_set_remote_device_property(&(bd_addr), &properties);
39492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
39592519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  btif_storage_set_remote_addr_type(&bd_addr, addr_type);
39692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
3976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  HAL_CBACK(bt_gatt_callbacks, client->scan_result_cb, &bd_addr, rssi,
3986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            std::move(value));
39992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski}
40092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
4016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid bta_scan_results_cb(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) {
40292519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  uint8_t len;
40392519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
40492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  if (event == BTA_DM_INQ_CMPL_EVT) {
40592519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    BTIF_TRACE_DEBUG("%s  BLE observe complete. Num Resp %d", __func__,
40692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski                     p_data->inq_cmpl.num_resps);
40792519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    return;
40892519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  }
40992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
41092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  if (event != BTA_DM_INQ_RES_EVT) {
411b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __func__, event);
41292519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    return;
41392519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  }
41492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
41516102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  vector<uint8_t> value(BTGATT_MAX_ATTR_LEN);
41692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  if (p_data->inq_res.p_eir) {
4176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    value.insert(value.begin(), p_data->inq_res.p_eir,
4186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                 p_data->inq_res.p_eir + 62);
41992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
42092519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski    if (BTM_CheckEirData(p_data->inq_res.p_eir,
42192519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski                         BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &len)) {
422b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen      p_data->inq_res.remt_name_not_required = true;
423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
42492519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  }
42592519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski
42692519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  bt_bdaddr_t bdaddr;
42792519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  bdcpy(bdaddr.address, p_data->inq_res.bd_addr);
42892519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski  do_in_jni_thread(Bind(bta_scan_results_cb_impl, bdaddr,
42992519cc7f18867e9e1897f63f212c8e0a221bdf7Jakub Pawlowski                        p_data->inq_res.device_type, p_data->inq_res.rssi,
43016102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                        p_data->inq_res.ble_addr_type, std::move(value)));
431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid bta_track_adv_event_cb(tBTA_DM_BLE_TRACK_ADV_DATA* p_track_adv_data) {
4346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  btgatt_track_adv_info_t* btif_scan_track_cb = new btgatt_track_adv_info_t;
4354ed8924e9d820df37f03230dece6fd68eb1fc4dfJakub Pawlowski
436b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTIF_TRACE_DEBUG("%s", __func__);
4374ed8924e9d820df37f03230dece6fd68eb1fc4dfJakub Pawlowski  btif_gatt_move_track_adv_data(btif_scan_track_cb,
4386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                (btgatt_track_adv_info_t*)p_track_adv_data);
439f538707fe64c62b1dbb8e4210e4a1bfa0bab2b56Satya Calloji
4404ed8924e9d820df37f03230dece6fd68eb1fc4dfJakub Pawlowski  CLI_CBACK_IN_JNI(track_adv_event_cb, Owned(btif_scan_track_cb));
4411acb61ce065053f91a0f8d43e8328c9eeec4b5edSatya Calloji}
4421acb61ce065053f91a0f8d43e8328c9eeec4b5edSatya Calloji
4436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btm_read_rssi_cb(tBTM_RSSI_RESULTS* p_result) {
4446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (!p_result) return;
4457294d958dcb610d7828f06c3a1cde933127694d3Jakub Pawlowski
4466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  bt_bdaddr_t* addr = new bt_bdaddr_t;
447c171ac407cfc6d30a11af6b12ead39688eb897f7Jakub Pawlowski  bdcpy(addr->address, p_result->rem_bda);
448c171ac407cfc6d30a11af6b12ead39688eb897f7Jakub Pawlowski  CLI_CBACK_IN_JNI(read_remote_rssi_cb, rssi_request_client_if,
449c171ac407cfc6d30a11af6b12ead39688eb897f7Jakub Pawlowski                   base::Owned(addr), p_result->rssi, p_result->status);
450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
45244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_scan_param_setup_cb(tGATT_IF client_if, tBTM_STATUS status) {
453da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  CLI_CBACK_IN_JNI(scan_parameter_setup_completed_cb, client_if,
454da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski                   btif_gattc_translate_btm_status(status));
455979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach}
456979e3421c8111a56ebfcf176f6383df58eed52eaAndre Eisenbach
45744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid bta_scan_filt_cfg_cb(tBTA_DM_BLE_PF_ACTION action,
45844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                          tBTA_DM_BLE_SCAN_COND_OP cfg_op,
45944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                          tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
46044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                          tBTA_STATUS status, tBTA_DM_BLE_REF_VALUE ref_value) {
461da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  CLI_CBACK_IN_JNI(scan_filter_cfg_cb, action, ref_value, status, cfg_op,
462da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski                   avbl_space);
4631a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
4641a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
465b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenvoid bta_scan_filt_param_setup_cb(uint8_t action_type,
46644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                  tBTA_DM_BLE_PF_AVBL_SPACE avbl_space,
46744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                  tBTA_DM_BLE_REF_VALUE ref_value,
46844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                  tBTA_STATUS status) {
469da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  CLI_CBACK_IN_JNI(scan_filter_param_cb, action_type, ref_value, status,
470da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski                   avbl_space);
4711a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
4721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
473b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenvoid bta_scan_filt_status_cb(uint8_t action, tBTA_STATUS status,
47444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                             tBTA_DM_BLE_REF_VALUE ref_value) {
475da5b59b5bf9cb34574c16ba784c1484055fcb1e3Jakub Pawlowski  CLI_CBACK_IN_JNI(scan_filter_status_cb, action, ref_value, status);
476b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
4796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Client API Functions
4806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *******************************************************************************/
481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
48244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_register_app_impl(tBT_UUID uuid) {
483c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  BTA_GATTC_AppRegister(&uuid, bta_gattc_cback);
484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_register_app(bt_uuid_t* uuid) {
487c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  CHECK_BTGATT_INIT();
488c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski
489c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  tBT_UUID bt_uuid;
490c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  btif_to_bta_uuid(&bt_uuid, uuid);
491c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  return do_in_jni_thread(Bind(&btif_gattc_register_app_impl, bt_uuid));
492c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski}
493c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski
49444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_unregister_app_impl(int client_if) {
495c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  BTA_GATTC_AppDeregister(client_if);
496c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski}
497c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski
49844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_unregister_app(int client_if) {
499c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  CHECK_BTGATT_INIT();
500c8b5185a5d4c4c9c15f3ec5df4acd37c1d46f1f1Jakub Pawlowski  return do_in_jni_thread(Bind(&btif_gattc_unregister_app_impl, client_if));
501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
50344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_scan(bool start) {
504955ff4e88ef7391632e19d1b0234cae40b6f42c1Jakub Pawlowski  CHECK_BTGATT_INIT();
505955ff4e88ef7391632e19d1b0234cae40b6f42c1Jakub Pawlowski  if (start) {
506955ff4e88ef7391632e19d1b0234cae40b6f42c1Jakub Pawlowski    btif_gattc_init_dev_cb();
507b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    return do_in_jni_thread(Bind(&BTA_DmBleObserve, true, 0,
5086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                 (tBTA_DM_SEARCH_CBACK*)bta_scan_results_cb));
509955ff4e88ef7391632e19d1b0234cae40b6f42c1Jakub Pawlowski  } else {
510b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    return do_in_jni_thread(Bind(&BTA_DmBleObserve, false, 0, nullptr));
511955ff4e88ef7391632e19d1b0234cae40b6f42c1Jakub Pawlowski  }
512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
51444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_open_impl(int client_if, BD_ADDR address, bool is_direct,
51544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                          int transport_p) {
51626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  // Ensure device is in inquiry database
51726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  int addr_type = 0;
51826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  int device_type = 0;
51926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  tBTA_GATT_TRANSPORT transport = (tBTA_GATT_TRANSPORT)BTA_GATT_TRANSPORT_LE;
52026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
52126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  if (btif_get_address_type(address, &addr_type) &&
52226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      btif_get_device_type(address, &device_type) &&
52326e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      device_type != BT_DEVICE_TYPE_BREDR) {
52426e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    BTA_DmAddBleDevice(address, addr_type, device_type);
52526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  }
52626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
52726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  // Check for background connections
52826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  if (!is_direct) {
52926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    // Check for privacy 1.0 and 1.1 controller and do not start background
53026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    // connection if RPA offloading is not supported, since it will not
53126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    // connect after change of random address
53226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    if (!controller_get_interface()->supports_ble_privacy() &&
53344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski        (addr_type == BLE_ADDR_RANDOM) && BTM_BLE_IS_RESOLVE_BDA(address)) {
53426e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      tBTM_BLE_VSC_CB vnd_capabilities;
53526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      BTM_BleGetVendorCapabilities(&vnd_capabilities);
53626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      if (!vnd_capabilities.rpa_offloading) {
53726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        HAL_CBACK(bt_gatt_callbacks, client->open_cb, 0, BT_STATUS_UNSUPPORTED,
5386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  client_if, (bt_bdaddr_t*)&address);
53926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        return;
54026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      }
54126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    }
54226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    BTA_DmBleSetBgConnType(BTM_BLE_CONN_AUTO, NULL);
54326e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  }
54426e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
54526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  // Determine transport
54626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  if (transport_p != GATT_TRANSPORT_AUTO) {
54726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    transport = transport_p;
54826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  } else {
54926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    switch (device_type) {
55026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      case BT_DEVICE_TYPE_BREDR:
55126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        transport = BTA_GATT_TRANSPORT_BR_EDR;
55226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        break;
55326e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
55426e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      case BT_DEVICE_TYPE_BLE:
55526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        transport = BTA_GATT_TRANSPORT_LE;
55626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        break;
55726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
55826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski      case BT_DEVICE_TYPE_DUMO:
55926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        if (transport == GATT_TRANSPORT_LE)
56026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski          transport = BTA_GATT_TRANSPORT_LE;
56126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        else
56226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski          transport = BTA_GATT_TRANSPORT_BR_EDR;
56326e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski        break;
56426e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski    }
56526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  }
56626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
56726e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  // Connect!
56826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  BTIF_TRACE_DEBUG("%s Transport=%d, device type=%d", __func__, transport,
56926e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski                   device_type);
57026e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  BTA_GATTC_Open(client_if, address, is_direct, transport);
57126e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski}
57226e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski
5736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_open(int client_if, const bt_bdaddr_t* bd_addr,
57444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                            bool is_direct, int transport) {
57526e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  CHECK_BTGATT_INIT();
57626e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  // Closure will own this value and free it.
5776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
57826e51cb18509e7e04755b4fa4250c60f105ab9d2Jakub Pawlowski  bdcpy(address, bd_addr->address);
57944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  return do_in_jni_thread(Bind(&btif_gattc_open_impl, client_if,
58044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                               base::Owned(address), is_direct, transport));
581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
58344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_close_impl(int client_if, BD_ADDR address, int conn_id) {
584b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  // Disconnect established connections
585b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  if (conn_id != 0)
586b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski    BTA_GATTC_Close(conn_id);
587b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  else
588b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen    BTA_GATTC_CancelOpen(client_if, address, true);
589b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski
590b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  // Cancel pending background connections (remove from whitelist)
591b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTA_GATTC_CancelOpen(client_if, address, false);
592b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski}
593b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski
5946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_close(int client_if, const bt_bdaddr_t* bd_addr,
59544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                             int conn_id) {
596b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  CHECK_BTGATT_INIT();
597b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  // Closure will own this value and free it.
5986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
599b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  bdcpy(address, bd_addr->address);
600b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski  return do_in_jni_thread(
601b454953bb6620cbafba86351b91d58b47dda107dJakub Pawlowski      Bind(&btif_gattc_close_impl, client_if, base::Owned(address), conn_id));
602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
60444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_listen(int client_if, bool start) {
605144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski  CHECK_BTGATT_INIT();
606144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski#if (defined(BLE_PERIPHERAL_MODE_SUPPORT) && \
607b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen     (BLE_PERIPHERAL_MODE_SUPPORT == true))
608144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_Listen, client_if, start, nullptr));
609144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski#else
610144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_Broadcast, client_if, start));
611144998f68990205ba711e701be6be8325dd6e820Jakub Pawlowski#endif
6125c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach}
6135c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach
6146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_refresh(int client_if, const bt_bdaddr_t* bd_addr) {
615140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski  CHECK_BTGATT_INIT();
616140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski  // Closure will own this value and free it.
6176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
618140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski  bdcpy(address, bd_addr->address);
619140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_Refresh, base::Owned(address)));
620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
6226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_search_service(int conn_id, bt_uuid_t* filter_uuid) {
623d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski  CHECK_BTGATT_INIT();
624d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski
625d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski  if (filter_uuid) {
6266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    tBT_UUID* uuid = new tBT_UUID;
627d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski    btif_to_bta_uuid(uuid, filter_uuid);
628d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski    return do_in_jni_thread(
629d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski        Bind(&BTA_GATTC_ServiceSearchRequest, conn_id, base::Owned(uuid)));
630d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski  } else {
631d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski    return do_in_jni_thread(
632d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski        Bind(&BTA_GATTC_ServiceSearchRequest, conn_id, nullptr));
633d05e50e7df462c928041bf565821d77fb493bc28Jakub Pawlowski  }
634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
63661a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowskivoid btif_gattc_get_gatt_db_impl(int conn_id) {
6376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  btgatt_db_element_t* db = NULL;
63861a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  int count = 0;
63961a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  BTA_GATTC_GetGattDb(conn_id, 0x0000, 0xFFFF, &db, &count);
640533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
64161a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  HAL_CBACK(bt_gatt_callbacks, client->get_gatt_db_cb, conn_id, db, count);
64261a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  osi_free(db);
64361a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski}
64461a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski
64544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_get_gatt_db(int conn_id) {
64661a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  CHECK_BTGATT_INIT();
64761a98132c39d3181a0ea23988ac36fbfef8194b4Jakub Pawlowski  return do_in_jni_thread(Bind(&btif_gattc_get_gatt_db_impl, conn_id));
648533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski}
649533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski
65024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowskivoid read_char_cb(uint16_t conn_id, tGATT_STATUS status, uint16_t handle,
6516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  uint16_t len, uint8_t* value, void* data) {
6526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  btgatt_read_params_t* params = new btgatt_read_params_t;
65324ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->value_type = 0x00 /* GATTC_READ_VALUE_TYPE_VALUE */;
65424ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->status = status;
65524ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->handle = handle;
65624ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->value.len = len;
65724ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  assert(len <= BTGATT_MAX_ATTR_LEN);
65824ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  if (len > 0) memcpy(params->value.value, value, len);
65924ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
66024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  CLI_CBACK_IN_JNI(read_characteristic_cb, conn_id, status,
66124ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski                   base::Owned(params));
66224ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski}
66324ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
66444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_read_char(int conn_id, uint16_t handle, int auth_req) {
66561a112e488a7686e5cc9680434c42895ef9db878Jakub Pawlowski  CHECK_BTGATT_INIT();
66624ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_ReadCharacteristic, conn_id, handle,
66724ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski                               auth_req, read_char_cb, nullptr));
66824ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski}
66924ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
67024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowskivoid read_desc_cb(uint16_t conn_id, tGATT_STATUS status, uint16_t handle,
6716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  uint16_t len, uint8_t* value, void* data) {
6726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  btgatt_read_params_t* params = new btgatt_read_params_t;
67324ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->value_type = 0x00 /* GATTC_READ_VALUE_TYPE_VALUE */;
67424ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->status = status;
67524ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->handle = handle;
67624ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  params->value.len = len;
67724ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  assert(len <= BTGATT_MAX_ATTR_LEN);
67824ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  if (len > 0) memcpy(params->value.value, value, len);
67924ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
68024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  CLI_CBACK_IN_JNI(read_descriptor_cb, conn_id, status, base::Owned(params));
681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
68344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_read_char_descr(int conn_id, uint16_t handle,
68444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                       int auth_req) {
68561a112e488a7686e5cc9680434c42895ef9db878Jakub Pawlowski  CHECK_BTGATT_INIT();
68624ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_ReadCharDescr, conn_id, handle,
68724ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski                               auth_req, read_desc_cb, nullptr));
68824ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski}
68924ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
69024ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowskivoid write_char_cb(uint16_t conn_id, tGATT_STATUS status, uint16_t handle,
6916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                   void* data) {
69224ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  CLI_CBACK_IN_JNI(write_characteristic_cb, conn_id, status, handle);
693ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
69544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_write_char(int conn_id, uint16_t handle, int write_type,
696ec79baaaed83529dae14d492ea2f73aedee9e4d0Jakub Pawlowski                                  int auth_req, vector<uint8_t> value) {
69739a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski  CHECK_BTGATT_INIT();
69839a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski
6996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (value.size() > BTGATT_MAX_ATTR_LEN) value.resize(BTGATT_MAX_ATTR_LEN);
70039a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski
70139a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_WriteCharValue, conn_id, handle,
70224ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski                               write_type, std::move(value), auth_req,
70324ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski                               write_char_cb, nullptr));
70424ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski}
70524ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski
70624ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowskivoid write_descr_cb(uint16_t conn_id, tGATT_STATUS status, uint16_t handle,
7076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                    void* data) {
70824ea892320ca85c7f6cdd77343da50818fe29002Jakub Pawlowski  CLI_CBACK_IN_JNI(write_descriptor_cb, conn_id, status, handle);
709ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
71144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_write_char_descr(int conn_id, uint16_t handle,
712bb920a65b959fbb593403587f89bc3fc7e831732Jakub Pawlowski                                        int auth_req, vector<uint8_t> value) {
713ec79baaaed83529dae14d492ea2f73aedee9e4d0Jakub Pawlowski  CHECK_BTGATT_INIT();
714ec79baaaed83529dae14d492ea2f73aedee9e4d0Jakub Pawlowski
7156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (value.size() > BTGATT_MAX_ATTR_LEN) value.resize(BTGATT_MAX_ATTR_LEN);
71639a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski
71739a33612889a562da5c919f14df24707ba3e6007Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_GATTC_WriteCharDescr, conn_id, handle,
7186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                               std::move(value), auth_req, write_descr_cb,
7196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                               nullptr));
720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
72244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_execute_write(int conn_id, int execute) {
723a684a52231bf0422d991fb16e4dcfc88e4584680Jakub Pawlowski  CHECK_BTGATT_INIT();
724a684a52231bf0422d991fb16e4dcfc88e4584680Jakub Pawlowski  return do_in_jni_thread(
725a684a52231bf0422d991fb16e4dcfc88e4584680Jakub Pawlowski      Bind(&BTA_GATTC_ExecuteWrite, conn_id, (uint8_t)execute));
726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
72844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_reg_for_notification_impl(tBTA_GATTC_IF client_if,
729b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen                                          const BD_ADDR bda, uint16_t handle) {
730ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  tBTA_GATT_STATUS status = BTA_GATTC_RegisterForNotifications(
7316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      client_if, const_cast<uint8_t*>(bda), handle);
732ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
73344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  // TODO(jpawlowski): conn_id is currently unused
734ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
735ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski            /* conn_id */ 0, 1, status, handle);
736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
73844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_reg_for_notification(int client_if,
7396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                            const bt_bdaddr_t* bd_addr,
74044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                            uint16_t handle) {
741ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  CHECK_BTGATT_INIT();
742ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
7436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
744ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  bdcpy(address, bd_addr->address);
745ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  return do_in_jni_thread(
746ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski      Bind(base::IgnoreResult(&btif_gattc_reg_for_notification_impl), client_if,
747ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski           base::Owned(address), handle));
748ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski}
749ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
75044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_dereg_for_notification_impl(tBTA_GATTC_IF client_if,
7516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                            const BD_ADDR bda,
7526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                            uint16_t handle) {
753ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  tBTA_GATT_STATUS status = BTA_GATTC_DeregisterForNotifications(
7546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      client_if, const_cast<uint8_t*>(bda), handle);
755ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
75644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  // TODO(jpawlowski): conn_id is currently unused
757ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  HAL_CBACK(bt_gatt_callbacks, client->register_for_notification_cb,
758ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski            /* conn_id */ 0, 0, status, handle);
759ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski}
760ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
76144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_dereg_for_notification(int client_if,
7626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                              const bt_bdaddr_t* bd_addr,
76344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                              uint16_t handle) {
764ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  CHECK_BTGATT_INIT();
765ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski
7666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
767ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  bdcpy(address, bd_addr->address);
768ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski  return do_in_jni_thread(
769ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski      Bind(base::IgnoreResult(&btif_gattc_dereg_for_notification_impl),
770ca9d889000b087ddb9bedaa716176be986be158fJakub Pawlowski           client_if, base::Owned(address), handle));
771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
77344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_read_remote_rssi(int client_if,
7746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                        const bt_bdaddr_t* bd_addr) {
775c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  CHECK_BTGATT_INIT();
776c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  rssi_request_client_if = client_if;
777c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  // Closure will own this value and free it.
7786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t* address = new BD_ADDR;
779c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  bdcpy(address, bd_addr->address);
780c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  return do_in_jni_thread(Bind(base::IgnoreResult(&BTM_ReadRSSI),
781c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski                               base::Owned(address),
7826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                               (tBTM_CMPL_CB*)btm_read_rssi_cb));
783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
78544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_configure_mtu(int conn_id, int mtu) {
786c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  CHECK_BTGATT_INIT();
787c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski  return do_in_jni_thread(
788c9fe4b6f62c95b195fa99c4fbb75863e547929bfJakub Pawlowski      Bind(base::IgnoreResult(&BTA_GATTC_ConfigureMTU), conn_id, mtu));
7899426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach}
7909426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach
7913021c5a5aac9760e8c4885cbf9c220d1b04dbdb3Jakub Pawlowskivoid btif_gattc_conn_parameter_update_impl(bt_bdaddr_t addr, int min_interval,
7927cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski                                           int max_interval, int latency,
7937cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski                                           int timeout) {
7943021c5a5aac9760e8c4885cbf9c220d1b04dbdb3Jakub Pawlowski  if (BTA_DmGetConnectionState(addr.address))
7956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    BTA_DmBleUpdateConnectionParams(addr.address, min_interval, max_interval,
7966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                    latency, timeout);
7977cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski  else
7986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    BTA_DmSetBlePrefConnParams(addr.address, min_interval, max_interval,
7996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                               latency, timeout);
8007cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski}
8017cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski
8026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_conn_parameter_update(const bt_bdaddr_t* bd_addr,
80344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                             int min_interval, int max_interval,
80444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                             int latency, int timeout) {
8057cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski  CHECK_BTGATT_INIT();
8067cb29a38027f9cb24fc30eefb389f848cfc17082Jakub Pawlowski  return do_in_jni_thread(
8076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      Bind(base::IgnoreResult(&btif_gattc_conn_parameter_update_impl), *bd_addr,
8086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson           min_interval, max_interval, latency, timeout));
80952a2cd609897c04bb6440e14ef2ec8871143d028Andre Eisenbach}
81052a2cd609897c04bb6440e14ef2ec8871143d028Andre Eisenbach
81144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskivoid btif_gattc_scan_filter_param_setup_impl(
8121a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski    int client_if, uint8_t action, int filt_index,
8136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    tBTA_DM_BLE_PF_FILT_PARAMS* adv_filt_param) {
8141a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  if (1 == adv_filt_param->dely_mode)
8151a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski    BTA_DmBleTrackAdvertiser(client_if, bta_track_adv_event_cb);
8161a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  BTA_DmBleScanFilterSetup(action, filt_index, adv_filt_param, NULL,
8171a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski                           bta_scan_filt_param_setup_cb, client_if);
8181a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski}
8191a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski
82044be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_scan_filter_param_setup(
8211a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski    btgatt_filt_param_setup_t filt_param) {
8221a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  CHECK_BTGATT_INIT();
823b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTIF_TRACE_DEBUG("%s", __func__);
8241a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski
8256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  tBTA_DM_BLE_PF_FILT_PARAMS* adv_filt_param = new tBTA_DM_BLE_PF_FILT_PARAMS;
8261a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->feat_seln = filt_param.feat_seln;
8271a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->list_logic_type = filt_param.list_logic_type;
8281a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->filt_logic_type = filt_param.filt_logic_type;
8291a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->rssi_high_thres = filt_param.rssi_high_thres;
8301a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->rssi_low_thres = filt_param.rssi_low_thres;
8311a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->dely_mode = filt_param.dely_mode;
8321a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->found_timeout = filt_param.found_timeout;
8331a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->lost_timeout = filt_param.lost_timeout;
8341a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->found_timeout_cnt = filt_param.found_timeout_cnt;
8351a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  adv_filt_param->num_of_tracking_entries = filt_param.num_of_tracking_entries;
8361a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski
8371a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski  return do_in_jni_thread(
8381a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski      Bind(base::IgnoreResult(&btif_gattc_scan_filter_param_setup_impl),
8391a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski           filt_param.client_if, filt_param.action, filt_param.filt_index,
8401a9e2ac4dab5a74139613f4ff5dde1b979522f0eJakub Pawlowski           base::Owned(adv_filt_param)));
841b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
842b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
843904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowskivoid btif_gattc_scan_filter_add_srvc_uuid(tBT_UUID uuid,
8446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                          tBTA_DM_BLE_PF_COND_MASK* p_uuid_mask,
845904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                          int action, int filt_type,
846904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                          int filt_index, int client_if) {
847904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  tBTA_DM_BLE_PF_COND_PARAM cond;
848904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  memset(&cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
849904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
850904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.srvc_uuid.p_target_addr = NULL;
851904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.srvc_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
852904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.srvc_uuid.uuid = uuid;
853904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.srvc_uuid.p_uuid_mask = p_uuid_mask;
854904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
855904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
856904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                              &bta_scan_filt_cfg_cb, client_if);
857904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski}
858904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
8596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_gattc_scan_filter_add_local_name(vector<uint8_t> data, int action,
8606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                           int filt_type, int filt_index,
8616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                           int client_if) {
862904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  tBTA_DM_BLE_PF_COND_PARAM cond;
863904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  memset(&cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
864904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
86516102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.local_name.data_len = data.size();
86616102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.local_name.p_data = const_cast<uint8_t*>(data.data());
867904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
868904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                              &bta_scan_filt_cfg_cb, client_if);
869904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski}
870904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
871904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowskivoid btif_gattc_scan_filter_add_manu_data(int company_id, int company_id_mask,
87216102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                          vector<uint8_t> pattern,
87316102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                          vector<uint8_t> pattern_mask,
87416102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                          int action, int filt_type,
87516102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                          int filt_index, int client_if) {
876904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  tBTA_DM_BLE_PF_COND_PARAM cond;
877904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  memset(&cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
878904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
879904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.manu_data.company_id = company_id;
880904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  cond.manu_data.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
88116102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.manu_data.data_len = pattern.size();
88216102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.manu_data.p_pattern = const_cast<uint8_t*>(pattern.data());
88316102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.manu_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
884904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
885904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                              &bta_scan_filt_cfg_cb, client_if);
886904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski}
887904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
88816102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowskivoid btif_gattc_scan_filter_add_data_pattern(vector<uint8_t> pattern,
88916102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                             vector<uint8_t> pattern_mask,
89016102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                             int action, int filt_type,
89116102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                             int filt_index, int client_if) {
892904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  tBTA_DM_BLE_PF_COND_PARAM cond;
893904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  memset(&cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
894904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
89516102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.srvc_data.data_len = pattern.size();
89616102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.srvc_data.p_pattern = const_cast<uint8_t*>(pattern.data());
89716102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  cond.srvc_data.p_pattern_mask = const_cast<uint8_t*>(pattern_mask.data());
898904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  BTA_DmBleCfgFilterCondition(action, filt_type, filt_index, &cond,
899904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                              &bta_scan_filt_cfg_cb, client_if);
900904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski}
901904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
90244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_scan_filter_add_remove(
903904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    int client_if, int action, int filt_type, int filt_index, int company_id,
9046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    int company_id_mask, const bt_uuid_t* p_uuid, const bt_uuid_t* p_uuid_mask,
9056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    const bt_bdaddr_t* bd_addr, char addr_type, vector<uint8_t> data,
90616102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski    vector<uint8_t> mask) {
907904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  CHECK_BTGATT_INIT();
908b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTIF_TRACE_DEBUG("%s, %d, %d", __func__, action, filt_type);
909904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
910904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  /* If data is passed, both mask and data have to be the same length */
91116102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski  if (data.size() != mask.size() && data.size() != 0 && mask.size() != 0)
912904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    return BT_STATUS_PARM_INVALID;
913904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
914904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  switch (filt_type) {
915904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_ADDR_FILTER:  // 0
916904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    {
9176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      tBTA_DM_BLE_PF_COND_PARAM* cond = new tBTA_DM_BLE_PF_COND_PARAM;
918904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      memset(cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
919904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
920904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      bdcpy(cond->target_addr.bda, bd_addr->address);
921904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      cond->target_addr.type = addr_type;
922904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action,
923904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   filt_type, filt_index, base::Owned(cond),
924904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   &bta_scan_filt_cfg_cb, client_if));
925904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    }
926904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
927904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_SRVC_DATA:  // 1
928904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action,
929904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   filt_type, filt_index, nullptr,
930904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   &bta_scan_filt_cfg_cb, client_if));
931904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
932904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_SRVC_UUID:  // 2
933904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    {
934904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      tBT_UUID bt_uuid;
935904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      btif_to_bta_uuid(&bt_uuid, p_uuid);
936904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
937904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      if (p_uuid_mask != NULL) {
9386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        tBTA_DM_BLE_PF_COND_MASK* uuid_mask = new tBTA_DM_BLE_PF_COND_MASK;
93996d078b59d2df937caad491a234fab7b1a414546Subramanian Srinivasan        btif_to_bta_uuid_mask(uuid_mask, p_uuid_mask, p_uuid);
940904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski        return do_in_jni_thread(Bind(&btif_gattc_scan_filter_add_srvc_uuid,
941904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                     bt_uuid, base::Owned(uuid_mask), action,
942904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                     filt_type, filt_index, client_if));
943904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      }
944904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
945904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return do_in_jni_thread(Bind(&btif_gattc_scan_filter_add_srvc_uuid,
946904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   bt_uuid, nullptr, action, filt_type,
947904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   filt_index, client_if));
948904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    }
949904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
950904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_SRVC_SOL_UUID:  // 3
951904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    {
9526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      tBTA_DM_BLE_PF_COND_PARAM* cond = new tBTA_DM_BLE_PF_COND_PARAM;
953904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      memset(cond, 0, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
954904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
955904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      cond->solicitate_uuid.p_target_addr = NULL;
956904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      cond->solicitate_uuid.cond_logic = BTA_DM_BLE_PF_LOGIC_AND;
957904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      btif_to_bta_uuid(&cond->solicitate_uuid.uuid, p_uuid);
958904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
959904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition, action,
960904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   filt_type, filt_index, base::Owned(cond),
961904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski                                   &bta_scan_filt_cfg_cb, client_if));
962904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    }
963904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
964904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_LOCAL_NAME:  // 4
965904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    {
966904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return do_in_jni_thread(Bind(&btif_gattc_scan_filter_add_local_name,
96716102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                   std::move(data), action, filt_type,
96816102de0866a51b523143b681e72db8e0ff441c4Jakub Pawlowski                                   filt_index, client_if));
969904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    }
970904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
971904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_MANU_DATA:  // 5
9721a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    {
9736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return do_in_jni_thread(Bind(&btif_gattc_scan_filter_add_manu_data,
9746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                   company_id, company_id_mask, std::move(data),
9756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                   std::move(mask), action, filt_type,
9766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                   filt_index, client_if));
9771a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    }
978904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
979904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    case BTA_DM_BLE_PF_SRVC_DATA_PATTERN:  // 6
980904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    {
9816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return do_in_jni_thread(Bind(&btif_gattc_scan_filter_add_data_pattern,
9826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                   std::move(data), std::move(mask), action,
9836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                   filt_type, filt_index, client_if));
984904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    }
985904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski
986904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski    default:
987904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __func__, action);
988904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski      return (bt_status_t)BTA_GATT_OK;
989904aefe1a9c2808a7460ebb9896391acdaa39f4eJakub Pawlowski  }
990b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
991b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
99244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_scan_filter_clear(int client_if, int filter_index) {
99371d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski  CHECK_BTGATT_INIT();
994b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTIF_TRACE_DEBUG("%s: filter_index: %d", __func__, filter_index);
9951a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
99671d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_DmBleCfgFilterCondition,
99771d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski                               BTA_DM_BLE_SCAN_COND_CLEAR,
99871d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski                               BTA_DM_BLE_PF_TYPE_ALL, filter_index, nullptr,
99971d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski                               &bta_scan_filt_cfg_cb, client_if));
10001a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji}
10011a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
100244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable) {
100371d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski  CHECK_BTGATT_INIT();
1004b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssen  BTIF_TRACE_DEBUG("%s: enable: %d", __func__, enable);
10051a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji
10066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  uint8_t action = enable ? 1 : 0;
100771d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski
100871d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski  return do_in_jni_thread(Bind(&BTA_DmEnableScanFilter, action,
100971d4e33a08a5eaf458c4cd3de1ca65a542be81e3Jakub Pawlowski                               &bta_scan_filt_status_cb, client_if));
1010b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach}
1011b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach
101244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_set_scan_parameters(int client_if, int scan_interval,
101344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                           int scan_window) {
10144c634eeafc79e68b40ff1ade0d96ba7b1c34f85fJakub Pawlowski  CHECK_BTGATT_INIT();
10154c634eeafc79e68b40ff1ade0d96ba7b1c34f85fJakub Pawlowski  return do_in_jni_thread(
10164c634eeafc79e68b40ff1ade0d96ba7b1c34f85fJakub Pawlowski      Bind(BTA_DmSetBleScanParams, client_if, scan_interval, scan_window,
10174c634eeafc79e68b40ff1ade0d96ba7b1c34f85fJakub Pawlowski           BTM_BLE_SCAN_MODE_ACTI,
10184c634eeafc79e68b40ff1ade0d96ba7b1c34f85fJakub Pawlowski           (tBLE_SCAN_PARAM_SETUP_CBACK)bta_scan_param_setup_cb));
10197d208f286865ff58ba5e79299c42b9686cca25cbPrerepa Viswanadham}
10207d208f286865ff58ba5e79299c42b9686cca25cbPrerepa Viswanadham
10216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint btif_gattc_get_device_type(const bt_bdaddr_t* bd_addr) {
102244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  int device_type = 0;
102344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  char bd_addr_str[18] = {0};
1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
102544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  bdaddr_to_string(bd_addr, bd_addr_str, sizeof(bd_addr_str));
102644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  if (btif_config_get_int(bd_addr_str, "DevType", &device_type))
102744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    return device_type;
102844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  return 0;
1029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
103144be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_cfg_storage(int client_if, int batch_scan_full_max,
103244be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                   int batch_scan_trunc_max,
103344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                   int batch_scan_notify_threshold) {
10342af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  CHECK_BTGATT_INIT();
10352af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  return do_in_jni_thread(
10362af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski      Bind(BTA_DmBleSetStorageParams, batch_scan_full_max, batch_scan_trunc_max,
10372af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski           batch_scan_notify_threshold,
10386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson           (tBTA_BLE_SCAN_SETUP_CBACK*)bta_batch_scan_setup_cb,
10396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson           (tBTA_BLE_SCAN_THRESHOLD_CBACK*)bta_batch_scan_threshold_cb,
10406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson           (tBTA_BLE_SCAN_REP_CBACK*)bta_batch_scan_reports_cb,
10412af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski           (tBTA_DM_BLE_REF_VALUE)client_if));
1042c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
1043c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
104444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_enb_batch_scan(int client_if, int scan_mode,
104544be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                      int scan_interval, int scan_window,
104644be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski                                      int addr_type, int discard_rule) {
10472af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  CHECK_BTGATT_INIT();
10482af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  return do_in_jni_thread(Bind(BTA_DmBleEnableBatchScan, scan_mode,
10492af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski                               scan_interval, scan_window, discard_rule,
10502af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski                               addr_type, client_if));
1051c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
1052c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
105344be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_dis_batch_scan(int client_if) {
10542af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  CHECK_BTGATT_INIT();
10552af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  return do_in_jni_thread(Bind(BTA_DmBleDisableBatchScan, client_if));
1056c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
1057c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
105844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowskibt_status_t btif_gattc_read_batch_scan_reports(int client_if, int scan_mode) {
10592af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  CHECK_BTGATT_INIT();
10602af2129df720baee246d4ff9a0f1a02884da856eJakub Pawlowski  return do_in_jni_thread(Bind(BTA_DmBleReadScanReports, scan_mode, client_if));
1061c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji}
1062c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji
10636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_gattc_test_command(int command, btgatt_test_params_t* params) {
106444be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski  return btif_gattc_test_command_impl(command, params);
1065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
106744be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski}  // namespace
106844be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski
1069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaconst btgatt_client_interface_t btgattClientInterface = {
1070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_register_app,
1071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_unregister_app,
1072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_scan,
1073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_open,
1074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_close,
10755c44e45473e5fc2fa89411ab1add7dbfc979f1f8Andre Eisenbach    btif_gattc_listen,
1076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_refresh,
1077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_search_service,
1078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_read_char,
1079ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_write_char,
1080ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_read_char_descr,
1081ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_write_char_descr,
1082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_execute_write,
1083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_reg_for_notification,
1084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_dereg_for_notification,
1085ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_read_remote_rssi,
10861a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btif_gattc_scan_filter_param_setup,
10871a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btif_gattc_scan_filter_add_remove,
1088b203d478f4835f5e35217874a1787e1914328f7cAndre Eisenbach    btif_gattc_scan_filter_clear,
10891a9247a1229aa65b3d1dce16426177bc5828e54dSatya Calloji    btif_gattc_scan_filter_enable,
1090ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btif_gattc_get_device_type,
10919426d530e9bbc5d3ffae55515388d49185c61325Andre Eisenbach    btif_gattc_configure_mtu,
109252a2cd609897c04bb6440e14ef2ec8871143d028Andre Eisenbach    btif_gattc_conn_parameter_update,
10937d208f286865ff58ba5e79299c42b9686cca25cbPrerepa Viswanadham    btif_gattc_set_scan_parameters,
1094c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    btif_gattc_cfg_storage,
1095c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    btif_gattc_enb_batch_scan,
1096c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    btif_gattc_dis_batch_scan,
1097c4e2596a112a0dd63ac681b1226548c0f95e828cSatya Calloji    btif_gattc_read_batch_scan_reports,
1098533fdbf46fb623aefbe4d0107b5cccd41aec097aJakub Pawlowski    btif_gattc_test_command,
109944be0690a1d15d1ffc97e4c7560d8aee5bb86062Jakub Pawlowski    btif_gattc_get_gatt_db};
1100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
1102