1 /****************************************************************************** 2 * 3 * Copyright 1999-2012 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 #ifndef HCIMSGS_H 20 #define HCIMSGS_H 21 22 #include <base/functional/callback_forward.h> 23 24 #include <cstdint> 25 #include <vector> 26 27 #include "device/include/esco_parameters.h" 28 #include "stack/include/bt_lap.h" 29 #include "stack/include/bt_name.h" 30 #include "stack/include/bt_octets.h" 31 #include "stack/include/btm_api_types.h" 32 #include "types/ble_address_with_type.h" 33 #include "types/raw_address.h" 34 35 /* Message by message.... */ 36 37 enum hci_data_direction_t { 38 HOST_TO_CONTROLLER = 0, 39 CONTROLLER_TO_HOST = 1, 40 }; 41 42 /* Disconnect */ 43 namespace bluetooth::legacy::hci { 44 class Interface { 45 public: 46 virtual void Disconnect(uint16_t handle, uint8_t reason) const = 0; 47 virtual void ChangeConnectionPacketType(uint16_t handle, uint16_t packet_types) const = 0; 48 virtual void StartRoleSwitch(const RawAddress& bd_addr, uint8_t role) const = 0; 49 virtual void ConfigureDataPath(hci_data_direction_t data_path_direction, uint8_t data_path_id, 50 std::vector<uint8_t> vendor_config) const = 0; 51 virtual ~Interface() = default; 52 }; 53 54 const Interface& GetInterface(); 55 } // namespace bluetooth::legacy::hci 56 57 /* Add SCO Connection */ 58 void btsnd_hcic_add_SCO_conn(uint16_t handle, uint16_t packet_types); 59 60 /* Create Connection Cancel */ 61 void btsnd_hcic_create_conn_cancel(const RawAddress& dest); 62 63 /* Reject Connection Request */ 64 void btsnd_hcic_reject_conn(const RawAddress& bd_addr, uint8_t reason); 65 66 /* Link Key Request Reply */ 67 void btsnd_hcic_link_key_req_reply(const RawAddress& bd_addr, const LinkKey& link_key); 68 69 /* Link Key Request Neg Reply */ 70 void btsnd_hcic_link_key_neg_reply(const RawAddress& bd_addr); 71 72 /* PIN Code Request Reply */ 73 void btsnd_hcic_pin_code_req_reply(const RawAddress& bd_addr, uint8_t pin_code_len, 74 PIN_CODE pin_code); 75 76 /* Link Key Request Neg Reply */ 77 void btsnd_hcic_pin_code_neg_reply(const RawAddress& bd_addr); 78 79 /* Change Connection Type */ 80 void btsnd_hcic_change_conn_type(uint16_t handle, uint16_t packet_types); 81 82 /* Change Connection Type */ 83 void btsnd_hcic_auth_request(uint16_t handle); /* Authentication Request */ 84 85 /* Set Connection Encryption */ 86 void btsnd_hcic_set_conn_encrypt(uint16_t handle, bool enable); 87 88 /* Remote Extended Features */ 89 void btsnd_hcic_rmt_ext_features(uint16_t handle, uint8_t page_num); 90 91 void btsnd_hcic_rmt_ver_req(uint16_t handle); /* Remote Version Info Request */ 92 void btsnd_hcic_read_rmt_clk_offset(uint16_t handle); /* Remote Clock Offset */ 93 void btsnd_hcic_setup_esco_conn(uint16_t handle, uint32_t transmit_bandwidth, 94 uint32_t receive_bandwidth, uint16_t max_latency, uint16_t voice, 95 uint8_t retrans_effort, uint16_t packet_types); 96 void btsnd_hcic_accept_esco_conn(const RawAddress& bd_addr, uint32_t transmit_bandwidth, 97 uint32_t receive_bandwidth, uint16_t max_latency, 98 uint16_t content_fmt, uint8_t retrans_effort, 99 uint16_t packet_types); 100 101 void btsnd_hcic_reject_esco_conn(const RawAddress& bd_addr, uint8_t reason); 102 /* Hold Mode */ 103 void btsnd_hcic_hold_mode(uint16_t handle, uint16_t max_hold_period, uint16_t min_hold_period); 104 105 /* Hold Mode */ 106 107 /* Sniff Mode */ 108 void btsnd_hcic_sniff_mode(uint16_t handle, uint16_t max_sniff_period, uint16_t min_sniff_period, 109 uint16_t sniff_attempt, uint16_t sniff_timeout); 110 111 /* Exit Sniff Mode */ 112 void btsnd_hcic_exit_sniff_mode(uint16_t handle); 113 114 /* Park Mode */ 115 void btsnd_hcic_park_mode(uint16_t handle, uint16_t beacon_max_interval, 116 uint16_t beacon_min_interval); 117 118 /* Exit Park Mode */ 119 void btsnd_hcic_exit_park_mode(uint16_t handle); 120 121 /* Write Policy Settings */ 122 void btsnd_hcic_write_policy_set(uint16_t handle, uint16_t settings); 123 124 /* Write Default Policy Settings */ 125 void btsnd_hcic_write_def_policy_set(uint16_t settings); 126 127 /****************************************** 128 * Lisbon Features 129 ******************************************/ 130 /* Sniff Subrating */ 131 void btsnd_hcic_sniff_sub_rate(uint16_t handle, uint16_t max_lat, uint16_t min_remote_lat, 132 uint16_t min_local_lat); 133 /* Sniff Subrating */ 134 135 /* Extended Inquiry Response */ 136 void btsnd_hcic_write_ext_inquiry_response(void* buffer, uint8_t fec_req); 137 /* IO Capabilities Response */ 138 void btsnd_hcic_io_cap_req_reply(const RawAddress& bd_addr, uint8_t capability, uint8_t oob_present, 139 uint8_t auth_req); 140 /* IO Capabilities Req Neg Reply */ 141 void btsnd_hcic_io_cap_req_neg_reply(const RawAddress& bd_addr, uint8_t err_code); 142 /* Read Local OOB Data */ 143 void btsnd_hcic_read_local_oob_data(void); 144 145 /* Read Local OOB Extended Data */ 146 void btsnd_hcic_read_local_oob_extended_data(void); 147 148 void btsnd_hcic_user_conf_reply(const RawAddress& bd_addr, bool is_yes); 149 150 void btsnd_hcic_user_passkey_reply(const RawAddress& bd_addr, uint32_t value); 151 152 void btsnd_hcic_user_passkey_neg_reply(const RawAddress& bd_addr); 153 154 /* Remote OOB Data Request Reply */ 155 void btsnd_hcic_rem_oob_reply(const RawAddress& bd_addr, const Octet16& c, const Octet16& r); 156 157 /* Remote OOB Data Request Negative Reply */ 158 void btsnd_hcic_rem_oob_neg_reply(const RawAddress& bd_addr); 159 160 /* Read Default Erroneous Data Reporting */ 161 void btsnd_hcic_read_default_erroneous_data_rpt(void); 162 163 /**** end of Simple Pairing Commands ****/ 164 165 extern void btsnd_hcic_set_event_filter(uint8_t filt_type, uint8_t filt_cond_type, 166 uint8_t* filt_cond, uint8_t filt_cond_len); 167 /* Set Event Filter */ 168 169 /* Delete Stored Key */ 170 void btsnd_hcic_delete_stored_key(const RawAddress& bd_addr, bool delete_all_flag); 171 /* Delete Stored Key */ 172 173 #define HCIC_PARAM_SIZE_READ_CMD 0 174 175 #define HCIC_PARAM_SIZE_WRITE_PARAM1 1 176 177 #define HCIC_PARAM_SIZE_WRITE_PARAM3 3 178 179 void btsnd_hcic_write_pin_type(uint8_t type); /* Write PIN Type */ 180 void btsnd_hcic_write_auto_accept(uint8_t flag); /* Write Auto Accept */ 181 void btsnd_hcic_read_name(void); /* Read Local Name */ 182 void btsnd_hcic_write_page_tout(uint16_t timeout); /* Write Page Timeout */ 183 void btsnd_hcic_write_scan_enable(uint8_t flag); /* Write Scan Enable */ 184 void btsnd_hcic_write_pagescan_cfg(uint16_t interval, 185 uint16_t window); /* Write Page Scan Activity */ 186 /* Write Page Scan Activity */ 187 188 /* Write Inquiry Scan Activity */ 189 void btsnd_hcic_write_inqscan_cfg(uint16_t interval, uint16_t window); 190 /* Write Inquiry Scan Activity */ 191 192 void btsnd_hcic_write_auth_enable(uint8_t flag); /* Write Authentication Enable */ 193 void btsnd_hcic_write_dev_class(DEV_CLASS dev); /* Write Class of Device */ 194 void btsnd_hcic_write_voice_settings(uint16_t flags); /* Write Voice Settings */ 195 196 void btsnd_hcic_write_auto_flush_tout(uint16_t handle, 197 uint16_t timeout); /* Write Retransmit Timeout */ 198 199 void btsnd_hcic_read_tx_power(uint16_t handle, uint8_t type); /* Read Tx Power */ 200 201 /* Write Link Supervision Timeout */ 202 void btsnd_hcic_write_link_super_tout(uint16_t handle, uint16_t timeout); 203 /* Write Link Supervision Timeout */ 204 205 void btsnd_hcic_write_cur_iac_lap(uint8_t num_cur_iac, 206 LAP* const iac_lap); /* Write Current IAC LAP */ 207 /* Write Current IAC LAP */ 208 209 void btsnd_hcic_read_rssi(uint16_t handle); /* Read RSSI */ 210 using ReadEncKeySizeCb = base::OnceCallback<void(uint8_t, uint16_t, uint8_t)>; 211 void btsnd_hcic_read_encryption_key_size(uint16_t handle, ReadEncKeySizeCb cb); 212 void btsnd_hcic_read_failed_contact_counter(uint16_t handle); 213 void btsnd_hcic_enable_test_mode(void); /* Enable Device Under Test Mode */ 214 void btsnd_hcic_write_pagescan_type(uint8_t type); /* Write Page Scan Type */ 215 void btsnd_hcic_write_inqscan_type(uint8_t type); /* Write Inquiry Scan Type */ 216 void btsnd_hcic_write_inquiry_mode(uint8_t type); /* Write Inquiry Mode */ 217 218 /* Enhanced setup SCO connection (CSA2) */ 219 void btsnd_hcic_enhanced_set_up_synchronous_connection(uint16_t conn_handle, 220 enh_esco_params_t* p_parms); 221 222 /* Enhanced accept SCO connection request (CSA2) */ 223 void btsnd_hcic_enhanced_accept_synchronous_connection(const RawAddress& bd_addr, 224 enh_esco_params_t* p_parms); 225 226 #define HCI_DATA_HANDLE_MASK 0x0FFF 227 #define HCI_DATA_PKT_STATUS_MASK 0x3000 228 229 #define HCID_GET_HANDLE_EVENT(p) \ 230 (uint16_t)((*((uint8_t*)((p) + 1) + (p)->offset) + \ 231 (*((uint8_t*)((p) + 1) + (p)->offset + 1) << 8))) 232 233 #define HCID_GET_HANDLE(u16) (uint16_t)((u16) & HCI_DATA_HANDLE_MASK) 234 #define HCID_GET_PKT_STATUS(u16) (uint16_t)(((u16) & HCI_DATA_PKT_STATUS_MASK) >> 12) 235 236 #define HCI_DATA_EVENT_MASK 3 237 #define HCI_DATA_EVENT_OFFSET 12 238 #define HCID_GET_EVENT(u16) (uint8_t)(((u16) >> HCI_DATA_EVENT_OFFSET) & HCI_DATA_EVENT_MASK) 239 240 void btsnd_hcic_vendor_spec_cmd(uint16_t opcode, uint8_t len, uint8_t* p_data, 241 tBTM_VSC_CMPL_CB* p_cmd_cplt_cback); 242 243 /******************************************************************************* 244 * BLE Commands 245 * Note: "local_controller_id" is for transport, not counted in HCI 246 * message size 247 ******************************************************************************/ 248 #define HCIC_BLE_RAND_DI_SIZE 8 249 250 #define HCIC_BLE_CHNL_MAP_SIZE 5 251 #define HCIC_PARAM_SIZE_BLE_READ_PHY 2 252 #define HCIC_PARAM_SIZE_BLE_SET_PHY 7 253 254 /* ULP HCI command */ 255 void btsnd_hcic_ble_set_local_used_feat(uint8_t feat_set[8]); 256 257 void btsnd_hcic_ble_write_adv_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, 258 tBLE_ADDR_TYPE addr_type_own, tBLE_ADDR_TYPE addr_type_dir, 259 const RawAddress& direct_bda, uint8_t channel_map, 260 uint8_t adv_filter_policy); 261 262 void btsnd_hcic_ble_read_adv_chnl_tx_power(void); 263 264 void btsnd_hcic_ble_set_adv_data(uint8_t data_len, uint8_t* p_data); 265 266 void btsnd_hcic_ble_set_adv_enable(uint8_t adv_enable); 267 268 void btsnd_hcic_ble_set_scan_params(uint8_t scan_type, uint16_t scan_int, uint16_t scan_win, 269 uint8_t addr_type, uint8_t scan_filter_policy); 270 271 void btsnd_hcic_ble_set_scan_enable(uint8_t scan_enable, uint8_t duplicate); 272 273 void btsnd_hcic_ble_read_acceptlist_size(void); 274 275 void btsnd_hcic_ble_read_remote_feat(uint16_t handle); 276 277 void btsnd_hcic_ble_rand(base::Callback<void(BT_OCTET8)> cb); 278 279 void btsnd_hcic_ble_start_enc(uint16_t handle, uint8_t rand[HCIC_BLE_RAND_DI_SIZE], uint16_t ediv, 280 const Octet16& ltk); 281 282 void btsnd_hcic_ble_ltk_req_reply(uint16_t handle, const Octet16& ltk); 283 284 void btsnd_hcic_ble_ltk_req_neg_reply(uint16_t handle); 285 286 void btsnd_hcic_ble_read_supported_states(void); 287 288 void btsnd_hcic_ble_receiver_test(uint8_t rx_freq); 289 290 void btsnd_hcic_ble_transmitter_test(uint8_t tx_freq, uint8_t test_data_len, uint8_t payload); 291 void btsnd_hcic_ble_test_end(void); 292 293 void btsnd_hcic_ble_set_data_length(uint16_t conn_handle, uint16_t tx_octets, uint16_t tx_time); 294 295 struct scanning_phy_cfg { 296 uint8_t scan_type; 297 uint16_t scan_int; 298 uint16_t scan_win; 299 }; 300 301 void btsnd_hcic_ble_set_extended_scan_params(uint8_t own_address_type, 302 uint8_t scanning_filter_policy, uint8_t scanning_phys, 303 scanning_phy_cfg* phy_cfg); 304 305 void btsnd_hcic_ble_set_extended_scan_enable(uint8_t enable, uint8_t filter_duplicates, 306 uint16_t duration, uint16_t period); 307 308 struct EXT_CONN_PHY_CFG { 309 uint16_t scan_int; 310 uint16_t scan_win; 311 uint16_t conn_int_min; 312 uint16_t conn_int_max; 313 uint16_t conn_latency; 314 uint16_t sup_timeout; 315 uint16_t min_ce_len; 316 uint16_t max_ce_len; 317 }; 318 319 void btsnd_hcic_ble_read_resolvable_addr_peer(uint8_t addr_type_peer, const RawAddress& bda_peer); 320 321 void btsnd_hcic_ble_set_rand_priv_addr_timeout(uint16_t rpa_timeout); 322 323 void btsnd_hcic_read_authenticated_payload_tout(uint16_t handle); 324 325 void btsnd_hcic_write_authenticated_payload_tout(uint16_t handle, uint16_t timeout); 326 327 struct EXT_CIS_CFG { 328 uint8_t cis_id; 329 uint16_t max_sdu_size_mtos; 330 uint16_t max_sdu_size_stom; 331 uint8_t phy_mtos; 332 uint8_t phy_stom; 333 uint8_t rtn_mtos; 334 uint8_t rtn_stom; 335 }; 336 337 void btsnd_hcic_set_cig_params(uint8_t cig_id, uint32_t sdu_itv_mtos, uint32_t sdu_itv_stom, 338 uint8_t sca, uint8_t packing, uint8_t framing, 339 uint16_t max_trans_lat_stom, uint16_t max_trans_lat_mtos, 340 uint8_t cis_cnt, const EXT_CIS_CFG* cis_cfg, 341 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 342 343 struct EXT_CIS_TEST_CFG { 344 uint8_t cis_id; 345 uint8_t nse; 346 uint16_t max_sdu_size_mtos; 347 uint16_t max_sdu_size_stom; 348 uint8_t max_pdu_mtos; 349 uint8_t max_pdu_stom; 350 uint8_t phy_mtos; 351 uint8_t phy_stom; 352 uint8_t bn_mtos; 353 uint8_t bn_stom; 354 }; 355 356 struct EXT_CIS_CREATE_CFG { 357 uint16_t cis_conn_handle; 358 uint16_t acl_conn_handle; 359 }; 360 361 void btsnd_hcic_create_cis(uint8_t num_cis, const EXT_CIS_CREATE_CFG* cis_create_cfg, 362 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 363 364 void btsnd_hcic_remove_cig(uint8_t cig_id, base::OnceCallback<void(uint8_t*, uint16_t)> cb); 365 366 void btsnd_hcic_req_peer_sca(uint16_t conn_handle); 367 368 void btsnd_hcic_create_big(uint8_t big_handle, uint8_t adv_handle, uint8_t num_bis, 369 uint32_t sdu_itv, uint16_t max_sdu_size, uint16_t max_trans_lat, 370 uint8_t rtn, uint8_t phy, uint8_t packing, uint8_t framing, uint8_t enc, 371 std::array<uint8_t, 16> bcst_code); 372 373 void btsnd_hcic_term_big(uint8_t big_handle, uint8_t reason); 374 375 void btsnd_hcic_setup_iso_data_path(uint16_t iso_handle, uint8_t data_path_dir, 376 uint8_t data_path_id, uint8_t codec_id_format, 377 uint16_t codec_id_company, uint16_t codec_id_vendor, 378 uint32_t controller_delay, std::vector<uint8_t> codec_conf, 379 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 380 381 void btsnd_hcic_remove_iso_data_path(uint16_t iso_handle, uint8_t data_path_dir, 382 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 383 384 void btsnd_hcic_read_iso_link_quality(uint16_t iso_handle, 385 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 386 387 void btsnd_hcic_ble_periodic_advertising_create_sync(uint8_t options, uint8_t adv_sid, 388 uint8_t adv_addr_type, 389 const RawAddress& adv_addr, uint16_t skip_num, 390 uint16_t sync_timeout, uint8_t sync_cte_type); 391 392 void btsnd_hcic_ble_periodic_advertising_create_sync_cancel( 393 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 394 395 void btsnd_hcic_ble_periodic_advertising_terminate_sync( 396 uint16_t sync_handle, base::OnceCallback<void(uint8_t*, uint16_t)> cb); 397 398 void btsnd_hci_ble_add_device_to_periodic_advertiser_list( 399 uint8_t adv_addr_type, const RawAddress& adv_addr, uint8_t adv_sid, 400 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 401 402 void btsnd_hci_ble_remove_device_from_periodic_advertiser_list( 403 uint8_t adv_addr_type, const RawAddress& adv_addr, uint8_t adv_sid, 404 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 405 406 void btsnd_hci_ble_clear_periodic_advertiser_list(base::OnceCallback<void(uint8_t*, uint16_t)> cb); 407 408 void btsnd_hcic_ble_set_periodic_advertising_receive_enable( 409 uint16_t sync_handle, bool enable, base::OnceCallback<void(uint8_t*, uint16_t)> cb); 410 411 void btsnd_hcic_ble_periodic_advertising_sync_transfer( 412 uint16_t conn_handle, uint16_t service_data, uint16_t sync_handle, 413 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 414 415 void btsnd_hcic_ble_periodic_advertising_set_info_transfer( 416 uint16_t conn_handle, uint16_t service_data, uint8_t adv_handle, 417 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 418 419 void btsnd_hcic_ble_set_periodic_advertising_sync_transfer_params( 420 uint16_t conn_handle, uint8_t mode, uint16_t skip, uint16_t sync_timeout, uint8_t cte_type, 421 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 422 423 void btsnd_hcic_ble_set_default_periodic_advertising_sync_transfer_params( 424 uint16_t conn_handle, uint8_t mode, uint16_t skip, uint16_t sync_timeout, uint8_t cte_type, 425 base::OnceCallback<void(uint8_t*, uint16_t)> cb); 426 427 void btsnd_hcic_configure_data_path(hci_data_direction_t data_path_direction, uint8_t data_path_id, 428 std::vector<uint8_t> vendor_config); 429 430 #endif 431