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