1 /* 2 * Copyright (C) 2015 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 * bluetooth.h 40 * 41 * Numbers defined or derived from the official Bluetooth specification 42 */ 43 44 #ifndef __BLUETOOTH_H 45 #define __BLUETOOTH_H 46 47 #include <stdint.h> 48 49 /** 50 * HCI Transport 51 */ 52 53 /** 54 * packet types - used in BTstack and over the H4 UART interface 55 */ 56 #define HCI_COMMAND_DATA_PACKET 0x01 57 #define HCI_ACL_DATA_PACKET 0x02 58 #define HCI_SCO_DATA_PACKET 0x03 59 #define HCI_EVENT_PACKET 0x04 60 61 // packet header sizes 62 #define HCI_CMD_HEADER_SIZE 3 63 #define HCI_ACL_HEADER_SIZE 4 64 #define HCI_SCO_HEADER_SIZE 3 65 #define HCI_EVENT_HEADER_SIZE 2 66 67 /** 68 * HCI Layer 69 */ 70 71 // 72 // Error Codes 73 // 74 75 // from Bluetooth Core Specification 76 #define ERROR_CODE_SUCCESS 0x00 77 #define ERROR_CODE_UNKNOWN_HCI_COMMAND 0x01 78 #define ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 79 #define ERROR_CODE_HARDWARE_FAILURE 0x03 80 #define ERROR_CODE_PAGE_TIMEOUT 0x04 81 #define ERROR_CODE_AUTHENTICATION_FAILURE 0x05 82 #define ERROR_CODE_PIN_OR_KEY_MISSING 0x06 83 #define ERROR_CODE_MEMORY_CAPACITY_EXCEEDED 0x07 84 #define ERROR_CODE_CONNECTION_TIMEOUT 0x08 85 #define ERROR_CODE_CONNECTION_LIMIT_EXCEEDED 0x09 86 #define ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED 0x0A 87 #define ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS 0x0B 88 #define ERROR_CODE_COMMAND_DISALLOWED 0x0C 89 #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D 90 #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS 0x0E 91 #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR 0x0F 92 #define ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10 93 #define ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11 94 #define ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS 0x12 95 #define ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION 0x13 96 #define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x14 97 #define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF 0x15 98 #define ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16 99 #define ERROR_CODE_REPEATED_ATTEMPTS 0x17 100 #define ERROR_CODE_PAIRING_NOT_ALLOWED 0x18 101 #define ERROR_CODE_UNKNOWN_LMP_PDU 0x19 102 #define ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE 0x1A 103 #define ERROR_CODE_SCO_OFFSET_REJECTED 0x1B 104 #define ERROR_CODE_SCO_INTERVAL_REJECTED 0x1C 105 #define ERROR_CODE_SCO_AIR_MODE_REJECTED 0x1D 106 #define ERROR_CODE_INVALID_LMP_PARAMETERS_INVALID_LL_PARAMETERS 0x1E 107 #define ERROR_CODE_UNSPECIFIED_ERROR 0x1F 108 #define ERROR_CODE_UNSUPPORTED_LMP_PARAMETER_VALUE_UNSUPPORTED_LL_PARAMETER_VALUE 0x20 109 #define ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21 110 #define ERROR_CODE_LMP_RESPONSE_TIMEOUT_LL_RESPONSE_TIMEOUT 0x22 111 #define ERROR_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 112 #define ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24 113 #define ERROR_CODE_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25 114 #define ERROR_CODE_LINK_KEY_CANNOT_BE_CHANGED 0x26 115 #define ERROR_CODE_REQUESTED_QOS_NOT_SUPPORTED 0x27 116 #define ERROR_CODE_INSTANT_PASSED 0x28 117 #define ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 118 #define ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A 119 #define ERROR_CODE_RESERVED 0x2B 120 #define ERROR_CODE_QOS_UNACCEPTABLE_PARAMETER 0x2C 121 #define ERROR_CODE_QOS_REJECTED 0x2D 122 #define ERROR_CODE_CHANNEL_CLASSIFICATION_NOT_SUPPORTED 0x2E 123 #define ERROR_CODE_INSUFFICIENT_SECURITY 0x2F 124 #define ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 125 // #define ERROR_CODE_RESERVED 126 #define ERROR_CODE_ROLE_SWITCH_PENDING 0x32 127 // #define ERROR_CODE_RESERVED 128 #define ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34 129 #define ERROR_CODE_ROLE_SWITCH_FAILED 0x35 130 #define ERROR_CODE_EXTENDED_INQUIRY_RESPONSE_TOO_LARGE 0x36 131 #define ERROR_CODE_SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37 132 #define ERROR_CODE_HOST_BUSY_PAIRING 0x38 133 #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND 0x39 134 #define ERROR_CODE_CONTROLLER_BUSY 0x3A 135 #define ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS 0x3B 136 #define ERROR_CODE_DIRECTED_ADVERTISING_TIMEOUT 0x3C 137 #define ERROR_CODE_CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE 0x3D 138 #define ERROR_CODE_CONNECTION_FAILED_TO_BE_ESTABLISHED 0x3E 139 #define ERROR_CODE_MAC_CONNECTION_FAILED 0x3F 140 #define ERROR_CODE_COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING 0x40 141 142 // HCI roles 143 #define HCI_ROLE_MASTER 0 144 #define HCI_ROLE_SLAVE 1 145 146 // packet sizes (max payload) 147 #define HCI_ACL_DM1_SIZE 17 148 #define HCI_ACL_DH1_SIZE 27 149 #define HCI_ACL_2DH1_SIZE 54 150 #define HCI_ACL_3DH1_SIZE 83 151 #define HCI_ACL_DM3_SIZE 121 152 #define HCI_ACL_DH3_SIZE 183 153 #define HCI_ACL_DM5_SIZE 224 154 #define HCI_ACL_DH5_SIZE 339 155 #define HCI_ACL_2DH3_SIZE 367 156 #define HCI_ACL_3DH3_SIZE 552 157 #define HCI_ACL_2DH5_SIZE 679 158 #define HCI_ACL_3DH5_SIZE 1021 159 160 #define HCI_EVENT_PAYLOAD_SIZE 255 161 #define HCI_CMD_PAYLOAD_SIZE 255 162 163 #define LE_ADVERTISING_DATA_SIZE 31 164 165 /** 166 * Default INQ Mode 167 */ 168 #define HCI_INQUIRY_LAP 0x9E8B33L // 0x9E8B33: General/Unlimited Inquiry Access Code (GIAC) 169 170 /** 171 * SSP IO Capabilities 172 */ 173 #define SSP_IO_CAPABILITY_DISPLAY_ONLY 0 174 #define SSP_IO_CAPABILITY_DISPLAY_YES_NO 1 175 #define SSP_IO_CAPABILITY_KEYBOARD_ONLY 2 176 #define SSP_IO_CAPABILITY_NO_INPUT_NO_OUTPUT 3 177 #define SSP_IO_CAPABILITY_UNKNOWN 0xff 178 179 180 /** 181 * SSP Authentication Requirements, see IO Capability Request Reply Commmand 182 */ 183 184 // Numeric comparison with automatic accept allowed. 185 #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_NO_BONDING 0x00 186 187 // Use IO Capabilities to deter- mine authentication procedure 188 #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_NO_BONDING 0x01 189 190 // Numeric compar- ison with automatic accept allowed. 191 #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_DEDICATED_BONDING 0x02 192 193 // Use IO Capabilities to determine authentication procedure 194 #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_DEDICATED_BONDING 0x03 195 196 // Numeric Compari- son with automatic accept allowed. 197 #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_GENERAL_BONDING 0x04 198 199 // Use IO capabilities to determine authentication procedure. 200 #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_GENERAL_BONDING 0x05 201 202 203 // OGFs 204 #define OGF_LINK_CONTROL 0x01 205 #define OGF_LINK_POLICY 0x02 206 #define OGF_CONTROLLER_BASEBAND 0x03 207 #define OGF_INFORMATIONAL_PARAMETERS 0x04 208 #define OGF_STATUS_PARAMETERS 0x05 209 #define OGF_TESTING 0x06 210 #define OGF_LE_CONTROLLER 0x08 211 #define OGF_VENDOR 0x3f 212 213 214 // Events from host controller to host 215 216 /** 217 * @format 1 218 * @param status 219 */ 220 #define HCI_EVENT_INQUIRY_COMPLETE 0x01 221 // no format yet, can contain multiple results 222 223 /** 224 * @format 1B11132 225 * @param num_responses 226 * @param bd_addr 227 * @param page_scan_repetition_mode 228 * @param reserved1 229 * @param reserved2 230 * @param class_of_device 231 * @param clock_offset 232 */ 233 #define HCI_EVENT_INQUIRY_RESULT 0x02 234 235 /** 236 * @format 12B11 237 * @param status 238 * @param connection_handle 239 * @param bd_addr 240 * @param link_type 241 * @param encryption_enabled 242 */ 243 #define HCI_EVENT_CONNECTION_COMPLETE 0x03 244 /** 245 * @format B31 246 * @param bd_addr 247 * @param class_of_device 248 * @param link_type 249 */ 250 #define HCI_EVENT_CONNECTION_REQUEST 0x04 251 /** 252 * @format 121 253 * @param status 254 * @param connection_handle 255 * @param reason 256 */ 257 #define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 258 /** 259 * @format 12 260 * @param status 261 * @param connection_handle 262 */ 263 #define HCI_EVENT_AUTHENTICATION_COMPLETE_EVENT 0x06 264 /** 265 * @format 1BN 266 * @param status 267 * @param bd_addr 268 * @param remote_name 269 */ 270 #define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 271 /** 272 * @format 121 273 * @param status 274 * @param connection_handle 275 * @param encryption_enabled 276 */ 277 #define HCI_EVENT_ENCRYPTION_CHANGE 0x08 278 /** 279 * @format 12 280 * @param status 281 * @param connection_handle 282 */ 283 #define HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09 284 /** 285 * @format 121 286 * @param status 287 * @param connection_handle 288 * @param key_flag 289 */ 290 #define HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0A 291 #define HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE 0x0B 292 #define HCI_EVENT_READ_REMOTE_VERSION_INFORMATION_COMPLETE 0x0C 293 #define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D 294 295 /** 296 * @format 12R 297 * @param num_hci_command_packets 298 * @param command_opcode 299 * @param return_parameters 300 */ 301 #define HCI_EVENT_COMMAND_COMPLETE 0x0E 302 /** 303 * @format 112 304 * @param status 305 * @param num_hci_command_packets 306 * @param command_opcode 307 */ 308 #define HCI_EVENT_COMMAND_STATUS 0x0F 309 310 /** 311 * @format 121 312 * @param hardware_code 313 */ 314 #define HCI_EVENT_HARDWARE_ERROR 0x10 315 316 #define HCI_EVENT_FLUSH_OCCURED 0x11 317 318 /** 319 * @format 1B1 320 * @param status 321 * @param bd_addr 322 * @param role 323 */ 324 #define HCI_EVENT_ROLE_CHANGE 0x12 325 326 #define HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13 327 #define HCI_EVENT_MODE_CHANGE_EVENT 0x14 328 #define HCI_EVENT_RETURN_LINK_KEYS 0x15 329 #define HCI_EVENT_PIN_CODE_REQUEST 0x16 330 #define HCI_EVENT_LINK_KEY_REQUEST 0x17 331 #define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18 332 #define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1A 333 #define HCI_EVENT_MAX_SLOTS_CHANGED 0x1B 334 #define HCI_EVENT_READ_CLOCK_OFFSET_COMPLETE 0x1C 335 #define HCI_EVENT_PACKET_TYPE_CHANGED 0x1D 336 337 /** 338 * @format 1B11321 339 * @param num_responses 340 * @param bd_addr 341 * @param page_scan_repetition_mode 342 * @param reserved 343 * @param class_of_device 344 * @param clock_offset 345 * @param rssi 346 */ 347 #define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 348 349 /** 350 * @format 1HB111221 351 * @param status 352 * @param handle 353 * @param bd_addr 354 * @param link_type 355 * @param transmission_interval 356 * @param retransmission_interval 357 * @param rx_packet_length 358 * @param tx_packet_length 359 * @param air_mode 360 */ 361 #define HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE 0x2C 362 363 // TODO: serialize extended_inquiry_response and provide parser 364 /** 365 * @format 1B11321 366 * @param num_responses 367 * @param bd_addr 368 * @param page_scan_repetition_mode 369 * @param reserved 370 * @param class_of_device 371 * @param clock_offset 372 * @param rssi 373 */ 374 #define HCI_EVENT_EXTENDED_INQUIRY_RESPONSE 0x2F 375 376 /** 377 * @format 1H 378 * @param status 379 * @param handle 380 */ 381 #define HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 382 383 #define HCI_EVENT_IO_CAPABILITY_REQUEST 0x31 384 #define HCI_EVENT_IO_CAPABILITY_RESPONSE 0x32 385 #define HCI_EVENT_USER_CONFIRMATION_REQUEST 0x33 386 #define HCI_EVENT_USER_PASSKEY_REQUEST 0x34 387 #define HCI_EVENT_REMOTE_OOB_DATA_REQUEST 0x35 388 #define HCI_EVENT_SIMPLE_PAIRING_COMPLETE 0x36 389 390 #define HCI_EVENT_LE_META 0x3E 391 392 #define HCI_EVENT_VENDOR_SPECIFIC 0xFF 393 394 /** 395 * @format 11211B2221 396 * @param subevent_code 397 * @param status 398 * @param connection_handle 399 * @param role 400 * @param peer_address_type 401 * @param peer_address 402 * @param conn_interval 403 * @param conn_latency 404 * @param supervision_timeout 405 * @param master_clock_accuracy 406 */ 407 #define HCI_SUBEVENT_LE_CONNECTION_COMPLETE 0x01 408 #define HCI_SUBEVENT_LE_ADVERTISING_REPORT 0x02 409 #define HCI_SUBEVENT_LE_CONNECTION_UPDATE_COMPLETE 0x03 410 #define HCI_SUBEVENT_LE_READ_REMOTE_USED_FEATURES_COMPLETE 0x04 411 #define HCI_SUBEVENT_LE_LONG_TERM_KEY_REQUEST 0x05 412 413 // last used HCI_EVENT in 2.1 is 0x3d 414 // last used HCI_EVENT in 4.1 is 0x57 415 416 /** 417 * L2CAP Layer 418 */ 419 420 #define L2CAP_HEADER_SIZE 4 421 422 #define L2CAP_SIG_ID_INVALID 0 423 424 // size of HCI ACL + L2CAP Header for regular data packets (8) 425 #define COMPLETE_L2CAP_HEADER (HCI_ACL_HEADER_SIZE + L2CAP_HEADER_SIZE) 426 427 // minimum signaling MTU 428 #define L2CAP_MINIMAL_MTU 48 429 #define L2CAP_DEFAULT_MTU 672 430 431 // Minimum/default MTU 432 #define L2CAP_LE_DEFAULT_MTU 23 433 434 // L2CAP Fixed Channel IDs 435 #define L2CAP_CID_SIGNALING 0x0001 436 #define L2CAP_CID_CONNECTIONLESS_CHANNEL 0x0002 437 #define L2CAP_CID_ATTRIBUTE_PROTOCOL 0x0004 438 #define L2CAP_CID_SIGNALING_LE 0x0005 439 #define L2CAP_CID_SECURITY_MANAGER_PROTOCOL 0x0006 440 441 // L2CAP Configuration Result Codes 442 #define L2CAP_CONF_RESULT_UNKNOWN_OPTIONS 0x0003 443 444 // L2CAP Reject Result Codes 445 #define L2CAP_REJ_CMD_UNKNOWN 0x0000 446 447 // Response Timeout eXpired 448 #define L2CAP_RTX_TIMEOUT_MS 10000 449 450 // Extended Response Timeout eXpired 451 #define L2CAP_ERTX_TIMEOUT_MS 120000 452 453 // Fixed PSM numbers 454 #define PSM_SDP 0x01 455 #define PSM_RFCOMM 0x03 456 #define PSM_BNEP 0x0F 457 #define PSM_HID_CONTROL 0x11 458 #define PSM_HID_INTERRUPT 0x13 459 460 /** 461 * SDP Protocl 462 */ 463 464 // PDU Types 465 typedef enum { 466 SDP_Invalid = 0, 467 SDP_ErrorResponse = 1, 468 SDP_ServiceSearchRequest, 469 SDP_ServiceSearchResponse, 470 SDP_ServiceAttributeRequest, 471 SDP_ServiceAttributeResponse, 472 SDP_ServiceSearchAttributeRequest, 473 SDP_ServiceSearchAttributeResponse 474 } SDP_PDU_ID_t; 475 476 // UNIVERSAL ATTRIBUTE DEFINITIONS 477 #define SDP_ServiceRecordHandle 0x0000 478 #define SDP_ServiceClassIDList 0x0001 479 #define SDP_ServiceRecordState 0x0002 480 #define SDP_ServiceID 0x0003 481 #define SDP_ProtocolDescriptorList 0x0004 482 #define SDP_BrowseGroupList 0x0005 483 #define SDP_LanguageBaseAttributeIDList 0x0006 484 #define SDP_ServiceInfoTimeToLive 0x0007 485 #define SDP_ServiceAvailability 0x0008 486 #define SDP_BluetoothProfileDescriptorList 0x0009 487 #define SDP_DocumentationURL 0x000a 488 #define SDP_ClientExecutableURL 0x000b 489 #define SDP_IconURL 0x000c 490 #define SDP_AdditionalProtocolDescriptorList 0x000d 491 #define SDP_SupportedFormatsList 0x0303 492 493 // SERVICE CLASSES 494 #define SDP_OBEXObjectPush 0x1105 495 #define SDP_OBEXFileTransfer 0x1106 496 #define SDP_PublicBrowseGroup 0x1002 497 #define SDP_HSP 0x1108 498 #define SDP_Headset_AG 0x1112 499 #define SDP_PANU 0x1115 500 #define SDP_NAP 0x1116 501 #define SDP_GN 0x1117 502 #define SDP_Handsfree 0x111E 503 #define SDP_HandsfreeAudioGateway 0x111F 504 #define SDP_Headset_HS 0x1131 505 #define SDP_GenericAudio 0x1203 506 507 508 // PROTOCOLS 509 #define SDP_SDPProtocol 0x0001 510 #define SDP_UDPProtocol 0x0002 511 #define SDP_RFCOMMProtocol 0x0003 512 #define SDP_OBEXProtocol 0x0008 513 #define SDP_L2CAPProtocol 0x0100 514 #define SDP_BNEPProtocol 0x000F 515 #define SDP_AVDTPProtocol 0x0019 516 517 // OFFSETS FOR LOCALIZED ATTRIBUTES - SDP_LanguageBaseAttributeIDList 518 #define SDP_Offest_ServiceName 0x0000 519 #define SDP_Offest_ServiceDescription 0x0001 520 #define SDP_Offest_ProviderName 0x0002 521 522 // OBEX 523 #define SDP_vCard_2_1 0x01 524 #define SDP_vCard_3_0 0x02 525 #define SDP_vCal_1_0 0x03 526 #define SDP_iCal_2_0 0x04 527 #define SDP_vNote 0x05 528 #define SDP_vMessage 0x06 529 #define SDP_OBEXFileTypeAny 0xFF 530 531 /** 532 * RFCOMM Protocol 533 */ 534 535 // Control field values bit no. 1 2 3 4 PF 6 7 8 536 #define BT_RFCOMM_SABM 0x3F // 1 1 1 1 1 1 0 0 537 #define BT_RFCOMM_UA 0x73 // 1 1 0 0 1 1 1 0 538 #define BT_RFCOMM_DM 0x0F // 1 1 1 1 0 0 0 0 539 #define BT_RFCOMM_DM_PF 0x1F // 1 1 1 1 1 0 0 0 540 #define BT_RFCOMM_DISC 0x53 // 1 1 0 0 1 0 1 0 541 #define BT_RFCOMM_UIH 0xEF // 1 1 1 1 0 1 1 1 542 #define BT_RFCOMM_UIH_PF 0xFF // 1 1 1 1 0 1 1 1 543 544 // Multiplexer message types 545 #define BT_RFCOMM_CLD_CMD 0xC3 546 #define BT_RFCOMM_FCON_CMD 0xA3 547 #define BT_RFCOMM_FCON_RSP 0xA1 548 #define BT_RFCOMM_FCOFF_CMD 0x63 549 #define BT_RFCOMM_FCOFF_RSP 0x61 550 #define BT_RFCOMM_MSC_CMD 0xE3 551 #define BT_RFCOMM_MSC_RSP 0xE1 552 #define BT_RFCOMM_NSC_RSP 0x11 553 #define BT_RFCOMM_PN_CMD 0x83 554 #define BT_RFCOMM_PN_RSP 0x81 555 #define BT_RFCOMM_RLS_CMD 0x53 556 #define BT_RFCOMM_RLS_RSP 0x51 557 #define BT_RFCOMM_RPN_CMD 0x93 558 #define BT_RFCOMM_RPN_RSP 0x91 559 #define BT_RFCOMM_TEST_CMD 0x23 560 #define BT_RFCOMM_TEST_RSP 0x21 561 562 // Line Status 563 #define LINE_STATUS_NO_ERROR 0x00 564 #define LINE_STATUS_OVERRUN_ERROR 0x03 565 #define LINE_STATUS_PARITY_ERORR 0x05 566 #define LINE_STATUS_FRAMING_ERROR 0x09 567 568 // Modem Status Flags 569 #define MODEM_STATUS_FC 0x02 570 #define MODEM_STATUS_RTC 0x04 571 #define MODEM_STATUS_RTR 0x08 572 #define MODEM_STATUS_IC 0x40 573 #define MODEM_STATUS_DV 0x80 574 575 typedef enum rpn_baud { 576 RPN_BAUD_2400 = 0, 577 RPN_BAUD_4800, 578 RPN_BAUD_7200, 579 RPN_BAUD_9600, 580 RPN_BAUD_19200, 581 RPN_BAUD_38400, 582 RPN_BAUD_57600, 583 RPN_BAUD_115200, 584 RPN_BAUD_230400 585 } rpn_baud_t; 586 587 typedef enum rpn_data_bits { 588 RPN_DATA_BITS_5 = 0, 589 RPN_DATA_BITS_6 = 0, 590 RPN_DATA_BITS_7 = 0, 591 RPN_DATA_BITS_8 = 0 592 } rpn_data_bits_t; 593 594 typedef enum rpn_stop_bits { 595 RPN_STOP_BITS_1_0 = 0, 596 RPN_STOP_BITS_1_5 597 } rpn_stop_bits_t; 598 599 typedef enum rpn_parity { 600 RPN_PARITY_NONE = 0, 601 RPN_PARITY_ODD = 1, 602 RPN_PARITY_EVEN = 3, 603 RPN_PARITY_MARK = 5, 604 RPN_PARITY_SPACE = 7, 605 } rpn_parity_t; 606 607 typedef enum rpn_flow_control { 608 RPN_FLOW_CONTROL_XONXOFF_ON_INPUT = 1 << 0, 609 RPN_FLOW_CONTROL_XONXOFF_ON_OUTPUT = 1 << 1, 610 RPN_FLOW_CONTROL_RTR_ON_INPUT = 1 << 2, 611 RPN_FLOW_CONTROL_RTR_ON_OUTPUT = 1 << 3, 612 RPN_FLOW_CONTROL_RTC_ON_INPUT = 1 << 4, 613 RPN_FLOW_CONTROL_RTC_ON_OUTPUT = 1 << 5, 614 } rpn_flow_control_t; 615 616 #define RPN_PARAM_MASK_0_BAUD 0x01 617 #define RPN_PARAM_MASK_0_DATA_BITS 0x02 618 #define RPN_PARAM_MASK_0_STOP_BITS 0x04 619 #define RPN_PARAM_MASK_0_PARITY 0x08 620 #define RPN_PARAM_MASK_0_PARITY_TYPE 0x10 621 #define RPN_PARAM_MASK_0_XON_CHAR 0x20 622 #define RPN_PARAM_MASK_0_XOFF_CHAR 0x40 623 #define RPN_PARAM_MASK_0_RESERVED 0x80 624 625 // @note: values are identical to rpn_flow_control_t 626 #define RPN_PARAM_MASK_1_XONOFF_ON_INPUT 0x01 627 #define RPN_PARAM_MASK_1_XONOFF_ON_OUTPUT 0x02 628 #define RPN_PARAM_MASK_1_RTR_ON_INPUT 0x04 629 #define RPN_PARAM_MASK_1_RTR_ON_OUTPUT 0x08 630 #define RPN_PARAM_MASK_1_RTC_ON_INPUT 0x10 631 #define RPN_PARAM_MASK_1_RTC_ON_OUTPUT 0x20 632 #define RPN_PARAM_MASK_1_RESERVED_0 0x40 633 #define RPN_PARAM_MASK_1_RESERVED_1 0x80 634 635 /** 636 * BNEP Protocol 637 */ 638 639 #ifndef ETHER_ADDR_LEN 640 #define ETHER_ADDR_LEN 6 641 #endif 642 643 #ifndef ETHERTYPE_VLAN 644 #define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tag */ 645 #endif 646 647 #define BNEP_MTU_MIN 1691 648 649 #define BNEP_EXT_FLAG 0x80 650 #define BNEP_TYPE_MASK 0x7F 651 #define BNEP_TYPE(header) ((header) & BNEP_TYPE_MASK) 652 #define BNEP_HEADER_HAS_EXT(x) (((x) & BNEP_EXT_FLAG) == BNEP_EXT_FLAG) 653 654 /* BNEP packet types */ 655 #define BNEP_PKT_TYPE_GENERAL_ETHERNET 0x00 656 #define BNEP_PKT_TYPE_CONTROL 0x01 657 #define BNEP_PKT_TYPE_COMPRESSED_ETHERNET 0x02 658 #define BNEP_PKT_TYPE_COMPRESSED_ETHERNET_SOURCE_ONLY 0x03 659 #define BNEP_PKT_TYPE_COMPRESSED_ETHERNET_DEST_ONLY 0x04 660 661 /* BNEP control types */ 662 #define BNEP_CONTROL_TYPE_COMMAND_NOT_UNDERSTOOD 0x00 663 #define BNEP_CONTROL_TYPE_SETUP_CONNECTION_REQUEST 0x01 664 #define BNEP_CONTROL_TYPE_SETUP_CONNECTION_RESPONSE 0x02 665 #define BNEP_CONTROL_TYPE_FILTER_NET_TYPE_SET 0x03 666 #define BNEP_CONTROL_TYPE_FILTER_NET_TYPE_RESPONSE 0x04 667 #define BNEP_CONTROL_TYPE_FILTER_MULTI_ADDR_SET 0x05 668 #define BNEP_CONTROL_TYPE_FILTER_MULTI_ADDR_RESPONSE 0x06 669 670 /* BNEP extension header types */ 671 #define BNEP_EXT_HEADER_TYPE_EXTENSION_CONTROL 0x00 672 673 /* BNEP setup response codes */ 674 #define BNEP_RESP_SETUP_SUCCESS 0x0000 675 #define BNEP_RESP_SETUP_INVALID_DEST_UUID 0x0001 676 #define BNEP_RESP_SETUP_INVALID_SOURCE_UUID 0x0002 677 #define BNEP_RESP_SETUP_INVALID_SERVICE_UUID_SIZE 0x0003 678 #define BNEP_RESP_SETUP_CONNECTION_NOT_ALLOWED 0x0004 679 680 /* BNEP filter response codes */ 681 #define BNEP_RESP_FILTER_SUCCESS 0x0000 682 #define BNEP_RESP_FILTER_UNSUPPORTED_REQUEST 0x0001 683 #define BNEP_RESP_FILTER_ERR_INVALID_RANGE 0x0002 684 #define BNEP_RESP_FILTER_ERR_TOO_MANY_FILTERS 0x0003 685 #define BNEP_RESP_FILTER_ERR_SECURITY 0x0004 686 687 /** 688 * PAN Profile 689 */ 690 691 typedef enum { 692 PANU_UUID = 0x1115, 693 NAP_UUID = 0x1116, 694 GN_UUID = 0x1117 695 } bnep_service_uuid_t; 696 697 typedef enum { 698 BNEP_SECURITY_NONE = 0x0000, 699 BNEP_SECURITY_SERVICE_LEVEL_ENFORCED, 700 BNEP_SECURITY_802_1X 701 } security_description_t; 702 703 typedef enum { 704 PAN_NET_ACCESS_TYPE_PSTN = 0x0000, 705 PAN_NET_ACCESS_TYPE_ISDN, 706 PAN_NET_ACCESS_TYPE_DSL, 707 PAN_NET_ACCESS_TYPE_CABLE_MODEM, 708 PAN_NET_ACCESS_TYPE_10MB_ETHERNET, 709 PAN_NET_ACCESS_TYPE_100MB_ETHERNET, 710 PAN_NET_ACCESS_TYPE_4MB_TOKEN_RING, 711 PAN_NET_ACCESS_TYPE_16MB_TOKEN_RING, 712 PAN_NET_ACCESS_TYPE_100MB_TOKEN_RING, 713 PAN_NET_ACCESS_TYPE_FDDI, 714 PAN_NET_ACCESS_TYPE_GSM, 715 PAN_NET_ACCESS_TYPE_CDMA, 716 PAN_NET_ACCESS_TYPE_GPRS, 717 PAN_NET_ACCESS_TYPE_3G, 718 PAN_NET_ACCESS_TYPE_CELULAR, 719 PAN_NET_ACCESS_TYPE_OTHER = 0xFFFE, 720 PAN_NET_ACCESS_TYPE_NONE 721 } net_access_type_t; 722 723 /** 724 * ATT 725 */ 726 727 // Minimum/default MTU 728 #define ATT_DEFAULT_MTU 23 729 730 // MARK: Attribute PDU Opcodes 731 #define ATT_ERROR_RESPONSE 0x01 732 733 #define ATT_EXCHANGE_MTU_REQUEST 0x02 734 #define ATT_EXCHANGE_MTU_RESPONSE 0x03 735 736 #define ATT_FIND_INFORMATION_REQUEST 0x04 737 #define ATT_FIND_INFORMATION_REPLY 0x05 738 #define ATT_FIND_BY_TYPE_VALUE_REQUEST 0x06 739 #define ATT_FIND_BY_TYPE_VALUE_RESPONSE 0x07 740 741 #define ATT_READ_BY_TYPE_REQUEST 0x08 742 #define ATT_READ_BY_TYPE_RESPONSE 0x09 743 #define ATT_READ_REQUEST 0x0a 744 #define ATT_READ_RESPONSE 0x0b 745 #define ATT_READ_BLOB_REQUEST 0x0c 746 #define ATT_READ_BLOB_RESPONSE 0x0d 747 #define ATT_READ_MULTIPLE_REQUEST 0x0e 748 #define ATT_READ_MULTIPLE_RESPONSE 0x0f 749 #define ATT_READ_BY_GROUP_TYPE_REQUEST 0x10 750 #define ATT_READ_BY_GROUP_TYPE_RESPONSE 0x11 751 752 #define ATT_WRITE_REQUEST 0x12 753 #define ATT_WRITE_RESPONSE 0x13 754 755 #define ATT_PREPARE_WRITE_REQUEST 0x16 756 #define ATT_PREPARE_WRITE_RESPONSE 0x17 757 #define ATT_EXECUTE_WRITE_REQUEST 0x18 758 #define ATT_EXECUTE_WRITE_RESPONSE 0x19 759 760 #define ATT_HANDLE_VALUE_NOTIFICATION 0x1b 761 #define ATT_HANDLE_VALUE_INDICATION 0x1d 762 #define ATT_HANDLE_VALUE_CONFIRMATION 0x1e 763 764 765 #define ATT_WRITE_COMMAND 0x52 766 #define ATT_SIGNED_WRITE_COMMAND 0xD2 767 768 // MARK: ATT Error Codes 769 #define ATT_ERROR_INVALID_HANDLE 0x01 770 #define ATT_ERROR_READ_NOT_PERMITTED 0x02 771 #define ATT_ERROR_WRITE_NOT_PERMITTED 0x03 772 #define ATT_ERROR_INVALID_PDU 0x04 773 #define ATT_ERROR_INSUFFICIENT_AUTHENTICATION 0x05 774 #define ATT_ERROR_REQUEST_NOT_SUPPORTED 0x06 775 #define ATT_ERROR_INVALID_OFFSET 0x07 776 #define ATT_ERROR_INSUFFICIENT_AUTHORIZATION 0x08 777 #define ATT_ERROR_PREPARE_QUEUE_FULL 0x09 778 #define ATT_ERROR_ATTRIBUTE_NOT_FOUND 0x0a 779 #define ATT_ERROR_ATTRIBUTE_NOT_LONG 0x0b 780 #define ATT_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE 0x0c 781 #define ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH 0x0d 782 #define ATT_ERROR_UNLIKELY_ERROR 0x0e 783 #define ATT_ERROR_INSUFFICIENT_ENCRYPTION 0x0f 784 #define ATT_ERROR_UNSUPPORTED_GROUP_TYPE 0x10 785 #define ATT_ERROR_INSUFFICIENT_RESOURCES 0x11 786 787 // MARK: Attribute Property Flags 788 #define ATT_PROPERTY_BROADCAST 0x01 789 #define ATT_PROPERTY_READ 0x02 790 #define ATT_PROPERTY_WRITE_WITHOUT_RESPONSE 0x04 791 #define ATT_PROPERTY_WRITE 0x08 792 #define ATT_PROPERTY_NOTIFY 0x10 793 #define ATT_PROPERTY_INDICATE 0x20 794 #define ATT_PROPERTY_AUTHENTICATED_SIGNED_WRITE 0x40 795 #define ATT_PROPERTY_EXTENDED_PROPERTIES 0x80 796 797 // MARK: Attribute Property Flag, BTstack extension 798 // value is asked from client 799 #define ATT_PROPERTY_DYNAMIC 0x100 800 // 128 bit UUID used 801 #define ATT_PROPERTY_UUID128 0x200 802 // Authentication required 803 #define ATT_PROPERTY_AUTHENTICATION_REQUIRED 0x400 804 // Authorization from user required 805 #define ATT_PROPERTY_AUTHORIZATION_REQUIRED 0x800 806 // Encryption key size stored in upper 4 bits, 0 == no encryption, encryption key size - 1 otherwise 807 808 // ATT Transaction Timeout of 30 seconds for Command/Response or Incidationc/Confirmation 809 #define ATT_TRANSACTION_TIMEOUT_MS 30000 810 811 #define ATT_TRANSACTION_MODE_NONE 0x0 812 #define ATT_TRANSACTION_MODE_ACTIVE 0x1 813 #define ATT_TRANSACTION_MODE_EXECUTE 0x2 814 #define ATT_TRANSACTION_MODE_CANCEL 0x3 815 816 // MARK: GATT UUIDs 817 #define GATT_PRIMARY_SERVICE_UUID 0x2800 818 #define GATT_SECONDARY_SERVICE_UUID 0x2801 819 #define GATT_INCLUDE_SERVICE_UUID 0x2802 820 #define GATT_CHARACTERISTICS_UUID 0x2803 821 #define GATT_CHARACTERISTIC_EXTENDED_PROPERTIES 0x2900 822 #define GATT_CHARACTERISTIC_USER_DESCRIPTION 0x2901 823 #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION 0x2902 824 #define GATT_SERVER_CHARACTERISTICS_CONFIGURATION 0x2903 825 #define GATT_CHARACTERISTIC_PRESENTATION_FORMAT 0x2904 826 #define GATT_CHARACTERISTIC_AGGREGATE_FORMAT 0x2905 827 828 #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE 0 829 #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION 1 830 #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION 2 831 832 // GAP Service and Characteristics 833 #define GAP_SERVICE_UUID 0x1800 834 #define GAP_DEVICE_NAME_UUID 0x2a00 835 #define GAP_APPEARANCE_UUID 0x2a01 836 #define GAP_PERIPHERAL_PRIVACY_FLAG 0x2a02 837 #define GAP_RECONNECTION_ADDRESS_UUID 0x2a03 838 #define GAP_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS_UUID 0x2a04 839 840 /** 841 * SM - LE Security Manager 842 */ 843 // Bluetooth Spec definitions 844 typedef enum { 845 SM_CODE_PAIRING_REQUEST = 0X01, 846 SM_CODE_PAIRING_RESPONSE, 847 SM_CODE_PAIRING_CONFIRM, 848 SM_CODE_PAIRING_RANDOM, 849 SM_CODE_PAIRING_FAILED, 850 SM_CODE_ENCRYPTION_INFORMATION, 851 SM_CODE_MASTER_IDENTIFICATION, 852 SM_CODE_IDENTITY_INFORMATION, 853 SM_CODE_IDENTITY_ADDRESS_INFORMATION, 854 SM_CODE_SIGNING_INFORMATION, 855 SM_CODE_SECURITY_REQUEST 856 } SECURITY_MANAGER_COMMANDS; 857 858 // IO Capability Values 859 typedef enum { 860 IO_CAPABILITY_DISPLAY_ONLY = 0, 861 IO_CAPABILITY_DISPLAY_YES_NO, 862 IO_CAPABILITY_KEYBOARD_ONLY, 863 IO_CAPABILITY_NO_INPUT_NO_OUTPUT, 864 IO_CAPABILITY_KEYBOARD_DISPLAY, // not used by secure simple pairing 865 } io_capability_t; 866 867 // Authentication requirement flags 868 #define SM_AUTHREQ_NO_BONDING 0x00 869 #define SM_AUTHREQ_BONDING 0x01 870 #define SM_AUTHREQ_MITM_PROTECTION 0x04 871 872 // Key distribution flags used by spec 873 #define SM_KEYDIST_ENC_KEY 0X01 874 #define SM_KEYDIST_ID_KEY 0x02 875 #define SM_KEYDIST_SIGN 0x04 876 877 // Key distribution flags used internally 878 #define SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION 0x01 879 #define SM_KEYDIST_FLAG_MASTER_IDENTIFICATION 0x02 880 #define SM_KEYDIST_FLAG_IDENTITY_INFORMATION 0x04 881 #define SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION 0x08 882 #define SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION 0x10 883 884 // STK Generation Methods 885 #define SM_STK_GENERATION_METHOD_JUST_WORKS 0x01 886 #define SM_STK_GENERATION_METHOD_OOB 0x02 887 #define SM_STK_GENERATION_METHOD_PASSKEY 0x04 888 889 // Pairing Failed Reasons 890 #define SM_REASON_RESERVED 0x00 891 #define SM_REASON_PASSKEYT_ENTRY_FAILED 0x01 892 #define SM_REASON_OOB_NOT_AVAILABLE 0x02 893 #define SM_REASON_AUTHENTHICATION_REQUIREMENTS 0x03 894 #define SM_REASON_CONFIRM_VALUE_FAILED 0x04 895 #define SM_REASON_PAIRING_NOT_SUPPORTED 0x05 896 #define SM_REASON_ENCRYPTION_KEY_SIZE 0x06 897 #define SM_REASON_COMMAND_NOT_SUPPORTED 0x07 898 #define SM_REASON_UNSPECIFIED_REASON 0x08 899 #define SM_REASON_REPEATED_ATTEMPTS 0x09 900 // also, invalid parameters 901 // and reserved 902 903 // Company identifiers / manufacturers 904 #define COMPANY_ID_CAMBRIDGE_SILICON_RADIO 0x000A 905 #define COMPANY_ID_TEXAS_INSTRUMENTS_INC 0x000D 906 #define COMPANY_ID_BROADCOM_CORPORATION 0x000F 907 #define COMPANY_ID_ST_MICROELECTRONICS 0x0030 908 #define COMPANY_ID_EM_MICROELECTRONICS_MARIN 0x005A 909 910 911 #endif