hciblecmds.cc revision 5a475e71a01322367a2ba591aecd62781902cfc2
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 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
49c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btsnd_hcic_ble_set_random_addr(const bt_bdaddr_t& 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
59c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(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,
67c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                     const bt_bdaddr_t& 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);
84c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(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,
203c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    uint8_t addr_type_peer, const bt_bdaddr_t& 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);
220c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(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
260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_add_white_list(uint8_t addr_type, BD_ADDR 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
276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_remove_from_white_list(uint8_t addr_type, BD_ADDR bda) {
277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_REMOVE_WHITE_LIST;
281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_REMOVE_WHITE_LIST);
284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_REMOVE_WHITE_LIST);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type);
287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BDADDR_TO_STREAM(pp, bda);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_upd_ll_conn_params(uint16_t handle, uint16_t conn_int_min,
293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_int_max,
294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_latency,
295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_timeout,
296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t min_ce_len,
297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t max_ce_len) {
298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS;
302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_UPD_LL_CONN_PARAMS);
305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_UPD_LL_CONN_PARAMS);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_min);
310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_max);
311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_latency);
312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_timeout);
313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, min_ce_len);
314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, max_ce_len);
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_host_chnl_class(
320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t chnl_map[HCIC_BLE_CHNL_MAP_SIZE]) {
321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS;
325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_HOST_CHNL_CLASS);
328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_SET_HOST_CHNL_CLASS);
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, chnl_map, HCIC_BLE_CHNL_MAP_SIZE);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_chnl_map(uint16_t handle) {
336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CHNL_MAP;
340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_CHNL_MAP);
343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CHNL_MAP);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
345911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_remote_feat(uint16_t handle) {
351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT;
355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_REMOTE_FEAT);
358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_REMOTE_FEAT);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* security management commands */
366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_encrypt(uint8_t* key, uint8_t key_len, uint8_t* plain_text,
367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                            uint8_t pt_len, void* p_cmd_cplt_cback) {
368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
371911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENCRYPT;
372911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = sizeof(void*);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  *((void**)pp) =
375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson      p_cmd_cplt_cback; /* Store command complete callback in buffer */
376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  pp += sizeof(void*);  /* Skip over callback pointer */
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_ENCRYPT);
379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENCRYPT);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  memset(pp, 0, HCIC_PARAM_SIZE_BLE_ENCRYPT);
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (key_len > HCIC_BLE_ENCRYT_KEY_SIZE) key_len = HCIC_BLE_ENCRYT_KEY_SIZE;
384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  if (pt_len > HCIC_BLE_ENCRYT_KEY_SIZE) pt_len = HCIC_BLE_ENCRYT_KEY_SIZE;
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, key, key_len);
387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  pp += (HCIC_BLE_ENCRYT_KEY_SIZE - key_len);
388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, plain_text, pt_len);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3930c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowskivoid btsnd_hcic_ble_rand(base::Callback<void(BT_OCTET8)> cb) {
3940c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski  btu_hcif_send_cmd_with_cb(FROM_HERE, HCI_BLE_RAND, nullptr, 0,
3950c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                            base::Bind(
3960c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                [](base::Callback<void(BT_OCTET8)> cb,
3970c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                   uint8_t* param, uint16_t param_len) {
3980c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                  CHECK(param[0] == 0)
3990c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                      << "LE Rand return status must be zero";
4000c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                  cb.Run(param + 1 /* skip status */);
4010c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                },
4020c683232e28ea616844bfa03d876a08df217ba13Jakub Pawlowski                                std::move(cb)));
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_start_enc(uint16_t handle,
406911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint8_t rand[HCIC_BLE_RAND_DI_SIZE],
407911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint16_t ediv,
408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                              uint8_t ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) {
409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_START_ENC;
413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_START_ENC);
416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_START_ENC);
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, rand, HCIC_BLE_RAND_DI_SIZE);
420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, ediv);
421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_ltk_req_reply(uint16_t handle,
427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                  uint8_t ltk[HCIC_BLE_ENCRYT_KEY_SIZE]) {
428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_REPLY;
432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_REPLY);
435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_REPLY);
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, ltk, HCIC_BLE_ENCRYT_KEY_SIZE);
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_ltk_req_neg_reply(uint16_t handle) {
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY;
448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_LTK_REQ_NEG_REPLY);
451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_LTK_REQ_NEG_REPLY);
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_receiver_test(uint8_t rx_freq) {
459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM1;
463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RECEIVER_TEST);
466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM1);
467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, rx_freq);
469ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_transmitter_test(uint8_t tx_freq, uint8_t test_data_len,
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                     uint8_t payload) {
475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_WRITE_PARAM3;
479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_TRANSMITTER_TEST);
482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_WRITE_PARAM3);
483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, tx_freq);
485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, test_data_len);
486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, payload);
487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_test_end(void) {
492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_TEST_END);
499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
500ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_host_supported(void) {
505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_READ_CMD;
509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_READ_LE_HOST_SUPPORT);
512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_READ_CMD);
513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
517d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BLE_LLT_INCLUDED == TRUE)
5187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rc_param_req_reply(uint16_t handle, uint16_t conn_int_min,
520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_int_max,
521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_latency,
522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t conn_timeout,
523911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t min_ce_len,
524911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                       uint16_t max_ce_len) {
525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
5277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY;
529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
5307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_REPLY);
532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_REPLY);
5337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_min);
536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_int_max);
537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_latency);
538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_timeout);
539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, min_ce_len);
540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, max_ce_len);
5417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
5437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rc_param_req_neg_reply(uint16_t handle, uint8_t reason) {
546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
5487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY;
550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
5517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RC_PARAM_REQ_NEG_REPLY);
553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RC_PARAM_REQ_NEG_REPLY);
5547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, handle);
556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, reason);
5577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
5597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_add_device_resolving_list(
563c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski    uint8_t addr_type_peer, const bt_bdaddr_t& bda_peer,
564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson    uint8_t irk_peer[HCIC_BLE_IRK_SIZE], uint8_t irk_local[HCIC_BLE_IRK_SIZE]) {
565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
567444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST;
569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
570444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_ADD_DEV_RESOLVING_LIST);
572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ADD_DEV_RESOLVING_LIST);
573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
574c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(bda_peer));
575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, irk_peer, HCIC_BLE_ENCRYT_KEY_SIZE);
576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  ARRAY_TO_STREAM(pp, irk_local, HCIC_BLE_ENCRYT_KEY_SIZE);
577444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
579444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
580444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_rm_device_resolving_list(uint8_t addr_type_peer,
582c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                             const bt_bdaddr_t& bda_peer) {
583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
585444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST;
587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
588444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_RM_DEV_RESOLVING_LIST);
590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_RM_DEV_RESOLVING_LIST);
591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
592c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(bda_peer));
593444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
595444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
596444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
597c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowskivoid btsnd_hcic_ble_set_privacy_mode(uint8_t addr_type_peer,
598c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                     const bt_bdaddr_t& bda_peer,
599f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski                                     uint8_t privacy_type) {
600f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
601f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
602f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
603f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE;
604f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  p->offset = 0;
605f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
606f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_BLE_SET_PRIVACY_MODE);
607f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_PRIVACY_MODE);
608f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_peer);
609c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(bda_peer));
610f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  UINT8_TO_STREAM(pp, privacy_type);
611f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
612f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
613f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski}
614f6db7cb9a30b34493df8658d59b2fe2232bc828aJakub Pawlowski
615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_clear_resolving_list(void) {
616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
618444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST;
620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
621444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_CLEAR_RESOLVING_LIST);
623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_CLEAR_RESOLVING_LIST);
624444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
626444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
628911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_resolvable_addr_peer(uint8_t addr_type_peer,
629c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski                                              const bt_bdaddr_t& bda_peer) {
630911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
631911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
632444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
633911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER;
634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
635444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_PEER);
637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_PEER);
638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
639c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski  BDADDR_TO_STREAM(pp, to_BD_ADDR(bda_peer));
640444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
643444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_read_resolvable_addr_local(uint8_t addr_type_peer,
645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                               BD_ADDR bda_peer) {
646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
648444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL;
650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
651444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_READ_RESOLVABLE_ADDR_LOCAL);
653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_READ_RESOLVABLE_ADDR_LOCAL);
654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_type_peer);
655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BDADDR_TO_STREAM(pp, bda_peer);
656444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
658444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_addr_resolution_enable(uint8_t addr_resolution_enable) {
661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
663444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE;
665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
666444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_ADDR_RESOLUTION_ENABLE);
668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_ADDR_RESOLUTION_ENABLE);
669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, addr_resolution_enable);
670444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
672444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
673444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_rand_priv_addr_timeout(uint16_t rpa_timout) {
675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT;
679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
680444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_RAND_PRIV_ADDR_TIMOUT);
683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, rpa_timout);
684444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
686444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji}
687444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji
688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btsnd_hcic_ble_set_data_length(uint16_t conn_handle, uint16_t tx_octets,
689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                    uint16_t tx_time) {
690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  uint8_t* pp = (uint8_t*)(p + 1);
692636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH;
694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  p->offset = 0;
695636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, HCI_BLE_SET_DATA_LENGTH);
697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_SET_DATA_LENGTH);
698636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, conn_handle);
700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, tx_octets);
701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  UINT16_TO_STREAM(pp, tx_time);
702636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera
703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
704636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera}
7059df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7065a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid btsnd_hcic_ble_enh_rx_test(uint8_t rx_chan, uint8_t phy,
7075a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                                uint8_t mod_index) {
7085a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7095a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = (uint8_t*)(p + 1);
7105a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7115a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_RX_TEST;
7125a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->offset = 0;
7135a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7145a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, HCI_BLE_ENH_RECEIVER_TEST);
7155a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_RX_TEST);
7165a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7175a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, rx_chan);
7185a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, phy);
7195a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, mod_index);
7205a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7215a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7225a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
7235a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7245a475e71a01322367a2ba591aecd62781902cfc2Avish Shahvoid btsnd_hcic_ble_enh_tx_test(uint8_t tx_chan, uint8_t data_len,
7255a475e71a01322367a2ba591aecd62781902cfc2Avish Shah                                uint8_t payload, uint8_t phy) {
7265a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7275a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  uint8_t* pp = (uint8_t*)(p + 1);
7285a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7295a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->len = HCIC_PREAMBLE_SIZE + HCIC_PARAM_SIZE_BLE_ENH_TX_TEST;
7305a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  p->offset = 0;
7315a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7325a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT16_TO_STREAM(pp, HCI_BLE_ENH_TRANSMITTER_TEST);
7335a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, HCIC_PARAM_SIZE_BLE_ENH_TX_TEST);
7345a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, tx_chan);
7355a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, data_len);
7365a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, payload);
7375a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  UINT8_TO_STREAM(pp, phy);
7385a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7395a475e71a01322367a2ba591aecd62781902cfc2Avish Shah  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7405a475e71a01322367a2ba591aecd62781902cfc2Avish Shah}
7415a475e71a01322367a2ba591aecd62781902cfc2Avish Shah
7429df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowskivoid btsnd_hcic_ble_set_extended_scan_params(uint8_t own_address_type,
7439df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t scanning_filter_policy,
7449df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t scanning_phys,
7459df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             scanning_phy_cfg* phy_cfg) {
7469df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7479df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
7489df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
74942300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  int phy_cnt =
75042300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski      std::bitset<std::numeric_limits<uint8_t>::digits>(scanning_phys).count();
75142300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski
75242300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  uint16_t param_len = 3 + (5 * phy_cnt);
7530c86aad3f588a5d68a2407a60e536f459b10bfebReddy Praveen  p->len = HCIC_PREAMBLE_SIZE + param_len;
7549df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->offset = 0;
7559df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7569df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_PARAMETERS);
7579df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
7589df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7599df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, own_address_type);
7609df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, scanning_filter_policy);
7619df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, scanning_phys);
7629df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
76342300f2235b63ad43e0e237ed19fb620fe12d939Jakub Pawlowski  for (int i = 0; i < phy_cnt; i++) {
7649df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT8_TO_STREAM(pp, phy_cfg[i].scan_type);
7659df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
7669df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
7679df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  }
7689df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7699df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7709df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski}
7719df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7729df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowskivoid btsnd_hcic_ble_set_extended_scan_enable(uint8_t enable,
7739df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint8_t filter_duplicates,
7749df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint16_t duration,
7759df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski                                             uint16_t period) {
7769df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
7779df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
7789df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7799df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  const int param_len = 6;
7809df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + param_len;
7819df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  p->offset = 0;
7829df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7839df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_SET_EXTENDED_SCAN_ENABLE);
7849df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
7859df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7869df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, enable);
7879df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT8_TO_STREAM(pp, filter_duplicates);
7889df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, duration);
7899df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  UINT16_TO_STREAM(pp, period);
7909df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski
7919df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
7929df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski}
79393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
79493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowskivoid btsnd_hcic_ble_ext_create_conn(uint8_t init_filter_policy,
79593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    uint8_t addr_type_own,
79693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    uint8_t addr_type_peer, BD_ADDR bda_peer,
79793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    uint8_t initiating_phys,
79893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski                                    EXT_CONN_PHY_CFG* phy_cfg) {
79993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  BT_HDR* p = (BT_HDR*)osi_malloc(HCI_CMD_BUF_SIZE);
80093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  uint8_t* pp = (uint8_t*)(p + 1);
80193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
80293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  int phy_cnt =
80393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski      std::bitset<std::numeric_limits<uint8_t>::digits>(initiating_phys)
80493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski          .count();
80593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
80693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  /* param_len = initial_params + size_per_channel * num_of_channels */
80793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  uint8_t param_len = 10 + (16 * phy_cnt);
80893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
80993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  p->len = HCIC_PREAMBLE_SIZE + param_len;
81093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  p->offset = 0;
81193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
81293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT16_TO_STREAM(pp, HCI_LE_EXTENDED_CREATE_CONNECTION);
81393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, param_len);
81493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
81593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, init_filter_policy);
81693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_own);
81793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, addr_type_peer);
81893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  BDADDR_TO_STREAM(pp, bda_peer);
81993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
82093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  UINT8_TO_STREAM(pp, initiating_phys);
82193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
82293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  for (int i = 0; i < phy_cnt; i++) {
82393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_int);
82493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].scan_win);
82593df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_min);
82693df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_int_max);
82793df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].conn_latency);
82893df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].sup_timeout);
82993df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].min_ce_len);
83093df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski    UINT16_TO_STREAM(pp, phy_cfg[i].max_ce_len);
83193df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  }
83293df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski
83393df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski  btu_hcif_send_cmd(LOCAL_BR_EDR_CONTROLLER_ID, p);
83493df860536b5a2a901248a7ae7319aabff2624dfJakub Pawlowski}
835