blob: 001532dc210ecfa34e9ea63f6d3f04bdccd4986a [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
Jakub Pawlowski5b790fe2017-09-18 09:00:20 -07003 * Copyright 1999-2012 Broadcom Corporation
The Android Open Source Project5738f832012-12-12 16:00:35 -08004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * This file contains function of the HCIC unit to format and send HCI
22 * commands.
23 *
24 ******************************************************************************/
25
Pavlin Radoslavov258c2532015-09-27 20:59:05 -070026#include "bt_common.h"
Myles Watson911d1ae2016-11-28 16:44:40 -080027#include "bt_target.h"
28#include "btu.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080029#include "hcidefs.h"
30#include "hcimsgs.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080031
Jakub Pawlowski0c683232017-02-24 09:49:59 -080032#include <base/bind.h>
The Android Open Source Project5738f832012-12-12 16:00:35 -080033#include <stddef.h>
34#include <string.h>
35
Myles Watson911d1ae2016-11-28 16:44:40 -080036void btsnd_hcic_ble_set_local_used_feat(uint8_t feat_set[8]) {
37 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
38 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080039
Myles Watson911d1ae2016-11-28 16:44:40 -080040 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_USED_FEAT_CMD;
41 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -080042
Myles Watson911d1ae2016-11-28 16:44:40 -080043 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_LOCAL_SPT_FEAT);
44 ARRAY_TO_STREAM(pp, feat_set, HCIC_PARAM_SIZE_SET_USED_FEAT_CMD);
The Android Open Source Project5738f832012-12-12 16:00:35 -080045
Myles Watson911d1ae2016-11-28 16:44:40 -080046 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080047}
48
Jakub Pawlowskia484a882017-06-24 17:30:18 -070049void btsnd_hcic_ble_set_random_addr(const RawAddress& random_bda) {
Myles Watson911d1ae2016-11-28 16:44:40 -080050 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
51 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080052
Myles Watson911d1ae2016-11-28 16:44:40 -080053 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD;
54 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -080055
Myles Watson911d1ae2016-11-28 16:44:40 -080056 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_RANDOM_ADDR);
57 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD);
The Android Open Source Project5738f832012-12-12 16:00:35 -080058
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -070059 BDADDR_TO_STREAM(pp, random_bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -080060
Myles Watson911d1ae2016-11-28 16:44:40 -080061 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080062}
63
Myles Watson911d1ae2016-11-28 16:44:40 -080064void btsnd_hcic_ble_write_adv_params(uint16_t adv_int_min, uint16_t adv_int_max,
65 uint8_t adv_type, uint8_t addr_type_own,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -070066 uint8_t addr_type_dir,
Jakub Pawlowskia484a882017-06-24 17:30:18 -070067 const RawAddress& direct_bda,
Myles Watson911d1ae2016-11-28 16:44:40 -080068 uint8_t channel_map,
69 uint8_t adv_filter_policy) {
70 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
71 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080072
Myles Watson911d1ae2016-11-28 16:44:40 -080073 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS;
74 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -080075
Myles Watson911d1ae2016-11-28 16:44:40 -080076 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_PARAMS);
77 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS);
The Android Open Source Project5738f832012-12-12 16:00:35 -080078
Myles Watson911d1ae2016-11-28 16:44:40 -080079 UINT16_TO_STREAM(pp, adv_int_min);
80 UINT16_TO_STREAM(pp, adv_int_max);
81 UINT8_TO_STREAM(pp, adv_type);
82 UINT8_TO_STREAM(pp, addr_type_own);
83 UINT8_TO_STREAM(pp, addr_type_dir);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -070084 BDADDR_TO_STREAM(pp, direct_bda);
Myles Watson911d1ae2016-11-28 16:44:40 -080085 UINT8_TO_STREAM(pp, channel_map);
86 UINT8_TO_STREAM(pp, adv_filter_policy);
The Android Open Source Project5738f832012-12-12 16:00:35 -080087
Myles Watson911d1ae2016-11-28 16:44:40 -080088 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080089}
Myles Watson911d1ae2016-11-28 16:44:40 -080090void btsnd_hcic_ble_read_adv_chnl_tx_power(void) {
91 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
92 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080093
Myles Watson911d1ae2016-11-28 16:44:40 -080094 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
95 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -080096
Myles Watson911d1ae2016-11-28 16:44:40 -080097 UINT16_TO_STREAM(pp, HCI_BLE_READ_ADV_CHNL_TX_POWER);
98 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
The Android Open Source Project5738f832012-12-12 16:00:35 -080099
Myles Watson911d1ae2016-11-28 16:44:40 -0800100 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800101}
102
Myles Watson911d1ae2016-11-28 16:44:40 -0800103void btsnd_hcic_ble_set_adv_data(uint8_t data_len, uint8_t* p_data) {
104 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
105 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800106
Myles Watson911d1ae2016-11-28 16:44:40 -0800107 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1;
108 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800109
Myles Watson911d1ae2016-11-28 16:44:40 -0800110 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_DATA);
111 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800112
Myles Watson911d1ae2016-11-28 16:44:40 -0800113 memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800114
Myles Watson911d1ae2016-11-28 16:44:40 -0800115 if (p_data != NULL && data_len > 0) {
116 if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA)
117 data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800118
Myles Watson911d1ae2016-11-28 16:44:40 -0800119 UINT8_TO_STREAM(pp, data_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800120
Myles Watson911d1ae2016-11-28 16:44:40 -0800121 ARRAY_TO_STREAM(pp, p_data, data_len);
122 }
123 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800124}
Myles Watson911d1ae2016-11-28 16:44:40 -0800125void btsnd_hcic_ble_set_scan_rsp_data(uint8_t data_len, uint8_t* p_scan_rsp) {
126 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
127 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800128
Myles Watson911d1ae2016-11-28 16:44:40 -0800129 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1;
130 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800131
Myles Watson911d1ae2016-11-28 16:44:40 -0800132 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_RSP_DATA);
133 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800134
Myles Watson911d1ae2016-11-28 16:44:40 -0800135 memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800136
Myles Watson911d1ae2016-11-28 16:44:40 -0800137 if (p_scan_rsp != NULL && data_len > 0) {
138 if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP)
139 data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800140
Myles Watson911d1ae2016-11-28 16:44:40 -0800141 UINT8_TO_STREAM(pp, data_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800142
Myles Watson911d1ae2016-11-28 16:44:40 -0800143 ARRAY_TO_STREAM(pp, p_scan_rsp, data_len);
144 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800145
Myles Watson911d1ae2016-11-28 16:44:40 -0800146 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800147}
148
Myles Watson911d1ae2016-11-28 16:44:40 -0800149void btsnd_hcic_ble_set_adv_enable(uint8_t adv_enable) {
150 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
151 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800152
Myles Watson911d1ae2016-11-28 16:44:40 -0800153 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_ADV_ENABLE;
154 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800155
Myles Watson911d1ae2016-11-28 16:44:40 -0800156 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_ENABLE);
157 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_ADV_ENABLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800158
Myles Watson911d1ae2016-11-28 16:44:40 -0800159 UINT8_TO_STREAM(pp, adv_enable);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800160
Myles Watson911d1ae2016-11-28 16:44:40 -0800161 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800162}
Myles Watson911d1ae2016-11-28 16:44:40 -0800163void btsnd_hcic_ble_set_scan_params(uint8_t scan_type, uint16_t scan_int,
164 uint16_t scan_win, uint8_t addr_type_own,
165 uint8_t scan_filter_policy) {
166 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
167 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800168
Myles Watson911d1ae2016-11-28 16:44:40 -0800169 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM;
170 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800171
Myles Watson911d1ae2016-11-28 16:44:40 -0800172 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_PARAMS);
173 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800174
Myles Watson911d1ae2016-11-28 16:44:40 -0800175 UINT8_TO_STREAM(pp, scan_type);
176 UINT16_TO_STREAM(pp, scan_int);
177 UINT16_TO_STREAM(pp, scan_win);
178 UINT8_TO_STREAM(pp, addr_type_own);
179 UINT8_TO_STREAM(pp, scan_filter_policy);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800180
Myles Watson911d1ae2016-11-28 16:44:40 -0800181 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800182}
183
Myles Watson911d1ae2016-11-28 16:44:40 -0800184void btsnd_hcic_ble_set_scan_enable(uint8_t scan_enable, uint8_t duplicate) {
185 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
186 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800187
Myles Watson911d1ae2016-11-28 16:44:40 -0800188 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE;
189 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800190
Myles Watson911d1ae2016-11-28 16:44:40 -0800191 UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_ENABLE);
192 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800193
Myles Watson911d1ae2016-11-28 16:44:40 -0800194 UINT8_TO_STREAM(pp, scan_enable);
195 UINT8_TO_STREAM(pp, duplicate);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800196
Myles Watson911d1ae2016-11-28 16:44:40 -0800197 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800198}
199
200/* link layer connection management commands */
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700201void btsnd_hcic_ble_create_ll_conn(
202 uint16_t scan_int, uint16_t scan_win, uint8_t init_filter_policy,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700203 uint8_t addr_type_peer, const RawAddress& bda_peer, uint8_t addr_type_own,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700204 uint16_t conn_int_min, uint16_t conn_int_max, uint16_t conn_latency,
205 uint16_t conn_timeout, uint16_t min_ce_len, uint16_t max_ce_len) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800206 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
207 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800208
Myles Watson911d1ae2016-11-28 16:44:40 -0800209 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN;
210 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800211
Myles Watson911d1ae2016-11-28 16:44:40 -0800212 UINT16_TO_STREAM(pp, HCI_BLE_CREATE_LL_CONN);
213 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800214
Myles Watson911d1ae2016-11-28 16:44:40 -0800215 UINT16_TO_STREAM(pp, scan_int);
216 UINT16_TO_STREAM(pp, scan_win);
217 UINT8_TO_STREAM(pp, init_filter_policy);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800218
Myles Watson911d1ae2016-11-28 16:44:40 -0800219 UINT8_TO_STREAM(pp, addr_type_peer);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700220 BDADDR_TO_STREAM(pp, bda_peer);
Myles Watson911d1ae2016-11-28 16:44:40 -0800221 UINT8_TO_STREAM(pp, addr_type_own);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800222
Myles Watson911d1ae2016-11-28 16:44:40 -0800223 UINT16_TO_STREAM(pp, conn_int_min);
224 UINT16_TO_STREAM(pp, conn_int_max);
225 UINT16_TO_STREAM(pp, conn_latency);
226 UINT16_TO_STREAM(pp, conn_timeout);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800227
Myles Watson911d1ae2016-11-28 16:44:40 -0800228 UINT16_TO_STREAM(pp, min_ce_len);
229 UINT16_TO_STREAM(pp, max_ce_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800230
Myles Watson911d1ae2016-11-28 16:44:40 -0800231 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800232}
233
Myles Watson911d1ae2016-11-28 16:44:40 -0800234void btsnd_hcic_ble_create_conn_cancel(void) {
235 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
236 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800237
Myles Watson911d1ae2016-11-28 16:44:40 -0800238 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL;
239 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800240
Myles Watson911d1ae2016-11-28 16:44:40 -0800241 UINT16_TO_STREAM(pp, HCI_BLE_CREATE_CONN_CANCEL);
242 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800243
Myles Watson911d1ae2016-11-28 16:44:40 -0800244 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800245}
246
Jakub Pawlowski553e88b2018-10-30 22:49:30 +0100247void btsnd_hcic_ble_clear_white_list(
248 base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
249 btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_CLEAR_WHITE_LIST, nullptr, 0,
250 std::move(cb));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800251}
252
Jakub Pawlowski553e88b2018-10-30 22:49:30 +0100253void btsnd_hcic_ble_add_white_list(
254 uint8_t addr_type, const RawAddress& bda,
255 base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
256 uint8_t param[HCIC_PARAM_SIZE_ADD_WHITE_LIST];
257 uint8_t* pp = param;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800258
Myles Watson911d1ae2016-11-28 16:44:40 -0800259 UINT8_TO_STREAM(pp, addr_type);
260 BDADDR_TO_STREAM(pp, bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800261
Jakub Pawlowski553e88b2018-10-30 22:49:30 +0100262 btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_ADD_WHITE_LIST, param,
263 HCIC_PARAM_SIZE_ADD_WHITE_LIST, std::move(cb));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800264}
265
Jakub Pawlowski553e88b2018-10-30 22:49:30 +0100266void btsnd_hcic_ble_remove_from_white_list(
267 uint8_t addr_type, const RawAddress& bda,
268 base::OnceCallback<void(uint8_t*, uint16_t)> cb) {
269 uint8_t param[HCIC_PARAM_SIZE_REMOVE_WHITE_LIST];
270 uint8_t* pp = param;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800271
Myles Watson911d1ae2016-11-28 16:44:40 -0800272 UINT8_TO_STREAM(pp, addr_type);
273 BDADDR_TO_STREAM(pp, bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800274
Jakub Pawlowski553e88b2018-10-30 22:49:30 +0100275 btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_REMOVE_WHITE_LIST, param,
276 HCIC_PARAM_SIZE_REMOVE_WHITE_LIST, std::move(cb));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800277}
278
Myles Watson911d1ae2016-11-28 16:44:40 -0800279void btsnd_hcic_ble_upd_ll_conn_params(uint16_t handle, uint16_t conn_int_min,
280 uint16_t conn_int_max,
281 uint16_t conn_latency,
282 uint16_t conn_timeout,
283 uint16_t min_ce_len,
284 uint16_t max_ce_len) {
285 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
286 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800287
Myles Watson911d1ae2016-11-28 16:44:40 -0800288 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
289 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800290
Myles Watson911d1ae2016-11-28 16:44:40 -0800291 UINT16_TO_STREAM(pp, HCI_BLE_UPD_LL_CONN_PARAMS);
292 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800293
Myles Watson911d1ae2016-11-28 16:44:40 -0800294 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800295
Myles Watson911d1ae2016-11-28 16:44:40 -0800296 UINT16_TO_STREAM(pp, conn_int_min);
297 UINT16_TO_STREAM(pp, conn_int_max);
298 UINT16_TO_STREAM(pp, conn_latency);
299 UINT16_TO_STREAM(pp, conn_timeout);
300 UINT16_TO_STREAM(pp, min_ce_len);
301 UINT16_TO_STREAM(pp, max_ce_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800302
Myles Watson911d1ae2016-11-28 16:44:40 -0800303 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800304}
305
Myles Watson911d1ae2016-11-28 16:44:40 -0800306void btsnd_hcic_ble_set_host_chnl_class(
307 uint8_t chnl_map[HCIC_BLE_CHNL_MAP_SIZE]) {
308 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
309 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800310
Myles Watson911d1ae2016-11-28 16:44:40 -0800311 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
312 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800313
Myles Watson911d1ae2016-11-28 16:44:40 -0800314 UINT16_TO_STREAM(pp, HCI_BLE_SET_HOST_CHNL_CLASS);
315 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800316
Myles Watson911d1ae2016-11-28 16:44:40 -0800317 ARRAY_TO_STREAM(pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800318
Myles Watson911d1ae2016-11-28 16:44:40 -0800319 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800320}
321
Myles Watson911d1ae2016-11-28 16:44:40 -0800322void btsnd_hcic_ble_read_chnl_map(uint16_t handle) {
323 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
324 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800325
Myles Watson911d1ae2016-11-28 16:44:40 -0800326 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
327 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800328
Myles Watson911d1ae2016-11-28 16:44:40 -0800329 UINT16_TO_STREAM(pp, HCI_BLE_READ_CHNL_MAP);
330 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800331
Myles Watson911d1ae2016-11-28 16:44:40 -0800332 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800333
Myles Watson911d1ae2016-11-28 16:44:40 -0800334 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800335}
336
Myles Watson911d1ae2016-11-28 16:44:40 -0800337void btsnd_hcic_ble_read_remote_feat(uint16_t handle) {
338 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
339 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800340
Myles Watson911d1ae2016-11-28 16:44:40 -0800341 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
342 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800343
Myles Watson911d1ae2016-11-28 16:44:40 -0800344 UINT16_TO_STREAM(pp, HCI_BLE_READ_REMOTE_FEAT);
345 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800346
Myles Watson911d1ae2016-11-28 16:44:40 -0800347 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800348
Myles Watson911d1ae2016-11-28 16:44:40 -0800349 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800350}
351
352/* security management commands */
Myles Watson911d1ae2016-11-28 16:44:40 -0800353void btsnd_hcic_ble_encrypt(uint8_t* key, uint8_t key_len, uint8_t* plain_text,
354 uint8_t pt_len, void* p_cmd_cplt_cback) {
355 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
356 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800357
Myles Watson911d1ae2016-11-28 16:44:40 -0800358 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
359 p->offset = sizeof(void*);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800360
Myles Watson911d1ae2016-11-28 16:44:40 -0800361 *((void**)pp) =
362 p_cmd_cplt_cback; /* Store command complete callback in buffer */
363 pp += sizeof(void*); /* Skip over callback pointer */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800364
Myles Watson911d1ae2016-11-28 16:44:40 -0800365 UINT16_TO_STREAM(pp, HCI_BLE_ENCRYPT);
366 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800367
Myles Watson911d1ae2016-11-28 16:44:40 -0800368 memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800369
Myles Watson911d1ae2016-11-28 16:44:40 -0800370 if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
371 if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800372
Myles Watson911d1ae2016-11-28 16:44:40 -0800373 ARRAY_TO_STREAM(pp, key, key_len);
374 pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
375 ARRAY_TO_STREAM(pp, plain_text, pt_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800376
Myles Watson911d1ae2016-11-28 16:44:40 -0800377 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800378}
379
Jakub Pawlowski0c683232017-02-24 09:49:59 -0800380void btsnd_hcic_ble_rand(base::Callback<void(BT_OCTET8)> cb) {
381 btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_RAND, nullptr, 0,
382 base::Bind(
383 [](base::Callback<void(BT_OCTET8)> cb,
384 uint8_t* param, uint16_t param_len) {
385 CHECK(param[0] == 0)
386 << "LE Rand return status must be zero";
387 cb.Run(param + 1 /* skip status */);
388 },
389 std::move(cb)));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800390}
391
Myles Watson911d1ae2016-11-28 16:44:40 -0800392void btsnd_hcic_ble_start_enc(uint16_t handle,
393 uint8_t rand[HCIC_BLE_RAND_DI_SIZE],
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700394 uint16_t ediv, const Octet16& ltk) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800395 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
396 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800397
Myles Watson911d1ae2016-11-28 16:44:40 -0800398 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
399 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800400
Myles Watson911d1ae2016-11-28 16:44:40 -0800401 UINT16_TO_STREAM(pp, HCI_BLE_START_ENC);
402 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_START_ENC);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800403
Myles Watson911d1ae2016-11-28 16:44:40 -0800404 UINT16_TO_STREAM(pp, handle);
405 ARRAY_TO_STREAM(pp, rand, HCIC_BLE_RAND_DI_SIZE);
406 UINT16_TO_STREAM(pp, ediv);
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700407 ARRAY_TO_STREAM(pp, ltk.data(), HCIC_BLE_ENCRYT_KEY_SIZE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800408
Myles Watson911d1ae2016-11-28 16:44:40 -0800409 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800410}
411
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700412void btsnd_hcic_ble_ltk_req_reply(uint16_t handle, const Octet16& ltk) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800413 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
414 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800415
Myles Watson911d1ae2016-11-28 16:44:40 -0800416 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
417 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800418
Myles Watson911d1ae2016-11-28 16:44:40 -0800419 UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_REPLY);
420 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800421
Myles Watson911d1ae2016-11-28 16:44:40 -0800422 UINT16_TO_STREAM(pp, handle);
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700423 ARRAY_TO_STREAM(pp, ltk.data(), HCIC_BLE_ENCRYT_KEY_SIZE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800424
Myles Watson911d1ae2016-11-28 16:44:40 -0800425 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800426}
427
Myles Watson911d1ae2016-11-28 16:44:40 -0800428void btsnd_hcic_ble_ltk_req_neg_reply(uint16_t handle) {
429 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
430 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800431
Myles Watson911d1ae2016-11-28 16:44:40 -0800432 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
433 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800434
Myles Watson911d1ae2016-11-28 16:44:40 -0800435 UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_NEG_REPLY);
436 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800437
Myles Watson911d1ae2016-11-28 16:44:40 -0800438 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800439
Myles Watson911d1ae2016-11-28 16:44:40 -0800440 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800441}
442
Myles Watson911d1ae2016-11-28 16:44:40 -0800443void btsnd_hcic_ble_receiver_test(uint8_t rx_freq) {
444 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
445 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800446
Myles Watson911d1ae2016-11-28 16:44:40 -0800447 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
448 p->offset = 0;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800449
Myles Watson911d1ae2016-11-28 16:44:40 -0800450 UINT16_TO_STREAM(pp, HCI_BLE_RECEIVER_TEST);
451 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800452
Myles Watson911d1ae2016-11-28 16:44:40 -0800453 UINT8_TO_STREAM(pp, rx_freq);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800454
Myles Watson911d1ae2016-11-28 16:44:40 -0800455 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800456}
457
Myles Watson911d1ae2016-11-28 16:44:40 -0800458void btsnd_hcic_ble_transmitter_test(uint8_t tx_freq, uint8_t test_data_len,
459 uint8_t payload) {
460 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
461 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800462
Myles Watson911d1ae2016-11-28 16:44:40 -0800463 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
464 p->offset = 0;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800465
Myles Watson911d1ae2016-11-28 16:44:40 -0800466 UINT16_TO_STREAM(pp, HCI_BLE_TRANSMITTER_TEST);
467 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800468
Myles Watson911d1ae2016-11-28 16:44:40 -0800469 UINT8_TO_STREAM(pp, tx_freq);
470 UINT8_TO_STREAM(pp, test_data_len);
471 UINT8_TO_STREAM(pp, payload);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800472
Myles Watson911d1ae2016-11-28 16:44:40 -0800473 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800474}
475
Myles Watson911d1ae2016-11-28 16:44:40 -0800476void btsnd_hcic_ble_test_end(void) {
477 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
478 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800479
Myles Watson911d1ae2016-11-28 16:44:40 -0800480 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
481 p->offset = 0;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800482
Myles Watson911d1ae2016-11-28 16:44:40 -0800483 UINT16_TO_STREAM(pp, HCI_BLE_TEST_END);
484 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800485
Myles Watson911d1ae2016-11-28 16:44:40 -0800486 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800487}
488
Myles Watson911d1ae2016-11-28 16:44:40 -0800489void btsnd_hcic_ble_read_host_supported(void) {
490 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
491 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800492
Myles Watson911d1ae2016-11-28 16:44:40 -0800493 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
494 p->offset = 0;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800495
Myles Watson911d1ae2016-11-28 16:44:40 -0800496 UINT16_TO_STREAM(pp, HCI_READ_LE_HOST_SUPPORT);
497 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800498
Myles Watson911d1ae2016-11-28 16:44:40 -0800499 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800500}
501
Marie Janssend19e0782016-07-15 12:48:27 -0700502#if (BLE_LLT_INCLUDED == TRUE)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700503
Myles Watson911d1ae2016-11-28 16:44:40 -0800504void btsnd_hcic_ble_rc_param_req_reply(uint16_t handle, uint16_t conn_int_min,
505 uint16_t conn_int_max,
506 uint16_t conn_latency,
507 uint16_t conn_timeout,
508 uint16_t min_ce_len,
509 uint16_t max_ce_len) {
510 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
511 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700512
Myles Watson911d1ae2016-11-28 16:44:40 -0800513 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
514 p->offset = 0;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700515
Myles Watson911d1ae2016-11-28 16:44:40 -0800516 UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_REPLY);
517 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700518
Myles Watson911d1ae2016-11-28 16:44:40 -0800519 UINT16_TO_STREAM(pp, handle);
520 UINT16_TO_STREAM(pp, conn_int_min);
521 UINT16_TO_STREAM(pp, conn_int_max);
522 UINT16_TO_STREAM(pp, conn_latency);
523 UINT16_TO_STREAM(pp, conn_timeout);
524 UINT16_TO_STREAM(pp, min_ce_len);
525 UINT16_TO_STREAM(pp, max_ce_len);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700526
Myles Watson911d1ae2016-11-28 16:44:40 -0800527 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700528}
529
Myles Watson911d1ae2016-11-28 16:44:40 -0800530void btsnd_hcic_ble_rc_param_req_neg_reply(uint16_t handle, uint8_t reason) {
531 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
532 uint8_t* pp = (uint8_t*)(p + 1);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700533
Myles Watson911d1ae2016-11-28 16:44:40 -0800534 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
535 p->offset = 0;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700536
Myles Watson911d1ae2016-11-28 16:44:40 -0800537 UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
538 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700539
Myles Watson911d1ae2016-11-28 16:44:40 -0800540 UINT16_TO_STREAM(pp, handle);
541 UINT8_TO_STREAM(pp, reason);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700542
Myles Watson911d1ae2016-11-28 16:44:40 -0800543 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700544}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800545#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700546
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700547void btsnd_hcic_ble_add_device_resolving_list(uint8_t addr_type_peer,
548 const RawAddress& bda_peer,
549 const Octet16& irk_peer,
550 const Octet16& irk_local) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800551 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
552 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800553
Myles Watson911d1ae2016-11-28 16:44:40 -0800554 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
555 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800556
Myles Watson911d1ae2016-11-28 16:44:40 -0800557 UINT16_TO_STREAM(pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
558 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
559 UINT8_TO_STREAM(pp, addr_type_peer);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700560 BDADDR_TO_STREAM(pp, bda_peer);
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700561 ARRAY_TO_STREAM(pp, irk_peer.data(), HCIC_BLE_ENCRYT_KEY_SIZE);
562 ARRAY_TO_STREAM(pp, irk_local.data(), HCIC_BLE_ENCRYT_KEY_SIZE);
Satya Calloji444a8da2015-03-06 10:38:22 -0800563
Myles Watson911d1ae2016-11-28 16:44:40 -0800564 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800565}
566
Myles Watson911d1ae2016-11-28 16:44:40 -0800567void btsnd_hcic_ble_rm_device_resolving_list(uint8_t addr_type_peer,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700568 const RawAddress& bda_peer) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800569 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
570 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800571
Myles Watson911d1ae2016-11-28 16:44:40 -0800572 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
573 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800574
Myles Watson911d1ae2016-11-28 16:44:40 -0800575 UINT16_TO_STREAM(pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
576 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
577 UINT8_TO_STREAM(pp, addr_type_peer);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700578 BDADDR_TO_STREAM(pp, bda_peer);
Satya Calloji444a8da2015-03-06 10:38:22 -0800579
Myles Watson911d1ae2016-11-28 16:44:40 -0800580 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800581}
582
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700583void btsnd_hcic_ble_set_privacy_mode(uint8_t addr_type_peer,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700584 const RawAddress& bda_peer,
Jakub Pawlowskif6db7cb2017-04-07 06:19:50 -0700585 uint8_t privacy_type) {
586 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
587 uint8_t* pp = (uint8_t*)(p + 1);
588
589 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE;
590 p->offset = 0;
591
592 UINT16_TO_STREAM(pp, HCI_BLE_SET_PRIVACY_MODE);
593 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE);
594 UINT8_TO_STREAM(pp, addr_type_peer);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700595 BDADDR_TO_STREAM(pp, bda_peer);
Jakub Pawlowskif6db7cb2017-04-07 06:19:50 -0700596 UINT8_TO_STREAM(pp, privacy_type);
597
598 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
599}
600
Myles Watson911d1ae2016-11-28 16:44:40 -0800601void btsnd_hcic_ble_clear_resolving_list(void) {
602 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
603 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800604
Myles Watson911d1ae2016-11-28 16:44:40 -0800605 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
606 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800607
Myles Watson911d1ae2016-11-28 16:44:40 -0800608 UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_RESOLVING_LIST);
609 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
Satya Calloji444a8da2015-03-06 10:38:22 -0800610
Myles Watson911d1ae2016-11-28 16:44:40 -0800611 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800612}
613
Myles Watson911d1ae2016-11-28 16:44:40 -0800614void btsnd_hcic_ble_read_resolvable_addr_peer(uint8_t addr_type_peer,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700615 const RawAddress& bda_peer) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800616 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
617 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800618
Myles Watson911d1ae2016-11-28 16:44:40 -0800619 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
620 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800621
Myles Watson911d1ae2016-11-28 16:44:40 -0800622 UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
623 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
624 UINT8_TO_STREAM(pp, addr_type_peer);
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700625 BDADDR_TO_STREAM(pp, bda_peer);
Satya Calloji444a8da2015-03-06 10:38:22 -0800626
Myles Watson911d1ae2016-11-28 16:44:40 -0800627 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800628}
629
Myles Watson911d1ae2016-11-28 16:44:40 -0800630void btsnd_hcic_ble_read_resolvable_addr_local(uint8_t addr_type_peer,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700631 const RawAddress& bda_peer) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800632 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
633 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800634
Myles Watson911d1ae2016-11-28 16:44:40 -0800635 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
636 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800637
Myles Watson911d1ae2016-11-28 16:44:40 -0800638 UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
639 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
640 UINT8_TO_STREAM(pp, addr_type_peer);
641 BDADDR_TO_STREAM(pp, bda_peer);
Satya Calloji444a8da2015-03-06 10:38:22 -0800642
Myles Watson911d1ae2016-11-28 16:44:40 -0800643 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800644}
645
Myles Watson911d1ae2016-11-28 16:44:40 -0800646void btsnd_hcic_ble_set_addr_resolution_enable(uint8_t addr_resolution_enable) {
647 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
648 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800649
Myles Watson911d1ae2016-11-28 16:44:40 -0800650 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
651 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800652
Myles Watson911d1ae2016-11-28 16:44:40 -0800653 UINT16_TO_STREAM(pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
654 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
655 UINT8_TO_STREAM(pp, addr_resolution_enable);
Satya Calloji444a8da2015-03-06 10:38:22 -0800656
Myles Watson911d1ae2016-11-28 16:44:40 -0800657 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800658}
659
Myles Watson911d1ae2016-11-28 16:44:40 -0800660void btsnd_hcic_ble_set_rand_priv_addr_timeout(uint16_t rpa_timout) {
661 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
662 uint8_t* pp = (uint8_t*)(p + 1);
Satya Calloji444a8da2015-03-06 10:38:22 -0800663
Myles Watson911d1ae2016-11-28 16:44:40 -0800664 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
665 p->offset = 0;
Satya Calloji444a8da2015-03-06 10:38:22 -0800666
Myles Watson911d1ae2016-11-28 16:44:40 -0800667 UINT16_TO_STREAM(pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
668 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
669 UINT16_TO_STREAM(pp, rpa_timout);
Satya Calloji444a8da2015-03-06 10:38:22 -0800670
Myles Watson911d1ae2016-11-28 16:44:40 -0800671 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Satya Calloji444a8da2015-03-06 10:38:22 -0800672}
673
Myles Watson911d1ae2016-11-28 16:44:40 -0800674void btsnd_hcic_ble_set_data_length(uint16_t conn_handle, uint16_t tx_octets,
675 uint16_t tx_time) {
676 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
677 uint8_t* pp = (uint8_t*)(p + 1);
Priti Aghera636d6712014-12-18 13:55:48 -0800678
Myles Watson911d1ae2016-11-28 16:44:40 -0800679 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
680 p->offset = 0;
Priti Aghera636d6712014-12-18 13:55:48 -0800681
Myles Watson911d1ae2016-11-28 16:44:40 -0800682 UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
683 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
Priti Aghera636d6712014-12-18 13:55:48 -0800684
Myles Watson911d1ae2016-11-28 16:44:40 -0800685 UINT16_TO_STREAM(pp, conn_handle);
686 UINT16_TO_STREAM(pp, tx_octets);
687 UINT16_TO_STREAM(pp, tx_time);
Priti Aghera636d6712014-12-18 13:55:48 -0800688
Myles Watson911d1ae2016-11-28 16:44:40 -0800689 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
Priti Aghera636d6712014-12-18 13:55:48 -0800690}
Jakub Pawlowski9df2a552016-12-02 11:34:06 -0800691
Avish Shah5a475e72017-04-13 17:15:20 +0530692void btsnd_hcic_ble_enh_rx_test(uint8_t rx_chan, uint8_t phy,
693 uint8_t mod_index) {
694 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
695 uint8_t* pp = (uint8_t*)(p + 1);
696
697 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_RX_TEST;
698 p->offset = 0;
699
700 UINT16_TO_STREAM(pp, HCI_BLE_ENH_RECEIVER_TEST);
701 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_RX_TEST);
702
703 UINT8_TO_STREAM(pp, rx_chan);
704 UINT8_TO_STREAM(pp, phy);
705 UINT8_TO_STREAM(pp, mod_index);
706
707 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
708}
709
710void btsnd_hcic_ble_enh_tx_test(uint8_t tx_chan, uint8_t data_len,
711 uint8_t payload, uint8_t phy) {
712 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
713 uint8_t* pp = (uint8_t*)(p + 1);
714
715 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_TX_TEST;
716 p->offset = 0;
717
718 UINT16_TO_STREAM(pp, HCI_BLE_ENH_TRANSMITTER_TEST);
719 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_TX_TEST);
720 UINT8_TO_STREAM(pp, tx_chan);
721 UINT8_TO_STREAM(pp, data_len);
722 UINT8_TO_STREAM(pp, payload);
723 UINT8_TO_STREAM(pp, phy);
724
725 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
726}
727
Jakub Pawlowski9df2a552016-12-02 11:34:06 -0800728void btsnd_hcic_ble_set_extended_scan_params(uint8_t own_address_type,
729 uint8_t scanning_filter_policy,
730 uint8_t scanning_phys,
731 scanning_phy_cfg* phy_cfg) {
732 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
733 uint8_t* pp = (uint8_t*)(p + 1);
734
Jakub Pawlowski42300f22017-02-10 15:17:52 -0800735 int phy_cnt =
736 std::bitset<std::numeric_limits<uint8_t>::digits>(scanning_phys).count();
737
738 uint16_t param_len = 3 + (5 * phy_cnt);
Reddy Praveen0c86aad2017-01-13 16:57:37 +0530739 p->len = HCIC_PREAMBLE_SIZE + param_len;
Jakub Pawlowski9df2a552016-12-02 11:34:06 -0800740 p->offset = 0;
741
742 UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_PARAMETERS);
743 UINT8_TO_STREAM(pp, param_len);
744
745 UINT8_TO_STREAM(pp, own_address_type);
746 UINT8_TO_STREAM(pp, scanning_filter_policy);
747 UINT8_TO_STREAM(pp, scanning_phys);
748
Jakub Pawlowski42300f22017-02-10 15:17:52 -0800749 for (int i = 0; i < phy_cnt; i++) {
Jakub Pawlowski9df2a552016-12-02 11:34:06 -0800750 UINT8_TO_STREAM(pp, phy_cfg[i].scan_type);
751 UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
752 UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
753 }
754
755 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
756}
757
758void btsnd_hcic_ble_set_extended_scan_enable(uint8_t enable,
759 uint8_t filter_duplicates,
760 uint16_t duration,
761 uint16_t period) {
762 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
763 uint8_t* pp = (uint8_t*)(p + 1);
764
765 const int param_len = 6;
766 p->len = HCIC_PREAMBLE_SIZE + param_len;
767 p->offset = 0;
768
769 UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_ENABLE);
770 UINT8_TO_STREAM(pp, param_len);
771
772 UINT8_TO_STREAM(pp, enable);
773 UINT8_TO_STREAM(pp, filter_duplicates);
774 UINT16_TO_STREAM(pp, duration);
775 UINT16_TO_STREAM(pp, period);
776
777 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
778}
Jakub Pawlowski93df8602017-02-15 08:35:30 -0800779
780void btsnd_hcic_ble_ext_create_conn(uint8_t init_filter_policy,
781 uint8_t addr_type_own,
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700782 uint8_t addr_type_peer,
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700783 const RawAddress& bda_peer,
Jakub Pawlowski93df8602017-02-15 08:35:30 -0800784 uint8_t initiating_phys,
785 EXT_CONN_PHY_CFG* phy_cfg) {
786 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
787 uint8_t* pp = (uint8_t*)(p + 1);
788
789 int phy_cnt =
790 std::bitset<std::numeric_limits<uint8_t>::digits>(initiating_phys)
791 .count();
792
793 /* param_len = initial_params + size_per_channel * num_of_channels */
794 uint8_t param_len = 10 + (16 * phy_cnt);
795
796 p->len = HCIC_PREAMBLE_SIZE + param_len;
797 p->offset = 0;
798
799 UINT16_TO_STREAM(pp, HCI_LE_EXTENDED_CREATE_CONNECTION);
800 UINT8_TO_STREAM(pp, param_len);
801
802 UINT8_TO_STREAM(pp, init_filter_policy);
803 UINT8_TO_STREAM(pp, addr_type_own);
804 UINT8_TO_STREAM(pp, addr_type_peer);
805 BDADDR_TO_STREAM(pp, bda_peer);
806
807 UINT8_TO_STREAM(pp, initiating_phys);
808
809 for (int i = 0; i < phy_cnt; i++) {
810 UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
811 UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
812 UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_min);
813 UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_max);
814 UINT16_TO_STREAM(pp, phy_cfg[i].conn_latency);
815 UINT16_TO_STREAM(pp, phy_cfg[i].sup_timeout);
816 UINT16_TO_STREAM(pp, phy_cfg[i].min_ce_len);
817 UINT16_TO_STREAM(pp, phy_cfg[i].max_ce_len);
818 }
819
820 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
821}