1 /* 2 * Copyright (C) 2014 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24 * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 /* 39 * hci.h 40 * 41 * Created by Matthias Ringwald on 4/29/09. 42 * 43 */ 44 45 #ifndef __HCI_H 46 #define __HCI_H 47 48 #include "btstack-config.h" 49 50 51 #include "bt_control.h" 52 #include "classic/remote_device_db.h" 53 #include "hci_cmds.h" 54 #include "hci_transport.h" 55 #include "linked_list.h" 56 #include "utils.h" 57 58 #include <stdint.h> 59 #include <stdlib.h> 60 #include <stdarg.h> 61 62 #if defined __cplusplus 63 extern "C" { 64 #endif 65 66 // packet buffer sizes 67 // HCI_ACL_PAYLOAD_SIZE is configurable and defined in config.h 68 #define HCI_EVENT_BUFFER_SIZE (HCI_EVENT_HEADER_SIZE + HCI_EVENT_PAYLOAD_SIZE) 69 #define HCI_CMD_BUFFER_SIZE (HCI_CMD_HEADER_SIZE + HCI_CMD_PAYLOAD_SIZE) 70 #define HCI_ACL_BUFFER_SIZE (HCI_ACL_HEADER_SIZE + HCI_ACL_PAYLOAD_SIZE) 71 72 // size of hci buffers, big enough for command, event, or acl packet without H4 packet type 73 // @note cmd buffer is bigger than event buffer 74 #ifdef HCI_PACKET_BUFFER_SIZE 75 #if HCI_PACKET_BUFFER_SIZE < HCI_ACL_BUFFER_SIZE 76 #error HCI_PACKET_BUFFER_SIZE must be equal or larger than HCI_ACL_BUFFER_SIZE 77 #endif 78 #if HCI_PACKET_BUFFER_SIZE < HCI_CMD_BUFFER_SIZE 79 #error HCI_PACKET_BUFFER_SIZE must be equal or larger than HCI_CMD_BUFFER_SIZE 80 #endif 81 #else 82 #if HCI_ACL_BUFFER_SIZE > HCI_CMD_BUFFER_SIZE 83 #define HCI_PACKET_BUFFER_SIZE HCI_ACL_BUFFER_SIZE 84 #else 85 #define HCI_PACKET_BUFFER_SIZE HCI_CMD_BUFFER_SIZE 86 #endif 87 #endif 88 89 // additional pre-buffer space for packets to Bluetooth module, for now, used for HCI Transport H4 DMA 90 #define HCI_OUTGOING_PRE_BUFFER_SIZE 1 91 92 // BNEP may uncompress the IP Header by 16 bytes 93 #ifdef HAVE_BNEP 94 #define HCI_INCOMING_PRE_BUFFER_SIZE (16 - HCI_ACL_HEADER_SIZE - 4) 95 #endif 96 #ifndef HCI_INCOMING_PRE_BUFFER_SIZE 97 #define HCI_INCOMING_PRE_BUFFER_SIZE 0 98 #endif 99 100 #define OGF_BTSTACK 0x3d 101 102 // cmds for BTstack 103 // get state: @returns HCI_STATE 104 #define BTSTACK_GET_STATE 0x01 105 106 // set power mode: @param HCI_POWER_MODE 107 #define BTSTACK_SET_POWER_MODE 0x02 108 109 // set capture mode: @param on 110 #define BTSTACK_SET_ACL_CAPTURE_MODE 0x03 111 112 // get BTstack version 113 #define BTSTACK_GET_VERSION 0x04 114 115 // get system Bluetooth state 116 #define BTSTACK_GET_SYSTEM_BLUETOOTH_ENABLED 0x05 117 118 // set system Bluetooth state 119 #define BTSTACK_SET_SYSTEM_BLUETOOTH_ENABLED 0x06 120 121 // enable inquiry scan for this client 122 #define BTSTACK_SET_DISCOVERABLE 0x07 123 124 // set global Bluetooth state 125 #define BTSTACK_SET_BLUETOOTH_ENABLED 0x08 126 127 // create l2cap channel: @param bd_addr(48), psm (16) 128 #define L2CAP_CREATE_CHANNEL 0x20 129 130 // disconnect l2cap disconnect, @param channel(16), reason(8) 131 #define L2CAP_DISCONNECT 0x21 132 133 // register l2cap service: @param psm(16), mtu (16) 134 #define L2CAP_REGISTER_SERVICE 0x22 135 136 // unregister l2cap disconnect, @param psm(16) 137 #define L2CAP_UNREGISTER_SERVICE 0x23 138 139 // accept connection @param bd_addr(48), dest cid (16) 140 #define L2CAP_ACCEPT_CONNECTION 0x24 141 142 // decline l2cap disconnect,@param bd_addr(48), dest cid (16), reason(8) 143 #define L2CAP_DECLINE_CONNECTION 0x25 144 145 // create l2cap channel: @param bd_addr(48), psm (16), mtu (16) 146 #define L2CAP_CREATE_CHANNEL_MTU 0x26 147 148 // register SDP Service Record: service record (size) 149 #define SDP_REGISTER_SERVICE_RECORD 0x30 150 151 // unregister SDP Service Record 152 #define SDP_UNREGISTER_SERVICE_RECORD 0x31 153 154 // Get remote RFCOMM services 155 #define SDP_CLIENT_QUERY_RFCOMM_SERVICES 0x32 156 157 // Get remote SDP services 158 #define SDP_CLIENT_QUERY_SERVICES 0x33 159 160 // RFCOMM "HCI" Commands 161 #define RFCOMM_CREATE_CHANNEL 0x40 162 #define RFCOMM_DISCONNECT 0x41 163 #define RFCOMM_REGISTER_SERVICE 0x42 164 #define RFCOMM_UNREGISTER_SERVICE 0x43 165 #define RFCOMM_ACCEPT_CONNECTION 0x44 166 #define RFCOMM_DECLINE_CONNECTION 0x45 167 #define RFCOMM_PERSISTENT_CHANNEL 0x46 168 #define RFCOMM_CREATE_CHANNEL_WITH_CREDITS 0x47 169 #define RFCOMM_REGISTER_SERVICE_WITH_CREDITS 0x48 170 #define RFCOMM_GRANT_CREDITS 0x49 171 172 // GAP Classic 0x50 173 #define GAP_DISCONNECT 0x50 174 175 // GAP LE 0x60 176 #define GAP_LE_SCAN_START 0x60 177 #define GAP_LE_SCAN_STOP 0x61 178 #define GAP_LE_CONNECT 0x62 179 #define GAP_LE_CONNECT_CANCEL 0x63 180 #define GAP_LE_SET_SCAN_PARAMETERS 0x64 181 182 // GATT (Client) 0x70 183 #define GATT_DISCOVER_ALL_PRIMARY_SERVICES 0x70 184 #define GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID16 0x71 185 #define GATT_DISCOVER_PRIMARY_SERVICES_BY_UUID128 0x72 186 #define GATT_FIND_INCLUDED_SERVICES_FOR_SERVICE 0x73 187 #define GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE 0x74 188 #define GATT_DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID128 0x75 189 #define GATT_DISCOVER_CHARACTERISTIC_DESCRIPTORS 0x76 190 #define GATT_READ_VALUE_OF_CHARACTERISTIC 0x77 191 #define GATT_READ_LONG_VALUE_OF_CHARACTERISTIC 0x78 192 #define GATT_WRITE_VALUE_OF_CHARACTERISTIC_WITHOUT_RESPONSE 0x79 193 #define GATT_WRITE_VALUE_OF_CHARACTERISTIC 0x7A 194 #define GATT_WRITE_LONG_VALUE_OF_CHARACTERISTIC 0x7B 195 #define GATT_RELIABLE_WRITE_LONG_VALUE_OF_CHARACTERISTIC 0x7C 196 #define GATT_READ_CHARACTERISTIC_DESCRIPTOR 0X7D 197 #define GATT_READ_LONG_CHARACTERISTIC_DESCRIPTOR 0X7E 198 #define GATT_WRITE_CHARACTERISTIC_DESCRIPTOR 0X7F 199 #define GATT_WRITE_LONG_CHARACTERISTIC_DESCRIPTOR 0X80 200 #define GATT_WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION 0X81 201 #define GATT_GET_MTU 0x82 202 203 // 204 #define IS_COMMAND(packet, command) (READ_BT_16(packet,0) == command.opcode) 205 206 207 /** 208 * LE connection parameter update state 209 */ 210 211 typedef enum { 212 CON_PARAMETER_UPDATE_NONE, 213 CON_PARAMETER_UPDATE_SEND_REQUEST, 214 CON_PARAMETER_UPDATE_SEND_RESPONSE, 215 CON_PARAMETER_UPDATE_CHANGE_HCI_CON_PARAMETERS, 216 CON_PARAMETER_UPDATE_DENY 217 } le_con_parameter_update_state_t; 218 219 typedef struct le_connection_parameter_range{ 220 uint16_t le_conn_interval_min; 221 uint16_t le_conn_interval_max; 222 uint16_t le_conn_latency_min; 223 uint16_t le_conn_latency_max; 224 uint16_t le_supervision_timeout_min; 225 uint16_t le_supervision_timeout_max; 226 } le_connection_parameter_range_t; 227 228 // Authentication flags 229 typedef enum { 230 AUTH_FLAGS_NONE = 0x0000, 231 RECV_LINK_KEY_REQUEST = 0x0001, 232 HANDLE_LINK_KEY_REQUEST = 0x0002, 233 SENT_LINK_KEY_REPLY = 0x0004, 234 SENT_LINK_KEY_NEGATIVE_REQUEST = 0x0008, 235 RECV_LINK_KEY_NOTIFICATION = 0x0010, 236 DENY_PIN_CODE_REQUEST = 0x0040, 237 RECV_IO_CAPABILITIES_REQUEST = 0x0080, 238 SEND_IO_CAPABILITIES_REPLY = 0x0100, 239 SEND_USER_CONFIRM_REPLY = 0x0200, 240 SEND_USER_PASSKEY_REPLY = 0x0400, 241 242 // pairing status 243 LEGACY_PAIRING_ACTIVE = 0x2000, 244 SSP_PAIRING_ACTIVE = 0x4000, 245 246 // connection status 247 CONNECTION_ENCRYPTED = 0x8000, 248 } hci_authentication_flags_t; 249 250 /** 251 * Connection State 252 */ 253 typedef enum { 254 SEND_CREATE_CONNECTION = 0, 255 SENT_CREATE_CONNECTION, 256 SEND_CANCEL_CONNECTION, 257 SENT_CANCEL_CONNECTION, 258 RECEIVED_CONNECTION_REQUEST, 259 ACCEPTED_CONNECTION_REQUEST, 260 REJECTED_CONNECTION_REQUEST, 261 OPEN, 262 SEND_DISCONNECT, 263 SENT_DISCONNECT, 264 RECEIVED_DISCONNECTION_COMPLETE 265 } CONNECTION_STATE; 266 267 // bonding flags 268 enum { 269 BONDING_REQUEST_REMOTE_FEATURES = 0x01, 270 BONDING_RECEIVED_REMOTE_FEATURES = 0x02, 271 BONDING_REMOTE_SUPPORTS_SSP = 0x04, 272 BONDING_DISCONNECT_SECURITY_BLOCK = 0x08, 273 BONDING_DISCONNECT_DEDICATED_DONE = 0x10, 274 BONDING_SEND_AUTHENTICATE_REQUEST = 0x20, 275 BONDING_SEND_ENCRYPTION_REQUEST = 0x40, 276 BONDING_DEDICATED = 0x80, 277 BONDING_EMIT_COMPLETE_ON_DISCONNECT = 0x100 278 }; 279 280 typedef enum { 281 BLUETOOTH_OFF = 1, 282 BLUETOOTH_ON, 283 BLUETOOTH_ACTIVE 284 } BLUETOOTH_STATE; 285 286 // le central scanning state 287 typedef enum { 288 LE_SCAN_IDLE, 289 LE_START_SCAN, 290 LE_SCANNING, 291 LE_STOP_SCAN, 292 } le_scanning_state_t; 293 294 typedef enum { 295 LE_CONNECTING_IDLE, 296 LE_CONNECTING_DIRECT, 297 LE_CONNECTING_WHITELIST, 298 } le_connecting_state_t; 299 300 // 301 // SM internal types and globals 302 // 303 304 typedef enum { 305 306 // general states 307 // state = 0 308 SM_GENERAL_IDLE, 309 SM_GENERAL_SEND_PAIRING_FAILED, 310 SM_GENERAL_TIMEOUT, // no other security messages are exchanged 311 312 // Phase 1: Pairing Feature Exchange 313 SM_PH1_W4_USER_RESPONSE, 314 315 // Phase 2: Authenticating and Encrypting 316 317 // get random number for use as TK Passkey if we show it 318 SM_PH2_GET_RANDOM_TK, 319 SM_PH2_W4_RANDOM_TK, 320 321 // get local random number for confirm c1 322 SM_PH2_C1_GET_RANDOM_A, 323 SM_PH2_C1_W4_RANDOM_A, 324 SM_PH2_C1_GET_RANDOM_B, 325 SM_PH2_C1_W4_RANDOM_B, 326 327 // calculate confirm value for local side 328 // state = 10 329 SM_PH2_C1_GET_ENC_A, 330 SM_PH2_C1_W4_ENC_A, 331 SM_PH2_C1_GET_ENC_B, 332 SM_PH2_C1_W4_ENC_B, 333 334 // calculate confirm value for remote side 335 SM_PH2_C1_GET_ENC_C, 336 SM_PH2_C1_W4_ENC_C, 337 SM_PH2_C1_GET_ENC_D, 338 SM_PH2_C1_W4_ENC_D, 339 340 SM_PH2_C1_SEND_PAIRING_CONFIRM, 341 SM_PH2_SEND_PAIRING_RANDOM, 342 343 // calc STK 344 // state = 20 345 SM_PH2_CALC_STK, 346 SM_PH2_W4_STK, 347 348 SM_PH2_W4_CONNECTION_ENCRYPTED, 349 350 // Phase 3: Transport Specific Key Distribution 351 // calculate DHK, Y, EDIV, and LTK 352 SM_PH3_GET_RANDOM, 353 SM_PH3_W4_RANDOM, 354 SM_PH3_GET_DIV, 355 SM_PH3_W4_DIV, 356 SM_PH3_Y_GET_ENC, 357 SM_PH3_Y_W4_ENC, 358 SM_PH3_LTK_GET_ENC, 359 // state = 30 360 SM_PH3_LTK_W4_ENC, 361 SM_PH3_CSRK_GET_ENC, 362 SM_PH3_CSRK_W4_ENC, 363 364 // exchange keys 365 SM_PH3_DISTRIBUTE_KEYS, 366 SM_PH3_RECEIVE_KEYS, 367 368 // RESPONDER ROLE 369 // state = 35 370 SM_RESPONDER_IDLE, 371 SM_RESPONDER_SEND_SECURITY_REQUEST, 372 SM_RESPONDER_PH0_RECEIVED_LTK, 373 SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY, 374 SM_RESPONDER_PH1_W4_PAIRING_REQUEST, 375 SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED, 376 SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE, 377 SM_RESPONDER_PH1_W4_PAIRING_CONFIRM, 378 SM_RESPONDER_PH2_W4_PAIRING_RANDOM, 379 SM_RESPONDER_PH2_W4_LTK_REQUEST, 380 SM_RESPONDER_PH2_SEND_LTK_REPLY, 381 382 // Phase 4: re-establish previously distributed LTK 383 // state == 46 384 SM_RESPONDER_PH4_Y_GET_ENC, 385 SM_RESPONDER_PH4_Y_W4_ENC, 386 SM_RESPONDER_PH4_LTK_GET_ENC, 387 SM_RESPONDER_PH4_LTK_W4_ENC, 388 SM_RESPONDER_PH4_SEND_LTK, 389 390 // INITITIATOR ROLE 391 // state = 51 392 SM_INITIATOR_CONNECTED, 393 SM_INITIATOR_PH0_HAS_LTK, 394 SM_INITIATOR_PH0_SEND_START_ENCRYPTION, 395 SM_INITIATOR_PH0_W4_CONNECTION_ENCRYPTED, 396 SM_INITIATOR_PH1_W2_SEND_PAIRING_REQUEST, 397 SM_INITIATOR_PH1_SEND_PAIRING_REQUEST, 398 SM_INITIATOR_PH1_W4_PAIRING_RESPONSE, 399 SM_INITIATOR_PH2_W4_PAIRING_CONFIRM, 400 SM_INITIATOR_PH2_W4_PAIRING_RANDOM, 401 SM_INITIATOR_PH3_SEND_START_ENCRYPTION, 402 403 } security_manager_state_t; 404 405 typedef enum { 406 IRK_LOOKUP_IDLE, 407 IRK_LOOKUP_W4_READY, 408 IRK_LOOKUP_STARTED, 409 IRK_LOOKUP_SUCCEEDED, 410 IRK_LOOKUP_FAILED 411 } irk_lookup_state_t; 412 413 // Authorization state 414 typedef enum { 415 AUTHORIZATION_UNKNOWN, 416 AUTHORIZATION_PENDING, 417 AUTHORIZATION_DECLINED, 418 AUTHORIZATION_GRANTED 419 } authorization_state_t; 420 421 typedef struct sm_pairing_packet { 422 uint8_t code; 423 uint8_t io_capability; 424 uint8_t oob_data_flag; 425 uint8_t auth_req; 426 uint8_t max_encryption_key_size; 427 uint8_t initiator_key_distribution; 428 uint8_t responder_key_distribution; 429 } sm_pairing_packet_t; 430 431 // connection info available as long as connection exists 432 typedef struct sm_connection { 433 uint16_t sm_handle; 434 uint8_t sm_role; // 0 - IamMaster, 1 = IamSlave 435 uint8_t sm_security_request_received; 436 uint8_t sm_bonding_requested; 437 uint8_t sm_peer_addr_type; 438 bd_addr_t sm_peer_address; 439 security_manager_state_t sm_engine_state; 440 irk_lookup_state_t sm_irk_lookup_state; 441 uint8_t sm_connection_encrypted; 442 uint8_t sm_connection_authenticated; // [0..1] 443 uint8_t sm_actual_encryption_key_size; 444 sm_pairing_packet_t sm_m_preq; // only used during c1 445 authorization_state_t sm_connection_authorization_state; 446 uint16_t sm_local_ediv; 447 uint8_t sm_local_rand[8]; 448 int sm_le_db_index; 449 } sm_connection_t; 450 451 typedef struct { 452 // linked list - assert: first field 453 linked_item_t item; 454 455 // remote side 456 bd_addr_t address; 457 458 // module handle 459 hci_con_handle_t con_handle; 460 461 // le public, le random, classic 462 bd_addr_type_t address_type; 463 464 // role: 0 - master, 1 - slave 465 uint8_t role; 466 467 // connection state 468 CONNECTION_STATE state; 469 470 // bonding 471 uint16_t bonding_flags; 472 uint8_t bonding_status; 473 // requested security level 474 gap_security_level_t requested_security_level; 475 476 // 477 link_key_type_t link_key_type; 478 479 // errands 480 uint32_t authentication_flags; 481 482 timer_source_t timeout; 483 484 #ifdef HAVE_TIME 485 // timer 486 struct timeval timestamp; 487 #endif 488 #ifdef HAVE_TICK 489 uint32_t timestamp; // timeout in system ticks 490 #endif 491 492 // ACL packet recombination - PRE_BUFFER + ACL Header + ACL payload 493 uint8_t acl_recombination_buffer[HCI_INCOMING_PRE_BUFFER_SIZE + 4 + HCI_ACL_BUFFER_SIZE]; 494 uint16_t acl_recombination_pos; 495 uint16_t acl_recombination_length; 496 497 // number packets sent to controller 498 uint8_t num_acl_packets_sent; 499 uint8_t num_sco_packets_sent; 500 501 // LE Connection parameter update 502 le_con_parameter_update_state_t le_con_parameter_update_state; 503 uint8_t le_con_param_update_identifier; 504 uint16_t le_conn_interval_min; 505 uint16_t le_conn_interval_max; 506 uint16_t le_conn_latency; 507 uint16_t le_supervision_timeout; 508 509 #ifdef HAVE_BLE 510 // LE Security Manager 511 sm_connection_t sm_connection; 512 #endif 513 514 } hci_connection_t; 515 516 517 /** 518 * HCI Inititizlization State Machine 519 */ 520 typedef enum hci_init_state{ 521 HCI_INIT_SEND_RESET = 0, 522 HCI_INIT_W4_SEND_RESET, 523 HCI_INIT_SEND_READ_LOCAL_VERSION_INFORMATION, 524 HCI_INIT_W4_SEND_READ_LOCAL_VERSION_INFORMATION, 525 526 HCI_INIT_SET_BD_ADDR, 527 HCI_INIT_W4_SET_BD_ADDR, 528 529 HCI_INIT_SEND_RESET_ST_WARM_BOOT, 530 HCI_INIT_W4_SEND_RESET_ST_WARM_BOOT, 531 532 HCI_INIT_SEND_BAUD_CHANGE, 533 HCI_INIT_W4_SEND_BAUD_CHANGE, 534 HCI_INIT_CUSTOM_INIT, 535 HCI_INIT_W4_CUSTOM_INIT, 536 HCI_INIT_SEND_RESET_CSR_WARM_BOOT, 537 HCI_INIT_W4_CUSTOM_INIT_CSR_WARM_BOOT, 538 539 HCI_INIT_READ_BD_ADDR, 540 HCI_INIT_W4_READ_BD_ADDR, 541 HCI_INIT_READ_LOCAL_SUPPORTED_COMMANDS, 542 HCI_INIT_W4_READ_LOCAL_SUPPORTED_COMMANDS, 543 544 HCI_INIT_READ_BUFFER_SIZE, 545 HCI_INIT_W4_READ_BUFFER_SIZE, 546 HCI_INIT_READ_LOCAL_SUPPORTED_FEATUES, 547 HCI_INIT_W4_READ_LOCAL_SUPPORTED_FEATUES, 548 HCI_INIT_SET_EVENT_MASK, 549 HCI_INIT_W4_SET_EVENT_MASK, 550 HCI_INIT_WRITE_SIMPLE_PAIRING_MODE, 551 HCI_INIT_W4_WRITE_SIMPLE_PAIRING_MODE, 552 HCI_INIT_WRITE_PAGE_TIMEOUT, 553 HCI_INIT_W4_WRITE_PAGE_TIMEOUT, 554 // HCI_INIT_WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE, 555 // HCI_INIT_W4_SYNCHRONOUS_FLOW_CONTROL_ENABLE, 556 557 HCI_INIT_WRITE_CLASS_OF_DEVICE, 558 HCI_INIT_W4_WRITE_CLASS_OF_DEVICE, 559 HCI_INIT_WRITE_LOCAL_NAME, 560 HCI_INIT_W4_WRITE_LOCAL_NAME, 561 HCI_INIT_WRITE_SCAN_ENABLE, 562 HCI_INIT_W4_WRITE_SCAN_ENABLE, 563 HCI_INIT_LE_READ_BUFFER_SIZE, 564 HCI_INIT_W4_LE_READ_BUFFER_SIZE, 565 HCI_INIT_WRITE_LE_HOST_SUPPORTED, 566 HCI_INIT_W4_WRITE_LE_HOST_SUPPORTED, 567 HCI_INIT_READ_WHITE_LIST_SIZE, 568 HCI_INIT_W4_READ_WHITE_LIST_SIZE, 569 570 HCI_INIT_LE_SET_SCAN_PARAMETERS, 571 HCI_INIT_W4_LE_SET_SCAN_PARAMETERS, 572 573 HCI_INIT_DONE, 574 575 HCI_FALLING_ASLEEP_DISCONNECT, 576 HCI_FALLING_ASLEEP_W4_WRITE_SCAN_ENABLE, 577 HCI_FALLING_ASLEEP_COMPLETE, 578 579 HCI_INIT_AFTER_SLEEP 580 581 } hci_substate_t; 582 583 enum { 584 LE_ADVERTISEMENT_TASKS_DISABLE = 1 << 0, 585 LE_ADVERTISEMENT_TASKS_SET_DATA = 1 << 1, 586 LE_ADVERTISEMENT_TASKS_SET_PARAMS = 1 << 2, 587 LE_ADVERTISEMENT_TASKS_ENABLE = 1 << 3, 588 }; 589 590 enum { 591 LE_WHITELIST_ON_CONTROLLER = 1 << 0, 592 LE_WHITELIST_ADD_TO_CONTROLLER = 1 << 1, 593 LE_WHITELIST_REMOVE_FROM_CONTROLLER = 1 << 2, 594 }; 595 596 typedef struct { 597 linked_item_t item; 598 bd_addr_t address; 599 bd_addr_type_t address_type; 600 uint8_t state; 601 } whitelist_entry_t; 602 603 /** 604 * main data structure 605 */ 606 typedef struct { 607 // transport component with configuration 608 hci_transport_t * hci_transport; 609 void * config; 610 611 // basic configuration 612 const char * local_name; 613 uint32_t class_of_device; 614 bd_addr_t local_bd_addr; 615 uint8_t ssp_enable; 616 uint8_t ssp_io_capability; 617 uint8_t ssp_authentication_requirement; 618 uint8_t ssp_auto_accept; 619 620 // hardware power controller 621 bt_control_t * control; 622 623 // list of existing baseband connections 624 linked_list_t connections; 625 626 // single buffer for HCI packet assembly + additional prebuffer for H4 drivers 627 uint8_t hci_packet_buffer_prefix[HCI_OUTGOING_PRE_BUFFER_SIZE]; 628 uint8_t hci_packet_buffer[HCI_PACKET_BUFFER_SIZE]; // opcode (16), len(8) 629 uint8_t hci_packet_buffer_reserved; 630 uint16_t acl_fragmentation_pos; 631 uint16_t acl_fragmentation_total_size; 632 633 /* host to controller flow control */ 634 uint8_t num_cmd_packets; 635 uint8_t acl_packets_total_num; 636 uint16_t acl_data_packet_length; 637 uint8_t sco_packets_total_num; 638 uint8_t sco_data_packet_length; 639 uint8_t synchronous_flow_control_enabled; 640 uint8_t le_acl_packets_total_num; 641 uint16_t le_data_packets_length; 642 643 /* local supported features */ 644 uint8_t local_supported_features[8]; 645 646 /* local supported commands summary - complete info is 64 bytes */ 647 /* 0 - read buffer size */ 648 /* 1 - write le host supported */ 649 uint8_t local_supported_commands[1]; 650 651 /* bluetooth device information from hci read local version information */ 652 // uint16_t hci_version; 653 // uint16_t hci_revision; 654 // uint16_t lmp_version; 655 uint16_t manufacturer; 656 // uint16_t lmp_subversion; 657 658 // usable packet types given acl_data_packet_length and HCI_ACL_BUFFER_SIZE 659 uint16_t packet_types; 660 661 /* callback to L2CAP layer */ 662 void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size); 663 664 /* callback for SCO data */ 665 void (*sco_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size); 666 667 /* remote device db */ 668 remote_device_db_t const*remote_device_db; 669 670 /* hci state machine */ 671 HCI_STATE state; 672 hci_substate_t substate; 673 timer_source_t timeout; 674 uint8_t cmds_ready; 675 676 uint16_t last_cmd_opcode; 677 678 uint8_t discoverable; 679 uint8_t connectable; 680 uint8_t bondable; 681 682 /* buffer for scan enable cmd - 0xff no change */ 683 uint8_t new_scan_enable_value; 684 685 uint16_t sco_voice_setting; 686 687 uint8_t loopback_mode; 688 689 // buffer for single connection decline 690 uint8_t decline_reason; 691 bd_addr_t decline_addr; 692 693 uint8_t adv_addr_type; 694 bd_addr_t adv_address; 695 696 le_scanning_state_t le_scanning_state; 697 le_connecting_state_t le_connecting_state; 698 699 // buffer for le scan type command - 0xff not set 700 uint8_t le_scan_type; 701 uint16_t le_scan_interval; 702 uint16_t le_scan_window; 703 704 le_connection_parameter_range_t le_connection_parameter_range; 705 706 uint8_t * le_advertisements_data; 707 uint8_t le_advertisements_data_len; 708 709 uint8_t le_advertisements_active; 710 uint8_t le_advertisements_enabled; 711 uint8_t le_advertisements_todo; 712 713 uint16_t le_advertisements_interval_min; 714 uint16_t le_advertisements_interval_max; 715 uint8_t le_advertisements_type; 716 uint8_t le_advertisements_own_address_type; 717 uint8_t le_advertisements_direct_address_type; 718 uint8_t le_advertisements_channel_map; 719 uint8_t le_advertisements_filter_policy; 720 bd_addr_t le_advertisements_direct_address; 721 722 // LE Whitelist Management 723 uint16_t le_whitelist_capacity; 724 linked_list_t le_whitelist; 725 726 // custom BD ADDR 727 bd_addr_t custom_bd_addr; 728 uint8_t custom_bd_addr_set; 729 730 // hardware error handler 731 void (*hardware_error_callback)(void); 732 733 } hci_stack_t; 734 735 /** 736 * set connection iterator 737 */ 738 void hci_connections_get_iterator(linked_list_iterator_t *it); 739 740 // create and send hci command packets based on a template and a list of parameters 741 uint16_t hci_create_cmd(uint8_t *hci_cmd_buffer, hci_cmd_t *cmd, ...); 742 uint16_t hci_create_cmd_internal(uint8_t *hci_cmd_buffer, const hci_cmd_t *cmd, va_list argptr); 743 744 /** 745 * run the hci control loop once 746 */ 747 void hci_run(void); 748 749 // send ACL packet prepared in hci packet buffer 750 int hci_send_acl_packet_buffer(int size); 751 752 // send SCO packet prepared in hci packet buffer 753 int hci_send_sco_packet_buffer(int size); 754 755 756 int hci_can_send_acl_packet_now(hci_con_handle_t con_handle); 757 int hci_can_send_prepared_acl_packet_now(hci_con_handle_t con_handle); 758 int hci_can_send_sco_packet_now(hci_con_handle_t con_handle); 759 int hci_can_send_prepared_sco_packet_now(hci_con_handle_t con_handle); 760 761 // reserves outgoing packet buffer. @returns 1 if successful 762 int hci_reserve_packet_buffer(void); 763 void hci_release_packet_buffer(void); 764 765 // used for internal checks in l2cap[-le].c 766 int hci_is_packet_buffer_reserved(void); 767 768 // get point to packet buffer 769 uint8_t* hci_get_outgoing_packet_buffer(void); 770 771 772 hci_connection_t * hci_connection_for_handle(hci_con_handle_t con_handle); 773 hci_connection_t * hci_connection_for_bd_addr_and_type(bd_addr_t addr, bd_addr_type_t addr_type); 774 int hci_is_le_connection(hci_connection_t * connection); 775 uint8_t hci_number_outgoing_packets(hci_con_handle_t handle); 776 uint8_t hci_number_free_acl_slots_for_handle(hci_con_handle_t con_handle); 777 int hci_authentication_active_for_handle(hci_con_handle_t handle); 778 uint16_t hci_max_acl_data_packet_length(void); 779 uint16_t hci_max_acl_le_data_packet_length(void); 780 uint16_t hci_usable_acl_packet_types(void); 781 int hci_non_flushable_packet_boundary_flag_supported(void); 782 783 void hci_disconnect_all(void); 784 785 void hci_emit_state(void); 786 void hci_emit_connection_complete(hci_connection_t *conn, uint8_t status); 787 void hci_emit_l2cap_check_timeout(hci_connection_t *conn); 788 void hci_emit_disconnection_complete(uint16_t handle, uint8_t reason); 789 void hci_emit_nr_connections_changed(void); 790 void hci_emit_hci_open_failed(void); 791 void hci_emit_btstack_version(void); 792 void hci_emit_system_bluetooth_enabled(uint8_t enabled); 793 void hci_emit_remote_name_cached(bd_addr_t addr, device_name_t *name); 794 void hci_emit_discoverable_enabled(uint8_t enabled); 795 void hci_emit_security_level(hci_con_handle_t con_handle, gap_security_level_t level); 796 void hci_emit_dedicated_bonding_result(bd_addr_t address, uint8_t status); 797 798 // query if the local side supports SSP 799 int hci_local_ssp_activated(void); 800 801 // query if the remote side supports SSP 802 int hci_remote_ssp_supported(hci_con_handle_t con_handle); 803 804 // query if both sides support SSP 805 int hci_ssp_supported_on_both_sides(hci_con_handle_t handle); 806 807 // disable automatic L2CAP disconnect for testing 808 void hci_disable_l2cap_timeout_check(void); 809 810 // disconnect because of security block 811 void hci_disconnect_security_block(hci_con_handle_t con_handle); 812 813 // send complete CMD packet 814 int hci_send_cmd_packet(uint8_t *packet, int size); 815 816 817 /* API_START */ 818 819 void gap_le_get_connection_parameter_range(le_connection_parameter_range_t range); 820 void gap_le_set_connection_parameter_range(le_connection_parameter_range_t range); 821 822 /* LE Client Start */ 823 824 le_command_status_t le_central_start_scan(void); 825 le_command_status_t le_central_stop_scan(void); 826 le_command_status_t le_central_connect(bd_addr_t addr, bd_addr_type_t addr_type); 827 le_command_status_t le_central_connect_cancel(void); 828 le_command_status_t gap_disconnect(hci_con_handle_t handle); 829 void le_central_set_scan_parameters(uint8_t scan_type, uint16_t scan_interval, uint16_t scan_window); 830 831 /* LE Client End */ 832 833 void hci_connectable_control(uint8_t enable); 834 void hci_close(void); 835 836 /** 837 * @note New functions replacing: hci_can_send_packet_now[_using_packet_buffer] 838 */ 839 int hci_can_send_command_packet_now(void); 840 841 /** 842 * @brief Gets local address. 843 */ 844 void hci_local_bd_addr(bd_addr_t address_buffer); 845 846 /** 847 * @brief Set up HCI. Needs to be called before any other function. 848 */ 849 void hci_init(hci_transport_t *transport, void *config, bt_control_t *control, remote_device_db_t const* remote_device_db); 850 851 /** 852 * @brief Set class of device that will be set during Bluetooth init. 853 */ 854 void hci_set_class_of_device(uint32_t class_of_device); 855 856 /** 857 * @brief Set Public BD ADDR - passed on to Bluetooth chipset if supported in bt_control_h 858 */ 859 void hci_set_bd_addr(bd_addr_t addr); 860 861 /** 862 * @brief Registers a packet handler. Used if L2CAP is not used (rarely). 863 */ 864 void hci_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)); 865 866 /** 867 * @brief Registers a packet handler for SCO data. Used for HSP and HFP profiles. 868 */ 869 void hci_register_sco_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)); 870 871 /** 872 * @brief Requests the change of BTstack power mode. 873 */ 874 int hci_power_control(HCI_POWER_MODE mode); 875 876 /** 877 * @brief Allows to control if device is discoverable. OFF by default. 878 */ 879 void hci_discoverable_control(uint8_t enable); 880 881 /** 882 * @brief Creates and sends HCI command packets based on a template and a list of parameters. Will return error if outgoing data buffer is occupied. 883 */ 884 int hci_send_cmd(const hci_cmd_t *cmd, ...); 885 886 /** 887 * @brief Deletes link key for remote device with baseband address. 888 */ 889 void hci_drop_link_key_for_bd_addr(bd_addr_t addr); 890 891 /* Configure Secure Simple Pairing */ 892 893 /** 894 * @brief Enable will enable SSP during init. 895 */ 896 void hci_ssp_set_enable(int enable); 897 898 /** 899 * @brief If set, BTstack will respond to io capability request using authentication requirement. 900 */ 901 void hci_ssp_set_io_capability(int ssp_io_capability); 902 void hci_ssp_set_authentication_requirement(int authentication_requirement); 903 904 /** 905 * @brief If set, BTstack will confirm a numeric comparison and enter '000000' if requested. 906 */ 907 void hci_ssp_set_auto_accept(int auto_accept); 908 909 /** 910 * @brief Get addr type and address used in advertisement packets. 911 */ 912 void hci_le_advertisement_address(uint8_t * addr_type, bd_addr_t addr); 913 914 /** 915 * @brief Set callback for Bluetooth Hardware Error 916 */ 917 void hci_set_hardware_error_callback(void (*fn)(void)); 918 919 /** 920 * @brief Configure Voice Setting for use with SCO data in HSP/HFP 921 */ 922 void hci_set_sco_voice_setting(uint16_t voice_setting); 923 924 /** 925 * @brief Get SCO Voice Setting 926 * @return current voice setting 927 */ 928 uint16_t hci_get_sco_voice_setting(void); 929 930 /* API_END */ 931 932 /** 933 * @brief Set Advertisement Parameters 934 * @param adv_int_min 935 * @param adv_int_max 936 * @param adv_type 937 * @param own_address_type 938 * @param direct_address_type 939 * @param direct_address 940 * @param channel_map 941 * @param filter_policy 942 * 943 * @note internal use. use gap_advertisements_set_params from gap_le.h instead. 944 */ 945 void hci_le_advertisements_set_params(uint16_t adv_int_min, uint16_t adv_int_max, uint8_t adv_type, 946 uint8_t own_address_type, uint8_t direct_address_typ, bd_addr_t direct_address, 947 uint8_t channel_map, uint8_t filter_policy); 948 949 #if defined __cplusplus 950 } 951 #endif 952 953 #endif // __HCI_H 954