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