blob: 23a8648b0a592415ba91bb0136b29b4507984a0e [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
Jakub Pawlowski5b790fe2017-09-18 09:00:20 -07002 *
3 * Copyright 1999-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
The Android Open Source Project5738f832012-12-12 16:00:35 -080018
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
32#include <stddef.h>
33#include <string.h>
34
Myles Watson911d1ae2016-11-28 16:44:40 -080035#include "btm_int.h" /* Included for UIPC_* macro definitions */
The Android Open Source Project5738f832012-12-12 16:00:35 -080036
Myles Watson911d1ae2016-11-28 16:44:40 -080037void btsnd_hcic_inquiry(const LAP inq_lap, uint8_t duration,
38 uint8_t response_cnt) {
39 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
40 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080041
Myles Watson911d1ae2016-11-28 16:44:40 -080042 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQUIRY;
43 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -080044
Myles Watson911d1ae2016-11-28 16:44:40 -080045 UINT16_TO_STREAM(pp, HCI_INQUIRY);
46 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_INQUIRY);
The Android Open Source Project5738f832012-12-12 16:00:35 -080047
Myles Watson911d1ae2016-11-28 16:44:40 -080048 LAP_TO_STREAM(pp, inq_lap);
49 UINT8_TO_STREAM(pp, duration);
50 UINT8_TO_STREAM(pp, response_cnt);
The Android Open Source Project5738f832012-12-12 16:00:35 -080051
Myles Watson911d1ae2016-11-28 16:44:40 -080052 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080053}
54
Myles Watson911d1ae2016-11-28 16:44:40 -080055void btsnd_hcic_inq_cancel(void) {
56 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
57 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080058
Myles Watson911d1ae2016-11-28 16:44:40 -080059 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_INQ_CANCEL;
60 p->offset = 0;
61 UINT16_TO_STREAM(pp, HCI_INQUIRY_CANCEL);
62 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_INQ_CANCEL);
The Android Open Source Project5738f832012-12-12 16:00:35 -080063
Myles Watson911d1ae2016-11-28 16:44:40 -080064 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080065}
66
Myles Watson911d1ae2016-11-28 16:44:40 -080067void btsnd_hcic_per_inq_mode(uint16_t max_period, uint16_t min_period,
68 const LAP inq_lap, uint8_t duration,
69 uint8_t response_cnt) {
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_PER_INQ_MODE;
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_PERIODIC_INQUIRY_MODE);
77 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PER_INQ_MODE);
The Android Open Source Project5738f832012-12-12 16:00:35 -080078
Myles Watson911d1ae2016-11-28 16:44:40 -080079 UINT16_TO_STREAM(pp, max_period);
80 UINT16_TO_STREAM(pp, min_period);
81 LAP_TO_STREAM(pp, inq_lap);
82 UINT8_TO_STREAM(pp, duration);
83 UINT8_TO_STREAM(pp, response_cnt);
The Android Open Source Project5738f832012-12-12 16:00:35 -080084
Myles Watson911d1ae2016-11-28 16:44:40 -080085 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080086}
87
Myles Watson911d1ae2016-11-28 16:44:40 -080088void btsnd_hcic_exit_per_inq(void) {
89 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
90 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -080091
Myles Watson911d1ae2016-11-28 16:44:40 -080092 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXIT_PER_INQ;
93 p->offset = 0;
94 UINT16_TO_STREAM(pp, HCI_EXIT_PERIODIC_INQUIRY_MODE);
95 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXIT_PER_INQ);
The Android Open Source Project5738f832012-12-12 16:00:35 -080096
Myles Watson911d1ae2016-11-28 16:44:40 -080097 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -080098}
99
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700100void btsnd_hcic_create_conn(const RawAddress& dest, uint16_t packet_types,
Myles Watson911d1ae2016-11-28 16:44:40 -0800101 uint8_t page_scan_rep_mode, uint8_t page_scan_mode,
102 uint16_t clock_offset, uint8_t allow_switch) {
103 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
104 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800105
106#ifndef BT_10A
Myles Watson911d1ae2016-11-28 16:44:40 -0800107 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800108#else
Myles Watson911d1ae2016-11-28 16:44:40 -0800109 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN - 1;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800110#endif
Myles Watson911d1ae2016-11-28 16:44:40 -0800111 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800112
Myles Watson911d1ae2016-11-28 16:44:40 -0800113 UINT16_TO_STREAM(pp, HCI_CREATE_CONNECTION);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800114#ifndef BT_10A
Myles Watson911d1ae2016-11-28 16:44:40 -0800115 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CREATE_CONN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800116#else
Myles Watson911d1ae2016-11-28 16:44:40 -0800117 UINT8_TO_STREAM(pp, (HCIC_PARAM_SIZE_CREATE_CONN - 1));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800118#endif
Myles Watson911d1ae2016-11-28 16:44:40 -0800119 BDADDR_TO_STREAM(pp, dest);
120 UINT16_TO_STREAM(pp, packet_types);
121 UINT8_TO_STREAM(pp, page_scan_rep_mode);
122 UINT8_TO_STREAM(pp, page_scan_mode);
123 UINT16_TO_STREAM(pp, clock_offset);
124#if !defined(BT_10A)
125 UINT8_TO_STREAM(pp, allow_switch);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800126#endif
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700127 btm_acl_paging(p, dest);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800128}
129
Myles Watson911d1ae2016-11-28 16:44:40 -0800130void btsnd_hcic_disconnect(uint16_t handle, uint8_t reason) {
131 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
132 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800133
Myles Watson911d1ae2016-11-28 16:44:40 -0800134 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DISCONNECT;
135 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800136
Myles Watson911d1ae2016-11-28 16:44:40 -0800137 UINT16_TO_STREAM(pp, HCI_DISCONNECT);
138 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_DISCONNECT);
139 UINT16_TO_STREAM(pp, handle);
140 UINT8_TO_STREAM(pp, reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800141
Myles Watson911d1ae2016-11-28 16:44:40 -0800142 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800143}
144
Myles Watson911d1ae2016-11-28 16:44:40 -0800145void btsnd_hcic_add_SCO_conn(uint16_t handle, uint16_t packet_types) {
146 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
147 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800148
Myles Watson911d1ae2016-11-28 16:44:40 -0800149 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_SCO_CONN;
150 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800151
Myles Watson911d1ae2016-11-28 16:44:40 -0800152 UINT16_TO_STREAM(pp, HCI_ADD_SCO_CONNECTION);
153 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ADD_SCO_CONN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800154
Myles Watson911d1ae2016-11-28 16:44:40 -0800155 UINT16_TO_STREAM(pp, handle);
156 UINT16_TO_STREAM(pp, packet_types);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800157
Myles Watson911d1ae2016-11-28 16:44:40 -0800158 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800159}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800160
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700161void btsnd_hcic_create_conn_cancel(const RawAddress& dest) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800162 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
163 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800164
Myles Watson911d1ae2016-11-28 16:44:40 -0800165 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CREATE_CONN_CANCEL;
166 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800167
Myles Watson911d1ae2016-11-28 16:44:40 -0800168 UINT16_TO_STREAM(pp, HCI_CREATE_CONNECTION_CANCEL);
169 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CREATE_CONN_CANCEL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800170
Myles Watson911d1ae2016-11-28 16:44:40 -0800171 BDADDR_TO_STREAM(pp, dest);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800172
Myles Watson911d1ae2016-11-28 16:44:40 -0800173 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800174}
175
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700176void btsnd_hcic_accept_conn(const RawAddress& dest, uint8_t role) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800177 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
178 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800179
Myles Watson911d1ae2016-11-28 16:44:40 -0800180 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_CONN;
181 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800182
Myles Watson911d1ae2016-11-28 16:44:40 -0800183 UINT16_TO_STREAM(pp, HCI_ACCEPT_CONNECTION_REQUEST);
184 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_CONN);
185 BDADDR_TO_STREAM(pp, dest);
186 UINT8_TO_STREAM(pp, role);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800187
Myles Watson911d1ae2016-11-28 16:44:40 -0800188 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800189}
190
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700191void btsnd_hcic_reject_conn(const RawAddress& dest, uint8_t reason) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800192 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
193 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800194
Myles Watson911d1ae2016-11-28 16:44:40 -0800195 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_CONN;
196 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800197
Myles Watson911d1ae2016-11-28 16:44:40 -0800198 UINT16_TO_STREAM(pp, HCI_REJECT_CONNECTION_REQUEST);
199 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REJECT_CONN);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800200
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700201 BDADDR_TO_STREAM(pp, dest);
Myles Watson911d1ae2016-11-28 16:44:40 -0800202 UINT8_TO_STREAM(pp, reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800203
Myles Watson911d1ae2016-11-28 16:44:40 -0800204 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800205}
206
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700207void btsnd_hcic_link_key_req_reply(const RawAddress& bd_addr,
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700208 const LinkKey& link_key) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800209 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
210 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800211
Myles Watson911d1ae2016-11-28 16:44:40 -0800212 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY;
213 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800214
Myles Watson911d1ae2016-11-28 16:44:40 -0800215 UINT16_TO_STREAM(pp, HCI_LINK_KEY_REQUEST_REPLY);
216 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LINK_KEY_REQ_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800217
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700218 BDADDR_TO_STREAM(pp, bd_addr);
Jakub Pawlowskiae572112018-06-14 17:40:34 -0700219 ARRAY16_TO_STREAM(pp, link_key.data());
The Android Open Source Project5738f832012-12-12 16:00:35 -0800220
Myles Watson911d1ae2016-11-28 16:44:40 -0800221 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800222}
223
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700224void btsnd_hcic_link_key_neg_reply(const RawAddress& bd_addr) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800225 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
226 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800227
Myles Watson911d1ae2016-11-28 16:44:40 -0800228 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY;
229 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800230
Myles Watson911d1ae2016-11-28 16:44:40 -0800231 UINT16_TO_STREAM(pp, HCI_LINK_KEY_REQUEST_NEG_REPLY);
232 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LINK_KEY_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800233
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700234 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800235
Myles Watson911d1ae2016-11-28 16:44:40 -0800236 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800237}
238
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700239void btsnd_hcic_pin_code_req_reply(const RawAddress& bd_addr,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700240 uint8_t pin_code_len, PIN_CODE pin_code) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800241 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
242 uint8_t* pp = (uint8_t*)(p + 1);
243 int i;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800244
Myles Watson911d1ae2016-11-28 16:44:40 -0800245 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY;
246 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800247
Myles Watson911d1ae2016-11-28 16:44:40 -0800248 UINT16_TO_STREAM(pp, HCI_PIN_CODE_REQUEST_REPLY);
249 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PIN_CODE_REQ_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800250
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700251 BDADDR_TO_STREAM(pp, bd_addr);
Myles Watson911d1ae2016-11-28 16:44:40 -0800252 UINT8_TO_STREAM(pp, pin_code_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800253
Myles Watson911d1ae2016-11-28 16:44:40 -0800254 for (i = 0; i < pin_code_len; i++) *pp++ = *pin_code++;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800255
Myles Watson911d1ae2016-11-28 16:44:40 -0800256 for (; i < PIN_CODE_LEN; i++) *pp++ = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800257
Myles Watson911d1ae2016-11-28 16:44:40 -0800258 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800259}
260
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700261void btsnd_hcic_pin_code_neg_reply(const RawAddress& bd_addr) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800262 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
263 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800264
Myles Watson911d1ae2016-11-28 16:44:40 -0800265 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY;
266 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800267
Myles Watson911d1ae2016-11-28 16:44:40 -0800268 UINT16_TO_STREAM(pp, HCI_PIN_CODE_REQUEST_NEG_REPLY);
269 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PIN_CODE_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800270
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700271 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800272
Myles Watson911d1ae2016-11-28 16:44:40 -0800273 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800274}
275
Myles Watson911d1ae2016-11-28 16:44:40 -0800276void btsnd_hcic_change_conn_type(uint16_t handle, uint16_t packet_types) {
277 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
278 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800279
Myles Watson911d1ae2016-11-28 16:44:40 -0800280 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_CONN_TYPE;
281 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800282
Myles Watson911d1ae2016-11-28 16:44:40 -0800283 UINT16_TO_STREAM(pp, HCI_CHANGE_CONN_PACKET_TYPE);
284 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CHANGE_CONN_TYPE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800285
Myles Watson911d1ae2016-11-28 16:44:40 -0800286 UINT16_TO_STREAM(pp, handle);
287 UINT16_TO_STREAM(pp, packet_types);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800288
Myles Watson911d1ae2016-11-28 16:44:40 -0800289 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800290}
291
Myles Watson911d1ae2016-11-28 16:44:40 -0800292void btsnd_hcic_auth_request(uint16_t handle) {
293 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
294 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800295
Myles Watson911d1ae2016-11-28 16:44:40 -0800296 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
297 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800298
Myles Watson911d1ae2016-11-28 16:44:40 -0800299 UINT16_TO_STREAM(pp, HCI_AUTHENTICATION_REQUESTED);
300 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800301
Myles Watson911d1ae2016-11-28 16:44:40 -0800302 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800303
Myles Watson911d1ae2016-11-28 16:44:40 -0800304 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800305}
306
Myles Watson911d1ae2016-11-28 16:44:40 -0800307void btsnd_hcic_set_conn_encrypt(uint16_t handle, bool enable) {
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_CONN_ENCRYPT;
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_SET_CONN_ENCRYPTION);
315 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_CONN_ENCRYPT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800316
Myles Watson911d1ae2016-11-28 16:44:40 -0800317 UINT16_TO_STREAM(pp, handle);
318 UINT8_TO_STREAM(pp, enable);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800319
Myles Watson911d1ae2016-11-28 16:44:40 -0800320 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800321}
322
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700323void btsnd_hcic_rmt_name_req(const RawAddress& bd_addr,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700324 uint8_t page_scan_rep_mode, uint8_t page_scan_mode,
325 uint16_t clock_offset) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800326 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
327 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800328
Myles Watson911d1ae2016-11-28 16:44:40 -0800329 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ;
330 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800331
Myles Watson911d1ae2016-11-28 16:44:40 -0800332 UINT16_TO_STREAM(pp, HCI_RMT_NAME_REQUEST);
333 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_NAME_REQ);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800334
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700335 BDADDR_TO_STREAM(pp, bd_addr);
Myles Watson911d1ae2016-11-28 16:44:40 -0800336 UINT8_TO_STREAM(pp, page_scan_rep_mode);
337 UINT8_TO_STREAM(pp, page_scan_mode);
338 UINT16_TO_STREAM(pp, clock_offset);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800339
Myles Watson911d1ae2016-11-28 16:44:40 -0800340 btm_acl_paging(p, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800341}
342
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700343void btsnd_hcic_rmt_name_req_cancel(const RawAddress& bd_addr) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800344 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
345 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800346
Myles Watson911d1ae2016-11-28 16:44:40 -0800347 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL;
348 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800349
Myles Watson911d1ae2016-11-28 16:44:40 -0800350 UINT16_TO_STREAM(pp, HCI_RMT_NAME_REQUEST_CANCEL);
351 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_NAME_REQ_CANCEL);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800352
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700353 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800354
Myles Watson911d1ae2016-11-28 16:44:40 -0800355 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800356}
357
Myles Watson911d1ae2016-11-28 16:44:40 -0800358void btsnd_hcic_rmt_features_req(uint16_t handle) {
359 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
360 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800361
Myles Watson911d1ae2016-11-28 16:44:40 -0800362 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
363 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800364
Myles Watson911d1ae2016-11-28 16:44:40 -0800365 UINT16_TO_STREAM(pp, HCI_READ_RMT_FEATURES);
366 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800367
Myles Watson911d1ae2016-11-28 16:44:40 -0800368 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800369
Myles Watson911d1ae2016-11-28 16:44:40 -0800370 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800371}
372
Myles Watson911d1ae2016-11-28 16:44:40 -0800373void btsnd_hcic_rmt_ext_features(uint16_t handle, uint8_t page_num) {
374 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
375 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800376
Myles Watson911d1ae2016-11-28 16:44:40 -0800377 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_RMT_EXT_FEATURES;
378 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800379
Myles Watson911d1ae2016-11-28 16:44:40 -0800380 UINT16_TO_STREAM(pp, HCI_READ_RMT_EXT_FEATURES);
381 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_RMT_EXT_FEATURES);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800382
Myles Watson911d1ae2016-11-28 16:44:40 -0800383 UINT16_TO_STREAM(pp, handle);
384 UINT8_TO_STREAM(pp, page_num);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800385
Myles Watson911d1ae2016-11-28 16:44:40 -0800386 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800387}
388
Myles Watson911d1ae2016-11-28 16:44:40 -0800389void btsnd_hcic_rmt_ver_req(uint16_t handle) {
390 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
391 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800392
Myles Watson911d1ae2016-11-28 16:44:40 -0800393 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
394 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800395
Myles Watson911d1ae2016-11-28 16:44:40 -0800396 UINT16_TO_STREAM(pp, HCI_READ_RMT_VERSION_INFO);
397 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800398
Myles Watson911d1ae2016-11-28 16:44:40 -0800399 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800400
Myles Watson911d1ae2016-11-28 16:44:40 -0800401 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800402}
403
Myles Watson911d1ae2016-11-28 16:44:40 -0800404void btsnd_hcic_read_rmt_clk_offset(uint16_t handle) {
405 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
406 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800407
Myles Watson911d1ae2016-11-28 16:44:40 -0800408 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
409 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800410
Myles Watson911d1ae2016-11-28 16:44:40 -0800411 UINT16_TO_STREAM(pp, HCI_READ_RMT_CLOCK_OFFSET);
412 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800413
Myles Watson911d1ae2016-11-28 16:44:40 -0800414 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800415
Myles Watson911d1ae2016-11-28 16:44:40 -0800416 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800417}
418
Myles Watson911d1ae2016-11-28 16:44:40 -0800419void btsnd_hcic_read_lmp_handle(uint16_t handle) {
420 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
421 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800422
Myles Watson911d1ae2016-11-28 16:44:40 -0800423 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
424 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800425
Myles Watson911d1ae2016-11-28 16:44:40 -0800426 UINT16_TO_STREAM(pp, HCI_READ_LMP_HANDLE);
427 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800428
Myles Watson911d1ae2016-11-28 16:44:40 -0800429 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800430
Myles Watson911d1ae2016-11-28 16:44:40 -0800431 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800432}
433
Mudumba Ananth57f65082017-02-09 09:05:48 -0800434void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t transmit_bandwidth,
435 uint32_t receive_bandwidth,
Myles Watson911d1ae2016-11-28 16:44:40 -0800436 uint16_t max_latency, uint16_t voice,
437 uint8_t retrans_effort, uint16_t packet_types) {
438 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
439 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800440
Myles Watson911d1ae2016-11-28 16:44:40 -0800441 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SETUP_ESCO;
442 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800443
Myles Watson911d1ae2016-11-28 16:44:40 -0800444 UINT16_TO_STREAM(pp, HCI_SETUP_ESCO_CONNECTION);
445 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SETUP_ESCO);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800446
Myles Watson911d1ae2016-11-28 16:44:40 -0800447 UINT16_TO_STREAM(pp, handle);
Mudumba Ananth57f65082017-02-09 09:05:48 -0800448 UINT32_TO_STREAM(pp, transmit_bandwidth);
449 UINT32_TO_STREAM(pp, receive_bandwidth);
Myles Watson911d1ae2016-11-28 16:44:40 -0800450 UINT16_TO_STREAM(pp, max_latency);
451 UINT16_TO_STREAM(pp, voice);
452 UINT8_TO_STREAM(pp, retrans_effort);
453 UINT16_TO_STREAM(pp, packet_types);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800454
Myles Watson911d1ae2016-11-28 16:44:40 -0800455 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800456}
457
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700458void btsnd_hcic_accept_esco_conn(const RawAddress& bd_addr,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700459 uint32_t transmit_bandwidth,
Mudumba Ananth57f65082017-02-09 09:05:48 -0800460 uint32_t receive_bandwidth,
461 uint16_t max_latency, uint16_t content_fmt,
462 uint8_t retrans_effort,
Myles Watson911d1ae2016-11-28 16:44:40 -0800463 uint16_t packet_types) {
464 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
465 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800466
Myles Watson911d1ae2016-11-28 16:44:40 -0800467 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ACCEPT_ESCO;
468 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800469
Myles Watson911d1ae2016-11-28 16:44:40 -0800470 UINT16_TO_STREAM(pp, HCI_ACCEPT_ESCO_CONNECTION);
471 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ACCEPT_ESCO);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800472
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700473 BDADDR_TO_STREAM(pp, bd_addr);
Mudumba Ananth57f65082017-02-09 09:05:48 -0800474 UINT32_TO_STREAM(pp, transmit_bandwidth);
475 UINT32_TO_STREAM(pp, receive_bandwidth);
Myles Watson911d1ae2016-11-28 16:44:40 -0800476 UINT16_TO_STREAM(pp, max_latency);
477 UINT16_TO_STREAM(pp, content_fmt);
478 UINT8_TO_STREAM(pp, retrans_effort);
479 UINT16_TO_STREAM(pp, packet_types);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800480
Myles Watson911d1ae2016-11-28 16:44:40 -0800481 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800482}
483
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700484void btsnd_hcic_reject_esco_conn(const RawAddress& bd_addr, uint8_t reason) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800485 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
486 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800487
Myles Watson911d1ae2016-11-28 16:44:40 -0800488 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REJECT_ESCO;
489 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800490
Myles Watson911d1ae2016-11-28 16:44:40 -0800491 UINT16_TO_STREAM(pp, HCI_REJECT_ESCO_CONNECTION);
492 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REJECT_ESCO);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800493
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700494 BDADDR_TO_STREAM(pp, bd_addr);
Myles Watson911d1ae2016-11-28 16:44:40 -0800495 UINT8_TO_STREAM(pp, reason);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800496
Myles Watson911d1ae2016-11-28 16:44:40 -0800497 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800498}
499
Myles Watson911d1ae2016-11-28 16:44:40 -0800500void btsnd_hcic_hold_mode(uint16_t handle, uint16_t max_hold_period,
501 uint16_t min_hold_period) {
502 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
503 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800504
Myles Watson911d1ae2016-11-28 16:44:40 -0800505 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_HOLD_MODE;
506 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800507
Myles Watson911d1ae2016-11-28 16:44:40 -0800508 UINT16_TO_STREAM(pp, HCI_HOLD_MODE);
509 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_HOLD_MODE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800510
Myles Watson911d1ae2016-11-28 16:44:40 -0800511 UINT16_TO_STREAM(pp, handle);
512 UINT16_TO_STREAM(pp, max_hold_period);
513 UINT16_TO_STREAM(pp, min_hold_period);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800514
Myles Watson911d1ae2016-11-28 16:44:40 -0800515 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800516}
517
Myles Watson911d1ae2016-11-28 16:44:40 -0800518void btsnd_hcic_sniff_mode(uint16_t handle, uint16_t max_sniff_period,
519 uint16_t min_sniff_period, uint16_t sniff_attempt,
520 uint16_t sniff_timeout) {
521 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
522 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800523
Myles Watson911d1ae2016-11-28 16:44:40 -0800524 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_MODE;
525 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800526
Myles Watson911d1ae2016-11-28 16:44:40 -0800527 UINT16_TO_STREAM(pp, HCI_SNIFF_MODE);
528 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SNIFF_MODE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800529
Myles Watson911d1ae2016-11-28 16:44:40 -0800530 UINT16_TO_STREAM(pp, handle);
531 UINT16_TO_STREAM(pp, max_sniff_period);
532 UINT16_TO_STREAM(pp, min_sniff_period);
533 UINT16_TO_STREAM(pp, sniff_attempt);
534 UINT16_TO_STREAM(pp, sniff_timeout);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800535
Myles Watson911d1ae2016-11-28 16:44:40 -0800536 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800537}
538
Myles Watson911d1ae2016-11-28 16:44:40 -0800539void btsnd_hcic_exit_sniff_mode(uint16_t handle) {
540 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
541 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800542
Myles Watson911d1ae2016-11-28 16:44:40 -0800543 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
544 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800545
Myles Watson911d1ae2016-11-28 16:44:40 -0800546 UINT16_TO_STREAM(pp, HCI_EXIT_SNIFF_MODE);
547 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800548
Myles Watson911d1ae2016-11-28 16:44:40 -0800549 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800550
Myles Watson911d1ae2016-11-28 16:44:40 -0800551 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800552}
553
Myles Watson911d1ae2016-11-28 16:44:40 -0800554void btsnd_hcic_park_mode(uint16_t handle, uint16_t beacon_max_interval,
555 uint16_t beacon_min_interval) {
556 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
557 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800558
Myles Watson911d1ae2016-11-28 16:44:40 -0800559 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_PARK_MODE;
560 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800561
Myles Watson911d1ae2016-11-28 16:44:40 -0800562 UINT16_TO_STREAM(pp, HCI_PARK_MODE);
563 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_PARK_MODE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800564
Myles Watson911d1ae2016-11-28 16:44:40 -0800565 UINT16_TO_STREAM(pp, handle);
566 UINT16_TO_STREAM(pp, beacon_max_interval);
567 UINT16_TO_STREAM(pp, beacon_min_interval);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800568
Myles Watson911d1ae2016-11-28 16:44:40 -0800569 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800570}
571
Myles Watson911d1ae2016-11-28 16:44:40 -0800572void btsnd_hcic_exit_park_mode(uint16_t handle) {
573 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
574 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800575
Myles Watson911d1ae2016-11-28 16:44:40 -0800576 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
577 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800578
Myles Watson911d1ae2016-11-28 16:44:40 -0800579 UINT16_TO_STREAM(pp, HCI_EXIT_PARK_MODE);
580 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800581
Myles Watson911d1ae2016-11-28 16:44:40 -0800582 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800583
Myles Watson911d1ae2016-11-28 16:44:40 -0800584 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800585}
586
Myles Watson911d1ae2016-11-28 16:44:40 -0800587void btsnd_hcic_qos_setup(uint16_t handle, uint8_t flags, uint8_t service_type,
588 uint32_t token_rate, uint32_t peak, uint32_t latency,
589 uint32_t delay_var) {
590 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
591 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800592
Myles Watson911d1ae2016-11-28 16:44:40 -0800593 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_QOS_SETUP;
594 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800595
Myles Watson911d1ae2016-11-28 16:44:40 -0800596 UINT16_TO_STREAM(pp, HCI_QOS_SETUP);
597 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_QOS_SETUP);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800598
Myles Watson911d1ae2016-11-28 16:44:40 -0800599 UINT16_TO_STREAM(pp, handle);
600 UINT8_TO_STREAM(pp, flags);
601 UINT8_TO_STREAM(pp, service_type);
602 UINT32_TO_STREAM(pp, token_rate);
603 UINT32_TO_STREAM(pp, peak);
604 UINT32_TO_STREAM(pp, latency);
605 UINT32_TO_STREAM(pp, delay_var);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800606
Myles Watson911d1ae2016-11-28 16:44:40 -0800607 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800608}
609
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700610void btsnd_hcic_switch_role(const RawAddress& bd_addr, uint8_t role) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800611 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
612 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800613
Myles Watson911d1ae2016-11-28 16:44:40 -0800614 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SWITCH_ROLE;
615 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800616
Myles Watson911d1ae2016-11-28 16:44:40 -0800617 UINT16_TO_STREAM(pp, HCI_SWITCH_ROLE);
618 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SWITCH_ROLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800619
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700620 BDADDR_TO_STREAM(pp, bd_addr);
Myles Watson911d1ae2016-11-28 16:44:40 -0800621 UINT8_TO_STREAM(pp, role);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800622
Myles Watson911d1ae2016-11-28 16:44:40 -0800623 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800624}
625
Myles Watson911d1ae2016-11-28 16:44:40 -0800626void btsnd_hcic_write_policy_set(uint16_t handle, uint16_t settings) {
627 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
628 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800629
Myles Watson911d1ae2016-11-28 16:44:40 -0800630 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_POLICY_SET;
631 p->offset = 0;
632 UINT16_TO_STREAM(pp, HCI_WRITE_POLICY_SETTINGS);
633 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_POLICY_SET);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800634
Myles Watson911d1ae2016-11-28 16:44:40 -0800635 UINT16_TO_STREAM(pp, handle);
636 UINT16_TO_STREAM(pp, settings);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800637
Myles Watson911d1ae2016-11-28 16:44:40 -0800638 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800639}
640
Myles Watson911d1ae2016-11-28 16:44:40 -0800641void btsnd_hcic_write_def_policy_set(uint16_t settings) {
642 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
643 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800644
Myles Watson911d1ae2016-11-28 16:44:40 -0800645 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET;
646 p->offset = 0;
647 UINT16_TO_STREAM(pp, HCI_WRITE_DEF_POLICY_SETTINGS);
648 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_DEF_POLICY_SET);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800649
Myles Watson911d1ae2016-11-28 16:44:40 -0800650 UINT16_TO_STREAM(pp, settings);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800651
Myles Watson911d1ae2016-11-28 16:44:40 -0800652 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800653}
654
Myles Watson911d1ae2016-11-28 16:44:40 -0800655void btsnd_hcic_set_event_filter(uint8_t filt_type, uint8_t filt_cond_type,
656 uint8_t* filt_cond, uint8_t filt_cond_len) {
657 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
658 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800659
Myles Watson911d1ae2016-11-28 16:44:40 -0800660 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800661
Myles Watson911d1ae2016-11-28 16:44:40 -0800662 UINT16_TO_STREAM(pp, HCI_SET_EVENT_FILTER);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800663
Myles Watson911d1ae2016-11-28 16:44:40 -0800664 if (filt_type) {
665 p->len = (uint16_t)(HCIC_PREAMBLE_SIZE + 2 + filt_cond_len);
666 UINT8_TO_STREAM(pp, (uint8_t)(2 + filt_cond_len));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800667
Myles Watson911d1ae2016-11-28 16:44:40 -0800668 UINT8_TO_STREAM(pp, filt_type);
669 UINT8_TO_STREAM(pp, filt_cond_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800670
Myles Watson911d1ae2016-11-28 16:44:40 -0800671 if (filt_cond_type == HCI_FILTER_COND_DEVICE_CLASS) {
672 DEVCLASS_TO_STREAM(pp, filt_cond);
673 filt_cond += DEV_CLASS_LEN;
674 DEVCLASS_TO_STREAM(pp, filt_cond);
675 filt_cond += DEV_CLASS_LEN;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800676
Myles Watson911d1ae2016-11-28 16:44:40 -0800677 filt_cond_len -= (2 * DEV_CLASS_LEN);
678 } else if (filt_cond_type == HCI_FILTER_COND_BD_ADDR) {
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700679 BDADDR_TO_STREAM(pp, *((RawAddress*)filt_cond));
Myles Watson911d1ae2016-11-28 16:44:40 -0800680 filt_cond += BD_ADDR_LEN;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800681
Myles Watson911d1ae2016-11-28 16:44:40 -0800682 filt_cond_len -= BD_ADDR_LEN;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800683 }
684
Myles Watson911d1ae2016-11-28 16:44:40 -0800685 if (filt_cond_len) ARRAY_TO_STREAM(pp, filt_cond, filt_cond_len);
686 } else {
687 p->len = (uint16_t)(HCIC_PREAMBLE_SIZE + 1);
688 UINT8_TO_STREAM(pp, 1);
689
690 UINT8_TO_STREAM(pp, filt_type);
691 }
692
693 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800694}
695
Myles Watson911d1ae2016-11-28 16:44:40 -0800696void btsnd_hcic_write_pin_type(uint8_t type) {
697 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
698 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800699
Myles Watson911d1ae2016-11-28 16:44:40 -0800700 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
701 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800702
Myles Watson911d1ae2016-11-28 16:44:40 -0800703 UINT16_TO_STREAM(pp, HCI_WRITE_PIN_TYPE);
704 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800705
Myles Watson911d1ae2016-11-28 16:44:40 -0800706 UINT8_TO_STREAM(pp, type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800707
Myles Watson911d1ae2016-11-28 16:44:40 -0800708 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800709}
710
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700711void btsnd_hcic_delete_stored_key(const RawAddress& bd_addr,
Jakub Pawlowskic2276b02017-06-09 16:00:25 -0700712 bool delete_all_flag) {
Myles Watson911d1ae2016-11-28 16:44:40 -0800713 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
714 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800715
Myles Watson911d1ae2016-11-28 16:44:40 -0800716 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_DELETE_STORED_KEY;
717 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800718
Myles Watson911d1ae2016-11-28 16:44:40 -0800719 UINT16_TO_STREAM(pp, HCI_DELETE_STORED_LINK_KEY);
720 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_DELETE_STORED_KEY);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800721
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -0700722 BDADDR_TO_STREAM(pp, bd_addr);
Myles Watson911d1ae2016-11-28 16:44:40 -0800723 UINT8_TO_STREAM(pp, delete_all_flag);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800724
Myles Watson911d1ae2016-11-28 16:44:40 -0800725 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800726}
727
Myles Watson911d1ae2016-11-28 16:44:40 -0800728void btsnd_hcic_change_name(BD_NAME name) {
729 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
730 uint8_t* pp = (uint8_t*)(p + 1);
731 uint16_t len = strlen((char*)name) + 1;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800732
Myles Watson911d1ae2016-11-28 16:44:40 -0800733 memset(pp, 0, HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800734
Myles Watson911d1ae2016-11-28 16:44:40 -0800735 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CHANGE_NAME;
736 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800737
Myles Watson911d1ae2016-11-28 16:44:40 -0800738 UINT16_TO_STREAM(pp, HCI_CHANGE_LOCAL_NAME);
739 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CHANGE_NAME);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800740
Myles Watson911d1ae2016-11-28 16:44:40 -0800741 if (len > HCIC_PARAM_SIZE_CHANGE_NAME) len = HCIC_PARAM_SIZE_CHANGE_NAME;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800742
Myles Watson911d1ae2016-11-28 16:44:40 -0800743 ARRAY_TO_STREAM(pp, name, len);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800744
Myles Watson911d1ae2016-11-28 16:44:40 -0800745 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800746}
747
Myles Watson911d1ae2016-11-28 16:44:40 -0800748void btsnd_hcic_read_name(void) {
749 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
750 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800751
Myles Watson911d1ae2016-11-28 16:44:40 -0800752 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
753 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800754
Myles Watson911d1ae2016-11-28 16:44:40 -0800755 UINT16_TO_STREAM(pp, HCI_READ_LOCAL_NAME);
756 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800757
Myles Watson911d1ae2016-11-28 16:44:40 -0800758 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800759}
760
Myles Watson911d1ae2016-11-28 16:44:40 -0800761void btsnd_hcic_write_page_tout(uint16_t timeout) {
762 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
763 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800764
Myles Watson911d1ae2016-11-28 16:44:40 -0800765 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
766 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800767
Myles Watson911d1ae2016-11-28 16:44:40 -0800768 UINT16_TO_STREAM(pp, HCI_WRITE_PAGE_TOUT);
769 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800770
Myles Watson911d1ae2016-11-28 16:44:40 -0800771 UINT16_TO_STREAM(pp, timeout);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800772
Myles Watson911d1ae2016-11-28 16:44:40 -0800773 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800774}
775
Myles Watson911d1ae2016-11-28 16:44:40 -0800776void btsnd_hcic_write_scan_enable(uint8_t flag) {
777 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
778 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800779
Myles Watson911d1ae2016-11-28 16:44:40 -0800780 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
781 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800782
Myles Watson911d1ae2016-11-28 16:44:40 -0800783 UINT16_TO_STREAM(pp, HCI_WRITE_SCAN_ENABLE);
784 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800785
Myles Watson911d1ae2016-11-28 16:44:40 -0800786 UINT8_TO_STREAM(pp, flag);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800787
Myles Watson911d1ae2016-11-28 16:44:40 -0800788 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800789}
790
Myles Watson911d1ae2016-11-28 16:44:40 -0800791void btsnd_hcic_write_pagescan_cfg(uint16_t interval, uint16_t window) {
792 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
793 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800794
Myles Watson911d1ae2016-11-28 16:44:40 -0800795 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG;
796 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800797
Myles Watson911d1ae2016-11-28 16:44:40 -0800798 UINT16_TO_STREAM(pp, HCI_WRITE_PAGESCAN_CFG);
799 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PAGESCAN_CFG);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800800
Myles Watson911d1ae2016-11-28 16:44:40 -0800801 UINT16_TO_STREAM(pp, interval);
802 UINT16_TO_STREAM(pp, window);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800803
Myles Watson911d1ae2016-11-28 16:44:40 -0800804 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800805}
806
Myles Watson911d1ae2016-11-28 16:44:40 -0800807void btsnd_hcic_write_inqscan_cfg(uint16_t interval, uint16_t window) {
808 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
809 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800810
Myles Watson911d1ae2016-11-28 16:44:40 -0800811 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG;
812 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800813
Myles Watson911d1ae2016-11-28 16:44:40 -0800814 UINT16_TO_STREAM(pp, HCI_WRITE_INQUIRYSCAN_CFG);
815 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_INQSCAN_CFG);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800816
Myles Watson911d1ae2016-11-28 16:44:40 -0800817 UINT16_TO_STREAM(pp, interval);
818 UINT16_TO_STREAM(pp, window);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800819
Myles Watson911d1ae2016-11-28 16:44:40 -0800820 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800821}
822
Myles Watson911d1ae2016-11-28 16:44:40 -0800823void btsnd_hcic_write_auth_enable(uint8_t flag) {
824 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
825 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800826
Myles Watson911d1ae2016-11-28 16:44:40 -0800827 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
828 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800829
Myles Watson911d1ae2016-11-28 16:44:40 -0800830 UINT16_TO_STREAM(pp, HCI_WRITE_AUTHENTICATION_ENABLE);
831 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800832
Myles Watson911d1ae2016-11-28 16:44:40 -0800833 UINT8_TO_STREAM(pp, flag);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800834
Myles Watson911d1ae2016-11-28 16:44:40 -0800835 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800836}
837
Myles Watson911d1ae2016-11-28 16:44:40 -0800838void btsnd_hcic_write_dev_class(DEV_CLASS dev_class) {
839 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
840 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800841
Myles Watson911d1ae2016-11-28 16:44:40 -0800842 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
843 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800844
Myles Watson911d1ae2016-11-28 16:44:40 -0800845 UINT16_TO_STREAM(pp, HCI_WRITE_CLASS_OF_DEVICE);
846 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800847
Myles Watson911d1ae2016-11-28 16:44:40 -0800848 DEVCLASS_TO_STREAM(pp, dev_class);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800849
Myles Watson911d1ae2016-11-28 16:44:40 -0800850 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800851}
852
Myles Watson911d1ae2016-11-28 16:44:40 -0800853void btsnd_hcic_write_voice_settings(uint16_t flags) {
854 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
855 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800856
Myles Watson911d1ae2016-11-28 16:44:40 -0800857 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM2;
858 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800859
Myles Watson911d1ae2016-11-28 16:44:40 -0800860 UINT16_TO_STREAM(pp, HCI_WRITE_VOICE_SETTINGS);
861 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM2);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800862
Myles Watson911d1ae2016-11-28 16:44:40 -0800863 UINT16_TO_STREAM(pp, flags);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800864
Myles Watson911d1ae2016-11-28 16:44:40 -0800865 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800866}
867
Myles Watson911d1ae2016-11-28 16:44:40 -0800868void btsnd_hcic_write_auto_flush_tout(uint16_t handle, uint16_t tout) {
869 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
870 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800871
Pavlin Radoslavovb8568ae2017-09-01 16:09:27 -0700872 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_AUTOMATIC_FLUSH_TIMEOUT;
Myles Watson911d1ae2016-11-28 16:44:40 -0800873 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800874
Pavlin Radoslavovb8568ae2017-09-01 16:09:27 -0700875 UINT16_TO_STREAM(pp, HCI_WRITE_AUTOMATIC_FLUSH_TIMEOUT);
876 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_AUTOMATIC_FLUSH_TIMEOUT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800877
Myles Watson911d1ae2016-11-28 16:44:40 -0800878 UINT16_TO_STREAM(pp, handle);
879 UINT16_TO_STREAM(pp, tout);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800880
Myles Watson911d1ae2016-11-28 16:44:40 -0800881 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800882}
883
Myles Watson911d1ae2016-11-28 16:44:40 -0800884void btsnd_hcic_read_tx_power(uint16_t handle, uint8_t type) {
885 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
886 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800887
Myles Watson911d1ae2016-11-28 16:44:40 -0800888 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_TX_POWER;
889 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800890
Myles Watson911d1ae2016-11-28 16:44:40 -0800891 UINT16_TO_STREAM(pp, HCI_READ_TRANSMIT_POWER_LEVEL);
892 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_TX_POWER);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800893
Myles Watson911d1ae2016-11-28 16:44:40 -0800894 UINT16_TO_STREAM(pp, handle);
895 UINT8_TO_STREAM(pp, type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800896
Myles Watson911d1ae2016-11-28 16:44:40 -0800897 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800898}
899
Myles Watson911d1ae2016-11-28 16:44:40 -0800900void btsnd_hcic_host_num_xmitted_pkts(uint8_t num_handles, uint16_t* handle,
901 uint16_t* num_pkts) {
902 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
903 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800904
Myles Watson911d1ae2016-11-28 16:44:40 -0800905 p->len = HCIC_PREAMBLE_SIZE + 1 + (num_handles * 4);
906 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800907
Myles Watson911d1ae2016-11-28 16:44:40 -0800908 UINT16_TO_STREAM(pp, HCI_HOST_NUM_PACKETS_DONE);
909 UINT8_TO_STREAM(pp, p->len - HCIC_PREAMBLE_SIZE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800910
Myles Watson911d1ae2016-11-28 16:44:40 -0800911 UINT8_TO_STREAM(pp, num_handles);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800912
Myles Watson911d1ae2016-11-28 16:44:40 -0800913 for (int i = 0; i < num_handles; i++) {
914 UINT16_TO_STREAM(pp, handle[i]);
915 UINT16_TO_STREAM(pp, num_pkts[i]);
916 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800917
Myles Watson911d1ae2016-11-28 16:44:40 -0800918 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800919}
920
Myles Watson911d1ae2016-11-28 16:44:40 -0800921void btsnd_hcic_write_link_super_tout(uint8_t local_controller_id,
922 uint16_t handle, uint16_t timeout) {
923 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
924 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800925
Myles Watson911d1ae2016-11-28 16:44:40 -0800926 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT;
927 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800928
Myles Watson911d1ae2016-11-28 16:44:40 -0800929 UINT16_TO_STREAM(pp, HCI_WRITE_LINK_SUPER_TOUT);
930 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_LINK_SUPER_TOUT);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800931
Myles Watson911d1ae2016-11-28 16:44:40 -0800932 UINT16_TO_STREAM(pp, handle);
933 UINT16_TO_STREAM(pp, timeout);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800934
Myles Watson911d1ae2016-11-28 16:44:40 -0800935 btu_hcif_send_cmd(local_controller_id, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800936}
937
Myles Watson911d1ae2016-11-28 16:44:40 -0800938void btsnd_hcic_write_cur_iac_lap(uint8_t num_cur_iac, LAP* const iac_lap) {
939 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
940 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800941
Myles Watson911d1ae2016-11-28 16:44:40 -0800942 p->len = HCIC_PREAMBLE_SIZE + 1 + (LAP_LEN * num_cur_iac);
943 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800944
Myles Watson911d1ae2016-11-28 16:44:40 -0800945 UINT16_TO_STREAM(pp, HCI_WRITE_CURRENT_IAC_LAP);
946 UINT8_TO_STREAM(pp, p->len - HCIC_PREAMBLE_SIZE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800947
Myles Watson911d1ae2016-11-28 16:44:40 -0800948 UINT8_TO_STREAM(pp, num_cur_iac);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800949
Myles Watson911d1ae2016-11-28 16:44:40 -0800950 for (int i = 0; i < num_cur_iac; i++) LAP_TO_STREAM(pp, iac_lap[i]);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800951
Myles Watson911d1ae2016-11-28 16:44:40 -0800952 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800953}
954
The Android Open Source Project5738f832012-12-12 16:00:35 -0800955/******************************************
Myles Watsonee96a3c2016-11-23 14:49:54 -0800956 * Lisbon Features
957 ******************************************/
Marie Janssend19e0782016-07-15 12:48:27 -0700958#if (BTM_SSR_INCLUDED == TRUE)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800959
Jakub Pawlowski763abdf2016-10-10 11:39:39 -0700960void btsnd_hcic_sniff_sub_rate(uint16_t handle, uint16_t max_lat,
Myles Watson911d1ae2016-11-28 16:44:40 -0800961 uint16_t min_remote_lat,
962 uint16_t min_local_lat) {
963 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
964 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800965
Myles Watson911d1ae2016-11-28 16:44:40 -0800966 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SNIFF_SUB_RATE;
967 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800968
Myles Watson911d1ae2016-11-28 16:44:40 -0800969 UINT16_TO_STREAM(pp, HCI_SNIFF_SUB_RATE);
970 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SNIFF_SUB_RATE);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800971
Myles Watson911d1ae2016-11-28 16:44:40 -0800972 UINT16_TO_STREAM(pp, handle);
973 UINT16_TO_STREAM(pp, max_lat);
974 UINT16_TO_STREAM(pp, min_remote_lat);
975 UINT16_TO_STREAM(pp, min_local_lat);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800976
Myles Watson911d1ae2016-11-28 16:44:40 -0800977 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800978}
979#endif /* BTM_SSR_INCLUDED */
980
The Android Open Source Project5738f832012-12-12 16:00:35 -0800981/**** Extended Inquiry Response Commands ****/
Myles Watson911d1ae2016-11-28 16:44:40 -0800982void btsnd_hcic_write_ext_inquiry_response(void* buffer, uint8_t fec_req) {
983 BT_HDR* p = (BT_HDR*)buffer;
984 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800985
Myles Watson911d1ae2016-11-28 16:44:40 -0800986 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_EXT_INQ_RESP;
987 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800988
Myles Watson911d1ae2016-11-28 16:44:40 -0800989 UINT16_TO_STREAM(pp, HCI_WRITE_EXT_INQ_RESPONSE);
990 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_EXT_INQ_RESP);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800991
Myles Watson911d1ae2016-11-28 16:44:40 -0800992 UINT8_TO_STREAM(pp, fec_req);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800993
Myles Watson911d1ae2016-11-28 16:44:40 -0800994 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800995}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800996
Jakub Pawlowskia484a882017-06-24 17:30:18 -0700997void btsnd_hcic_io_cap_req_reply(const RawAddress& bd_addr, uint8_t capability,
Myles Watson911d1ae2016-11-28 16:44:40 -0800998 uint8_t oob_present, uint8_t auth_req) {
999 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1000 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001001
Myles Watson911d1ae2016-11-28 16:44:40 -08001002 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_RESP;
1003 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001004
Myles Watson911d1ae2016-11-28 16:44:40 -08001005 UINT16_TO_STREAM(pp, HCI_IO_CAPABILITY_REQUEST_REPLY);
1006 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_IO_CAP_RESP);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001007
Myles Watson911d1ae2016-11-28 16:44:40 -08001008 BDADDR_TO_STREAM(pp, bd_addr);
1009 UINT8_TO_STREAM(pp, capability);
1010 UINT8_TO_STREAM(pp, oob_present);
1011 UINT8_TO_STREAM(pp, auth_req);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001012
Myles Watson911d1ae2016-11-28 16:44:40 -08001013 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001014}
1015
Mudumba Ananth57f65082017-02-09 09:05:48 -08001016void btsnd_hcic_enhanced_set_up_synchronous_connection(
1017 uint16_t conn_handle, enh_esco_params_t* p_params) {
1018 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1019 uint8_t* pp = (uint8_t*)(p + 1);
1020
1021 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN;
1022 p->offset = 0;
1023
1024 UINT16_TO_STREAM(pp, HCI_ENH_SETUP_ESCO_CONNECTION);
1025 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_SET_ESCO_CONN);
1026
1027 UINT16_TO_STREAM(pp, conn_handle);
1028 UINT32_TO_STREAM(pp, p_params->transmit_bandwidth);
1029 UINT32_TO_STREAM(pp, p_params->receive_bandwidth);
1030 UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format);
1031 UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id);
1032 UINT16_TO_STREAM(pp,
1033 p_params->transmit_coding_format.vendor_specific_codec_id);
1034 UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format);
1035 UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id);
1036 UINT16_TO_STREAM(pp,
1037 p_params->receive_coding_format.vendor_specific_codec_id);
1038 UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size);
1039 UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size);
1040 UINT32_TO_STREAM(pp, p_params->input_bandwidth);
1041 UINT32_TO_STREAM(pp, p_params->output_bandwidth);
1042 UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format);
1043 UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id);
1044 UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id);
1045 UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format);
1046 UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id);
1047 UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id);
1048 UINT16_TO_STREAM(pp, p_params->input_coded_data_size);
1049 UINT16_TO_STREAM(pp, p_params->output_coded_data_size);
1050 UINT8_TO_STREAM(pp, p_params->input_pcm_data_format);
1051 UINT8_TO_STREAM(pp, p_params->output_pcm_data_format);
1052 UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position);
1053 UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position);
1054 UINT8_TO_STREAM(pp, p_params->input_data_path);
1055 UINT8_TO_STREAM(pp, p_params->output_data_path);
1056 UINT8_TO_STREAM(pp, p_params->input_transport_unit_size);
1057 UINT8_TO_STREAM(pp, p_params->output_transport_unit_size);
1058 UINT16_TO_STREAM(pp, p_params->max_latency_ms);
1059 UINT16_TO_STREAM(pp, p_params->packet_types);
1060 UINT8_TO_STREAM(pp, p_params->retransmission_effort);
1061
1062 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1063}
1064
1065void btsnd_hcic_enhanced_accept_synchronous_connection(
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001066 const RawAddress& bd_addr, enh_esco_params_t* p_params) {
Mudumba Ananth57f65082017-02-09 09:05:48 -08001067 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
Mudumba Ananth57f65082017-02-09 09:05:48 -08001068 uint8_t* pp = (uint8_t*)(p + 1);
1069
1070 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN;
1071 p->offset = 0;
1072
1073 UINT16_TO_STREAM(pp, HCI_ENH_ACCEPT_ESCO_CONNECTION);
1074 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENH_ACC_ESCO_CONN);
1075
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -07001076 BDADDR_TO_STREAM(pp, bd_addr);
Mudumba Ananth57f65082017-02-09 09:05:48 -08001077 UINT32_TO_STREAM(pp, p_params->transmit_bandwidth);
1078 UINT32_TO_STREAM(pp, p_params->receive_bandwidth);
1079 UINT8_TO_STREAM(pp, p_params->transmit_coding_format.coding_format);
1080 UINT16_TO_STREAM(pp, p_params->transmit_coding_format.company_id);
1081 UINT16_TO_STREAM(pp,
1082 p_params->transmit_coding_format.vendor_specific_codec_id);
1083 UINT8_TO_STREAM(pp, p_params->receive_coding_format.coding_format);
1084 UINT16_TO_STREAM(pp, p_params->receive_coding_format.company_id);
1085 UINT16_TO_STREAM(pp,
1086 p_params->receive_coding_format.vendor_specific_codec_id);
1087 UINT16_TO_STREAM(pp, p_params->transmit_codec_frame_size);
1088 UINT16_TO_STREAM(pp, p_params->receive_codec_frame_size);
1089 UINT32_TO_STREAM(pp, p_params->input_bandwidth);
1090 UINT32_TO_STREAM(pp, p_params->output_bandwidth);
1091 UINT8_TO_STREAM(pp, p_params->input_coding_format.coding_format);
1092 UINT16_TO_STREAM(pp, p_params->input_coding_format.company_id);
1093 UINT16_TO_STREAM(pp, p_params->input_coding_format.vendor_specific_codec_id);
1094 UINT8_TO_STREAM(pp, p_params->output_coding_format.coding_format);
1095 UINT16_TO_STREAM(pp, p_params->output_coding_format.company_id);
1096 UINT16_TO_STREAM(pp, p_params->output_coding_format.vendor_specific_codec_id);
1097 UINT16_TO_STREAM(pp, p_params->input_coded_data_size);
1098 UINT16_TO_STREAM(pp, p_params->output_coded_data_size);
1099 UINT8_TO_STREAM(pp, p_params->input_pcm_data_format);
1100 UINT8_TO_STREAM(pp, p_params->output_pcm_data_format);
1101 UINT8_TO_STREAM(pp, p_params->input_pcm_payload_msb_position);
1102 UINT8_TO_STREAM(pp, p_params->output_pcm_payload_msb_position);
1103 UINT8_TO_STREAM(pp, p_params->input_data_path);
1104 UINT8_TO_STREAM(pp, p_params->output_data_path);
1105 UINT8_TO_STREAM(pp, p_params->input_transport_unit_size);
1106 UINT8_TO_STREAM(pp, p_params->output_transport_unit_size);
1107 UINT16_TO_STREAM(pp, p_params->max_latency_ms);
1108 UINT16_TO_STREAM(pp, p_params->packet_types);
1109 UINT8_TO_STREAM(pp, p_params->retransmission_effort);
1110
1111 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1112}
1113
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001114void btsnd_hcic_io_cap_req_neg_reply(const RawAddress& bd_addr,
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -07001115 uint8_t err_code) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001116 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1117 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001118
Myles Watson911d1ae2016-11-28 16:44:40 -08001119 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY;
1120 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001121
Myles Watson911d1ae2016-11-28 16:44:40 -08001122 UINT16_TO_STREAM(pp, HCI_IO_CAP_REQ_NEG_REPLY);
1123 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_IO_CAP_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001124
Myles Watson911d1ae2016-11-28 16:44:40 -08001125 BDADDR_TO_STREAM(pp, bd_addr);
1126 UINT8_TO_STREAM(pp, err_code);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001127
Myles Watson911d1ae2016-11-28 16:44:40 -08001128 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001129}
1130
Myles Watson911d1ae2016-11-28 16:44:40 -08001131void btsnd_hcic_read_local_oob_data(void) {
1132 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1133 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001134
Myles Watson911d1ae2016-11-28 16:44:40 -08001135 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_LOCAL_OOB;
1136 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001137
Myles Watson911d1ae2016-11-28 16:44:40 -08001138 UINT16_TO_STREAM(pp, HCI_READ_LOCAL_OOB_DATA);
1139 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_R_LOCAL_OOB);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001140
Myles Watson911d1ae2016-11-28 16:44:40 -08001141 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001142}
1143
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001144void btsnd_hcic_user_conf_reply(const RawAddress& bd_addr, bool is_yes) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001145 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1146 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001147
Myles Watson911d1ae2016-11-28 16:44:40 -08001148 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_UCONF_REPLY;
1149 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001150
Myles Watson911d1ae2016-11-28 16:44:40 -08001151 if (!is_yes) {
1152 /* Negative reply */
1153 UINT16_TO_STREAM(pp, HCI_USER_CONF_VALUE_NEG_REPLY);
1154 } else {
1155 /* Confirmation */
1156 UINT16_TO_STREAM(pp, HCI_USER_CONF_REQUEST_REPLY);
1157 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001158
Myles Watson911d1ae2016-11-28 16:44:40 -08001159 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_UCONF_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001160
Myles Watson911d1ae2016-11-28 16:44:40 -08001161 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001162
Myles Watson911d1ae2016-11-28 16:44:40 -08001163 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001164}
1165
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001166void btsnd_hcic_user_passkey_reply(const RawAddress& bd_addr, uint32_t value) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001167 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1168 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001169
Myles Watson911d1ae2016-11-28 16:44:40 -08001170 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_REPLY;
1171 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001172
Myles Watson911d1ae2016-11-28 16:44:40 -08001173 UINT16_TO_STREAM(pp, HCI_USER_PASSKEY_REQ_REPLY);
1174 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_U_PKEY_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001175
Myles Watson911d1ae2016-11-28 16:44:40 -08001176 BDADDR_TO_STREAM(pp, bd_addr);
1177 UINT32_TO_STREAM(pp, value);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001178
Myles Watson911d1ae2016-11-28 16:44:40 -08001179 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001180}
1181
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001182void btsnd_hcic_user_passkey_neg_reply(const RawAddress& bd_addr) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001183 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1184 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001185
Myles Watson911d1ae2016-11-28 16:44:40 -08001186 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY;
1187 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001188
Myles Watson911d1ae2016-11-28 16:44:40 -08001189 UINT16_TO_STREAM(pp, HCI_USER_PASSKEY_REQ_NEG_REPLY);
1190 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_U_PKEY_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001191
Myles Watson911d1ae2016-11-28 16:44:40 -08001192 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001193
Myles Watson911d1ae2016-11-28 16:44:40 -08001194 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001195}
1196
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001197void btsnd_hcic_rem_oob_reply(const RawAddress& bd_addr, const Octet16& c,
1198 const Octet16& r) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001199 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1200 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001201
Myles Watson911d1ae2016-11-28 16:44:40 -08001202 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_REPLY;
1203 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001204
Myles Watson911d1ae2016-11-28 16:44:40 -08001205 UINT16_TO_STREAM(pp, HCI_REM_OOB_DATA_REQ_REPLY);
1206 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REM_OOB_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001207
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -07001208 BDADDR_TO_STREAM(pp, bd_addr);
Jakub Pawlowskiae572112018-06-14 17:40:34 -07001209 ARRAY16_TO_STREAM(pp, c.data());
1210 ARRAY16_TO_STREAM(pp, r.data());
The Android Open Source Project5738f832012-12-12 16:00:35 -08001211
Myles Watson911d1ae2016-11-28 16:44:40 -08001212 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001213}
1214
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001215void btsnd_hcic_rem_oob_neg_reply(const RawAddress& bd_addr) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001216 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1217 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001218
Myles Watson911d1ae2016-11-28 16:44:40 -08001219 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY;
1220 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001221
Myles Watson911d1ae2016-11-28 16:44:40 -08001222 UINT16_TO_STREAM(pp, HCI_REM_OOB_DATA_REQ_NEG_REPLY);
1223 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REM_OOB_NEG_REPLY);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001224
Jakub Pawlowskib8a477e2017-06-16 15:16:15 -07001225 BDADDR_TO_STREAM(pp, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001226
Myles Watson911d1ae2016-11-28 16:44:40 -08001227 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001228}
1229
Myles Watson911d1ae2016-11-28 16:44:40 -08001230void btsnd_hcic_read_inq_tx_power(void) {
1231 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1232 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001233
Myles Watson911d1ae2016-11-28 16:44:40 -08001234 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_R_TX_POWER;
1235 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001236
Myles Watson911d1ae2016-11-28 16:44:40 -08001237 UINT16_TO_STREAM(pp, HCI_READ_INQ_TX_POWER_LEVEL);
1238 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_R_TX_POWER);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001239
Myles Watson911d1ae2016-11-28 16:44:40 -08001240 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001241}
1242
Jakub Pawlowskia484a882017-06-24 17:30:18 -07001243void btsnd_hcic_send_keypress_notif(const RawAddress& bd_addr, uint8_t notif) {
Myles Watson911d1ae2016-11-28 16:44:40 -08001244 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1245 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001246
Myles Watson911d1ae2016-11-28 16:44:40 -08001247 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF;
1248 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001249
Myles Watson911d1ae2016-11-28 16:44:40 -08001250 UINT16_TO_STREAM(pp, HCI_SEND_KEYPRESS_NOTIF);
1251 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SEND_KEYPRESS_NOTIF);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001252
Myles Watson911d1ae2016-11-28 16:44:40 -08001253 BDADDR_TO_STREAM(pp, bd_addr);
1254 UINT8_TO_STREAM(pp, notif);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001255
Myles Watson911d1ae2016-11-28 16:44:40 -08001256 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001257}
1258
1259/**** end of Simple Pairing Commands ****/
1260
Marie Janssend19e0782016-07-15 12:48:27 -07001261#if (L2CAP_NON_FLUSHABLE_PB_INCLUDED == TRUE)
Myles Watson911d1ae2016-11-28 16:44:40 -08001262void btsnd_hcic_enhanced_flush(uint16_t handle, uint8_t packet_type) {
1263 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1264 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001265
Myles Watson911d1ae2016-11-28 16:44:40 -08001266 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ENHANCED_FLUSH;
1267 p->offset = 0;
1268 UINT16_TO_STREAM(pp, HCI_ENHANCED_FLUSH);
1269 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ENHANCED_FLUSH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001270
Myles Watson911d1ae2016-11-28 16:44:40 -08001271 UINT16_TO_STREAM(pp, handle);
1272 UINT8_TO_STREAM(pp, packet_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001273
Myles Watson911d1ae2016-11-28 16:44:40 -08001274 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001275}
1276#endif
1277
The Android Open Source Project5738f832012-12-12 16:00:35 -08001278/*************************
Myles Watsonee96a3c2016-11-23 14:49:54 -08001279 * End of Lisbon Commands
1280 *************************/
The Android Open Source Project5738f832012-12-12 16:00:35 -08001281
Myles Watson911d1ae2016-11-28 16:44:40 -08001282void btsnd_hcic_get_link_quality(uint16_t handle) {
1283 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1284 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001285
Myles Watson911d1ae2016-11-28 16:44:40 -08001286 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
1287 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001288
Myles Watson911d1ae2016-11-28 16:44:40 -08001289 UINT16_TO_STREAM(pp, HCI_GET_LINK_QUALITY);
1290 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001291
Myles Watson911d1ae2016-11-28 16:44:40 -08001292 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001293
Myles Watson911d1ae2016-11-28 16:44:40 -08001294 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001295}
1296
Myles Watson911d1ae2016-11-28 16:44:40 -08001297void btsnd_hcic_read_rssi(uint16_t handle) {
1298 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1299 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001300
Myles Watson911d1ae2016-11-28 16:44:40 -08001301 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
1302 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001303
Myles Watson911d1ae2016-11-28 16:44:40 -08001304 UINT16_TO_STREAM(pp, HCI_READ_RSSI);
1305 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001306
Myles Watson911d1ae2016-11-28 16:44:40 -08001307 UINT16_TO_STREAM(pp, handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001308
Myles Watson911d1ae2016-11-28 16:44:40 -08001309 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001310}
1311
Jakub Pawlowski3c03d4f2019-02-14 12:44:06 +01001312static void read_encryption_key_size_complete(ReadEncKeySizeCb cb, uint8_t* return_parameters,
1313 uint16_t return_parameters_length) {
1314 uint8_t status;
1315 uint16_t handle;
1316 uint8_t key_size;
1317 STREAM_TO_UINT8(status, return_parameters);
1318 STREAM_TO_UINT16(handle, return_parameters);
1319 STREAM_TO_UINT8(key_size, return_parameters);
1320
1321 std::move(cb).Run(status, handle, key_size);
1322}
1323
1324void btsnd_hcic_read_encryption_key_size(uint16_t handle, ReadEncKeySizeCb cb) {
1325 constexpr uint8_t len = 2;
1326 uint8_t param[len];
1327 memset(param, 0, len);
1328
1329 uint8_t* p = param;
1330 UINT16_TO_STREAM(p, handle);
1331
1332 btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_READ_ENCR_KEY_SIZE, param, len,
1333 base::Bind(&read_encryption_key_size_complete, base::Passed(&cb)));
1334}
1335
Pavlin Radoslavov6ab749f2017-08-31 22:06:11 -07001336void btsnd_hcic_read_failed_contact_counter(uint16_t handle) {
1337 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1338 uint8_t* pp = (uint8_t*)(p + 1);
1339
1340 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
1341 p->offset = 0;
1342
1343 UINT16_TO_STREAM(pp, HCI_READ_FAILED_CONTACT_COUNTER);
1344 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
1345
1346 UINT16_TO_STREAM(pp, handle);
1347
1348 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1349}
1350
Pavlin Radoslavovb8568ae2017-09-01 16:09:27 -07001351void btsnd_hcic_read_automatic_flush_timeout(uint16_t handle) {
1352 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1353 uint8_t* pp = (uint8_t*)(p + 1);
1354
1355 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CMD_HANDLE;
1356 p->offset = 0;
1357
1358 UINT16_TO_STREAM(pp, HCI_READ_AUTOMATIC_FLUSH_TIMEOUT);
1359 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CMD_HANDLE);
1360
1361 UINT16_TO_STREAM(pp, handle);
1362
1363 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1364}
1365
Myles Watson911d1ae2016-11-28 16:44:40 -08001366void btsnd_hcic_enable_test_mode(void) {
1367 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1368 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001369
Myles Watson911d1ae2016-11-28 16:44:40 -08001370 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
1371 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001372
Myles Watson911d1ae2016-11-28 16:44:40 -08001373 UINT16_TO_STREAM(pp, HCI_ENABLE_DEV_UNDER_TEST_MODE);
1374 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001375
Myles Watson911d1ae2016-11-28 16:44:40 -08001376 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001377}
1378
Myles Watson911d1ae2016-11-28 16:44:40 -08001379void btsnd_hcic_write_inqscan_type(uint8_t type) {
1380 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1381 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001382
Myles Watson911d1ae2016-11-28 16:44:40 -08001383 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
1384 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001385
Myles Watson911d1ae2016-11-28 16:44:40 -08001386 UINT16_TO_STREAM(pp, HCI_WRITE_INQSCAN_TYPE);
1387 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001388
Myles Watson911d1ae2016-11-28 16:44:40 -08001389 UINT8_TO_STREAM(pp, type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001390
Myles Watson911d1ae2016-11-28 16:44:40 -08001391 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001392}
1393
Myles Watson911d1ae2016-11-28 16:44:40 -08001394void btsnd_hcic_write_inquiry_mode(uint8_t mode) {
1395 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1396 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001397
Myles Watson911d1ae2016-11-28 16:44:40 -08001398 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
1399 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001400
Myles Watson911d1ae2016-11-28 16:44:40 -08001401 UINT16_TO_STREAM(pp, HCI_WRITE_INQUIRY_MODE);
1402 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001403
Myles Watson911d1ae2016-11-28 16:44:40 -08001404 UINT8_TO_STREAM(pp, mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001405
Myles Watson911d1ae2016-11-28 16:44:40 -08001406 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001407}
1408
Myles Watson911d1ae2016-11-28 16:44:40 -08001409void btsnd_hcic_write_pagescan_type(uint8_t type) {
1410 BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
1411 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001412
Myles Watson911d1ae2016-11-28 16:44:40 -08001413 p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
1414 p->offset = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001415
Myles Watson911d1ae2016-11-28 16:44:40 -08001416 UINT16_TO_STREAM(pp, HCI_WRITE_PAGESCAN_TYPE);
1417 UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001418
Myles Watson911d1ae2016-11-28 16:44:40 -08001419 UINT8_TO_STREAM(pp, type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001420
Myles Watson911d1ae2016-11-28 16:44:40 -08001421 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001422}
1423
1424/* Must have room to store BT_HDR + max VSC length + callback pointer */
Pavlin Radoslavov70ae7de2015-09-23 14:49:24 -07001425#if (HCI_CMD_BUF_SIZE < 268)
1426#error "HCI_CMD_BUF_SIZE must be larger than 268"
The Android Open Source Project5738f832012-12-12 16:00:35 -08001427#endif
1428
Myles Watson911d1ae2016-11-28 16:44:40 -08001429void btsnd_hcic_vendor_spec_cmd(void* buffer, uint16_t opcode, uint8_t len,
1430 uint8_t* p_data, void* p_cmd_cplt_cback) {
1431 BT_HDR* p = (BT_HDR*)buffer;
1432 uint8_t* pp = (uint8_t*)(p + 1);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001433
Myles Watson911d1ae2016-11-28 16:44:40 -08001434 p->len = HCIC_PREAMBLE_SIZE + len;
1435 p->offset = sizeof(void*);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001436
Myles Watson911d1ae2016-11-28 16:44:40 -08001437 *((void**)pp) =
1438 p_cmd_cplt_cback; /* Store command complete callback in buffer */
1439 pp += sizeof(void*); /* Skip over callback pointer */
The Android Open Source Project5738f832012-12-12 16:00:35 -08001440
Myles Watson911d1ae2016-11-28 16:44:40 -08001441 UINT16_TO_STREAM(pp, HCI_GRP_VENDOR_SPECIFIC | opcode);
1442 UINT8_TO_STREAM(pp, len);
1443 ARRAY_TO_STREAM(pp, p_data, len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001444
Myles Watson911d1ae2016-11-28 16:44:40 -08001445 btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001446}