15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski *  Copyright 1999-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains function of the HCIC unit to format and send HCI
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  commands.
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h"
28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
320c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski#include <base/bind.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_local_used_feat(uint8_t feat_set[8]) {
37911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
38911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_USED_FEAT_CMD;
41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_LOCAL_SPT_FEAT);
44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, feat_set, HCIC_PARAM_SIZE_SET_USED_FEAT_CMD);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
46911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btsnd_hcic_ble_set_random_addr(const RawAddress& random_bda) {
50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD;
54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_RANDOM_ADDR);
57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_RANDOM_ADDR_CMD);
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, random_bda);
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_write_adv_params(uint16_t adv_int_min, uint16_t adv_int_max,
65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t adv_type, uint8_t addr_type_own,
66c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                     uint8_t addr_type_dir,
67a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                     const RawAddress& direct_bda,
68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t channel_map,
69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t adv_filter_policy) {
70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
73911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS;
74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
76911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_PARAMS);
77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, adv_int_min);
80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, adv_int_max);
81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, adv_type);
82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_own);
83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_dir);
84b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, direct_bda);
85911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, channel_map);
86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, adv_filter_policy);
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_adv_chnl_tx_power(void) {
91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_ADV_CHNL_TX_POWER);
98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_adv_data(uint8_t data_len, uint8_t* p_data) {
104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1;
108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_DATA);
111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA + 1);
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA);
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_data != NULL && data_len > 0) {
116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA)
117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      data_len = HCIC_PARAM_SIZE_BLE_WRITE_ADV_DATA;
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(pp, data_len);
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ARRAY_TO_STREAM(pp, p_data, data_len);
122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_scan_rsp_data(uint8_t data_len, uint8_t* p_scan_rsp) {
126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1;
130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_RSP_DATA);
133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP + 1);
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(pp, 0, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP);
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (p_scan_rsp != NULL && data_len > 0) {
138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    if (data_len > HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP)
139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      data_len = HCIC_PARAM_SIZE_BLE_WRITE_SCAN_RSP;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    UINT8_TO_STREAM(pp, data_len);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    ARRAY_TO_STREAM(pp, p_scan_rsp, data_len);
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  }
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_adv_enable(uint8_t adv_enable) {
150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_ADV_ENABLE;
154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_ADV_ENABLE);
157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_ADV_ENABLE);
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, adv_enable);
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_scan_params(uint8_t scan_type, uint16_t scan_int,
164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    uint16_t scan_win, uint8_t addr_type_own,
165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    uint8_t scan_filter_policy) {
166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM;
170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_PARAMS);
173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_PARAM);
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, scan_type);
176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, scan_int);
177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, scan_win);
178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_own);
179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, scan_filter_policy);
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_scan_enable(uint8_t scan_enable, uint8_t duplicate) {
185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE;
189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_WRITE_SCAN_ENABLE);
192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_WRITE_SCAN_ENABLE);
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, scan_enable);
195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, duplicate);
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* link layer connection management commands */
201c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btsnd_hcic_ble_create_ll_conn(
202c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    uint16_t scan_int, uint16_t scan_win, uint8_t init_filter_policy,
203a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski    uint8_t addr_type_peer, const RawAddress& bda_peer, uint8_t addr_type_own,
204c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    uint16_t conn_int_min, uint16_t conn_int_max, uint16_t conn_latency,
205c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    uint16_t conn_timeout, uint16_t min_ce_len, uint16_t max_ce_len) {
206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN;
210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_CREATE_LL_CONN);
213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CREATE_LL_CONN);
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, scan_int);
216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, scan_win);
217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, init_filter_policy);
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
220b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_own);
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_min);
224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_max);
225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_latency);
226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_timeout);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, min_ce_len);
229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, max_ce_len);
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_create_conn_cancel(void) {
235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
236911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL;
239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_CREATE_CONN_CANCEL);
242911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CREATE_CONN_CANCEL);
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_clear_white_list(void) {
248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_CLEAR_WHITE_LIST;
252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_WHITE_LIST);
255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_CLEAR_WHITE_LIST);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
260a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowskivoid btsnd_hcic_ble_add_white_list(uint8_t addr_type, const RawAddress& bda) {
261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_ADD_WHITE_LIST;
265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_ADD_WHITE_LIST);
268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_ADD_WHITE_LIST);
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type);
271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BDADDR_TO_STREAM(pp, bda);
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
276b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowskivoid btsnd_hcic_ble_remove_from_white_list(uint8_t addr_type,
277a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                           const RawAddress& bda) {
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REMOVE_WHITE_LIST;
282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_REMOVE_WHITE_LIST);
285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REMOVE_WHITE_LIST);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type);
288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BDADDR_TO_STREAM(pp, bda);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_upd_ll_conn_params(uint16_t handle, uint16_t conn_int_min,
294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_int_max,
295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_latency,
296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_timeout,
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t min_ce_len,
298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t max_ce_len) {
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_UPD_LL_CONN_PARAMS);
306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_min);
311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_max);
312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_latency);
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_timeout);
314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, min_ce_len);
315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, max_ce_len);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_host_chnl_class(
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t chnl_map[HCIC_BLE_CHNL_MAP_SIZE]) {
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_HOST_CHNL_CLASS);
329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_chnl_map(uint16_t handle) {
337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_CHNL_MAP);
344911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
346911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_remote_feat(uint16_t handle) {
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_REMOTE_FEAT);
359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* security management commands */
367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_encrypt(uint8_t* key, uint8_t key_len, uint8_t* plain_text,
368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            uint8_t pt_len, void* p_cmd_cplt_cback) {
369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
370911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = sizeof(void*);
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *((void**)pp) =
376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cmd_cplt_cback; /* Store command complete callback in buffer */
377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  pp += sizeof(void*);  /* Skip over callback pointer */
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_ENCRYPT);
380911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, key, key_len);
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, plain_text, pt_len);
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3940c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowskivoid btsnd_hcic_ble_rand(base::Callback<void(BT_OCTET8)> cb) {
3950c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_RAND, nullptr, 0,
3960c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                            base::Bind(
3970c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                [](base::Callback<void(BT_OCTET8)> cb,
3980c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                   uint8_t* param, uint16_t param_len) {
3990c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                  CHECK(param[0] == 0)
4000c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                      << "LE Rand return status must be zero";
4010c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                  cb.Run(param + 1 /* skip status */);
4020c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                },
4030c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                std::move(cb)));
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_start_enc(uint16_t handle,
407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint8_t rand[HCIC_BLE_RAND_DI_SIZE],
408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint16_t ediv,
409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint8_t ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) {
410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_START_ENC);
417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_START_ENC);
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, rand, HCIC_BLE_RAND_DI_SIZE);
421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, ediv);
422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_ltk_req_reply(uint16_t handle,
428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                  uint8_t ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) {
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_REPLY);
436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_ltk_req_neg_reply(uint16_t handle) {
445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_NEG_REPLY);
452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_receiver_test(uint8_t rx_freq) {
460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RECEIVER_TEST);
467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
468ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, rx_freq);
470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_transmitter_test(uint8_t tx_freq, uint8_t test_data_len,
475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t payload) {
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_TRANSMITTER_TEST);
483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, tx_freq);
486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, test_data_len);
487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, payload);
488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_test_end(void) {
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
498ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_TEST_END);
500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_host_supported(void) {
506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_READ_LE_HOST_SUPPORT);
513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
517ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
518d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_LLT_INCLUDED == TRUE)
5197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rc_param_req_reply(uint16_t handle, uint16_t conn_int_min,
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_int_max,
522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_latency,
523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_timeout,
524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t min_ce_len,
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t max_ce_len) {
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
5287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
5317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_REPLY);
533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
5347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_min);
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_max);
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_latency);
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_timeout);
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, min_ce_len);
541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, max_ce_len);
5427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
5447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rc_param_req_neg_reply(uint16_t handle, uint8_t reason) {
547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
5497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
5527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
5557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, reason);
5587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
5607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_add_device_resolving_list(
564a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski    uint8_t addr_type_peer, const RawAddress& bda_peer,
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t irk_peer[HCIC_BLE_IRK_SIZE], uint8_t irk_local[HCIC_BLE_IRK_SIZE]) {
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
568444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
571444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
575b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, irk_peer, HCIC_BLE_ENCRYT_KEY_SIZE);
577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, irk_local, HCIC_BLE_ENCRYT_KEY_SIZE);
578444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
580444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
581444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rm_device_resolving_list(uint8_t addr_type_peer,
583a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                             const RawAddress& bda_peer) {
584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
586444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
589444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
593b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
594444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
596444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
597444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
598c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btsnd_hcic_ble_set_privacy_mode(uint8_t addr_type_peer,
599a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                     const RawAddress& bda_peer,
600f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski                                     uint8_t privacy_type) {
601f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
602f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
603f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
604f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE;
605f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  p->offset = 0;
606f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
607f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_BLE_SET_PRIVACY_MODE);
608f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE);
609f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_peer);
610b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
611f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, privacy_type);
612f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
613f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
614f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski}
615f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_clear_resolving_list(void) {
617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
619444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
622444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_RESOLVING_LIST);
624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
625444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
628444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
629911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_resolvable_addr_peer(uint8_t addr_type_peer,
630a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                              const RawAddress& bda_peer) {
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
632911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
633444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
636444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
640b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
641444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
643444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
644444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_resolvable_addr_local(uint8_t addr_type_peer,
646a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                               const RawAddress& bda_peer) {
647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
649444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
652444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BDADDR_TO_STREAM(pp, bda_peer);
657444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
660444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_addr_resolution_enable(uint8_t addr_resolution_enable) {
662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
664444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
667444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_resolution_enable);
671444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
673444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
674444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_rand_priv_addr_timeout(uint16_t rpa_timout) {
676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
678444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
681444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, rpa_timout);
685444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
687444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
688444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_data_length(uint16_t conn_handle, uint16_t tx_octets,
690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    uint16_t tx_time) {
691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
693636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
696636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
699636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_handle);
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, tx_octets);
702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, tx_time);
703636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
705636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera}
7069df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7075a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid btsnd_hcic_ble_enh_rx_test(uint8_t rx_chan, uint8_t phy,
7085a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                                uint8_t mod_index) {
7095a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7105a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = (uint8_t*)(p + 1);
7115a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7125a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_RX_TEST;
7135a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->offset = 0;
7145a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7155a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, HCI_BLE_ENH_RECEIVER_TEST);
7165a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_RX_TEST);
7175a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7185a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, rx_chan);
7195a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, phy);
7205a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, mod_index);
7215a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7225a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7235a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
7245a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7255a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid btsnd_hcic_ble_enh_tx_test(uint8_t tx_chan, uint8_t data_len,
7265a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                                uint8_t payload, uint8_t phy) {
7275a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7285a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = (uint8_t*)(p + 1);
7295a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_TX_TEST;
7315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->offset = 0;
7325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, HCI_BLE_ENH_TRANSMITTER_TEST);
7345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_TX_TEST);
7355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, tx_chan);
7365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, data_len);
7375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, payload);
7385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, phy);
7395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
7425a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7439df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowskivoid btsnd_hcic_ble_set_extended_scan_params(uint8_t own_address_type,
7449df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t scanning_filter_policy,
7459df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t scanning_phys,
7469df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             scanning_phy_cfg* phy_cfg) {
7479df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7489df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
7499df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
75042300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  int phy_cnt =
75142300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski      std::bitset<std::numeric_limits<uint8_t>::digits>(scanning_phys).count();
75242300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski
75342300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  uint16_t param_len = 3 + (5 * phy_cnt);
7540c86aad3f588a5d68a2407a60e536f459b10bfebReddy Praveen  p->len = HCIC_PREAMBLE_SIZE + param_len;
7559df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->offset = 0;
7569df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7579df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_PARAMETERS);
7589df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
7599df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7609df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, own_address_type);
7619df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, scanning_filter_policy);
7629df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, scanning_phys);
7639df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
76442300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  for (int i = 0; i < phy_cnt; i++) {
7659df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT8_TO_STREAM(pp, phy_cfg[i].scan_type);
7669df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
7679df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
7689df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  }
7699df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7709df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7719df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski}
7729df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7739df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowskivoid btsnd_hcic_ble_set_extended_scan_enable(uint8_t enable,
7749df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t filter_duplicates,
7759df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint16_t duration,
7769df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint16_t period) {
7779df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7789df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
7799df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7809df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  const int param_len = 6;
7819df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + param_len;
7829df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->offset = 0;
7839df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7849df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_ENABLE);
7859df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
7869df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7879df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, enable);
7889df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, filter_duplicates);
7899df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, duration);
7909df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, period);
7919df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7929df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7939df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski}
79493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
79593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowskivoid btsnd_hcic_ble_ext_create_conn(uint8_t init_filter_policy,
79693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    uint8_t addr_type_own,
797b8a477e9ac51898b05cb328eda897d95f1ef3d02Jakub Pawlowski                                    uint8_t addr_type_peer,
798a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski                                    const RawAddress& bda_peer,
79993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    uint8_t initiating_phys,
80093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    EXT_CONN_PHY_CFG* phy_cfg) {
80193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
80293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
80393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
80493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  int phy_cnt =
80593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski      std::bitset<std::numeric_limits<uint8_t>::digits>(initiating_phys)
80693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski          .count();
80793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
80893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  /* param_len = initial_params + size_per_channel * num_of_channels */
80993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  uint8_t param_len = 10 + (16 * phy_cnt);
81093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
81193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + param_len;
81293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  p->offset = 0;
81393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
81493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_EXTENDED_CREATE_CONNECTION);
81593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
81693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
81793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, init_filter_policy);
81893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_own);
81993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_peer);
82093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
82193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
82293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, initiating_phys);
82393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
82493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  for (int i = 0; i < phy_cnt; i++) {
82593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
82693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
82793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_min);
82893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_max);
82993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_latency);
83093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].sup_timeout);
83193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].min_ce_len);
83293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].max_ce_len);
83393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  }
83493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
83593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
83693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski}
837