bluetooth.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  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. * contact@bluekitchen-gmbh.com
  35. *
  36. */
  37. /*
  38. * bluetooth.h
  39. *
  40. * Numbers defined or derived from the official Bluetooth specification
  41. */
  42. #ifndef BLUETOOTH_H
  43. #define BLUETOOTH_H
  44. #include <stdint.h>
  45. /**
  46. * @brief hci connection handle type
  47. */
  48. typedef uint16_t hci_con_handle_t;
  49. /**
  50. * @brief Length of a bluetooth device address.
  51. */
  52. #define BD_ADDR_LEN 6
  53. /**
  54. * @brief Bluetooth address
  55. */
  56. typedef uint8_t bd_addr_t[BD_ADDR_LEN];
  57. /**
  58. * Address types
  59. * @note: BTstack uses a custom addr type to refer to classic ACL and SCO devices
  60. */
  61. typedef enum {
  62. BD_ADDR_TYPE_LE_PUBLIC = 0,
  63. BD_ADDR_TYPE_LE_RANDOM = 1,
  64. BD_ADDR_TYPE_LE_PRIVAT_FALLBACK_PUBLIC = 2,
  65. BD_ADDR_TYPE_LE_PRIVAT_FALLBACK_RANDOM = 3,
  66. BD_ADDR_TYPE_SCO = 0xfc,
  67. BD_ADDR_TYPE_ACL = 0xfd,
  68. BD_ADDR_TYPE_UNKNOWN = 0xfe, // also used as 'invalid'
  69. } bd_addr_type_t;
  70. /**
  71. * @brief link key
  72. */
  73. #define LINK_KEY_LEN 16
  74. #define LINK_KEY_STR_LEN (LINK_KEY_LEN*2)
  75. typedef uint8_t link_key_t[LINK_KEY_LEN];
  76. /**
  77. * @brief link key type
  78. */
  79. typedef enum {
  80. COMBINATION_KEY = 0, // standard pairing
  81. LOCAL_UNIT_KEY, // ?
  82. REMOTE_UNIT_KEY, // ?
  83. DEBUG_COMBINATION_KEY, // SSP with debug
  84. UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P192, // SSP Simple Pairing
  85. AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P192, // SSP Passkey, Number confirm, OOB
  86. CHANGED_COMBINATION_KEY, // Link key changed using Change Connection Lnk Key
  87. UNAUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256, // SSP Simpe Pairing
  88. AUTHENTICATED_COMBINATION_KEY_GENERATED_FROM_P256, // SSP Passkey, Number confirm, OOB
  89. } link_key_type_t;
  90. /**
  91. * @brief Extended Inquiry Response
  92. */
  93. #define EXTENDED_INQUIRY_RESPONSE_DATA_LEN 240
  94. /**
  95. * @brief Inquiry modes
  96. */
  97. typedef enum {
  98. INQUIRY_MODE_STANDARD = 0,
  99. INQUIRY_MODE_RSSI,
  100. INQUIRY_MODE_RSSI_AND_EIR,
  101. } inquiry_mode_t;
  102. /**
  103. * HCI Transport
  104. */
  105. /**
  106. * packet types - used in BTstack and over the H4 UART interface
  107. */
  108. #define HCI_COMMAND_DATA_PACKET 0x01
  109. #define HCI_ACL_DATA_PACKET 0x02
  110. #define HCI_SCO_DATA_PACKET 0x03
  111. #define HCI_EVENT_PACKET 0x04
  112. /**
  113. * HCI Layer
  114. */
  115. //
  116. // Error Codes rfom Bluetooth Core Specification
  117. //
  118. /* ENUM_START: BLUETOOTH_ERROR_CODE */
  119. #define ERROR_CODE_SUCCESS 0x00
  120. #define ERROR_CODE_UNKNOWN_HCI_COMMAND 0x01
  121. #define ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02
  122. #define ERROR_CODE_HARDWARE_FAILURE 0x03
  123. #define ERROR_CODE_PAGE_TIMEOUT 0x04
  124. #define ERROR_CODE_AUTHENTICATION_FAILURE 0x05
  125. #define ERROR_CODE_PIN_OR_KEY_MISSING 0x06
  126. #define ERROR_CODE_MEMORY_CAPACITY_EXCEEDED 0x07
  127. #define ERROR_CODE_CONNECTION_TIMEOUT 0x08
  128. #define ERROR_CODE_CONNECTION_LIMIT_EXCEEDED 0x09
  129. #define ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED 0x0A
  130. #define ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS 0x0B
  131. #define ERROR_CODE_COMMAND_DISALLOWED 0x0C
  132. #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D
  133. #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_SECURITY_REASONS 0x0E
  134. #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR 0x0F
  135. #define ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10
  136. #define ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE 0x11
  137. #define ERROR_CODE_INVALID_HCI_COMMAND_PARAMETERS 0x12
  138. #define ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION 0x13
  139. #define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x14
  140. #define ERROR_CODE_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER_OFF 0x15
  141. #define ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16
  142. #define ERROR_CODE_REPEATED_ATTEMPTS 0x17
  143. #define ERROR_CODE_PAIRING_NOT_ALLOWED 0x18
  144. #define ERROR_CODE_UNKNOWN_LMP_PDU 0x19
  145. #define ERROR_CODE_UNSUPPORTED_REMOTE_FEATURE_UNSUPPORTED_LMP_FEATURE 0x1A
  146. #define ERROR_CODE_SCO_OFFSET_REJECTED 0x1B
  147. #define ERROR_CODE_SCO_INTERVAL_REJECTED 0x1C
  148. #define ERROR_CODE_SCO_AIR_MODE_REJECTED 0x1D
  149. #define ERROR_CODE_INVALID_LMP_PARAMETERS_INVALID_LL_PARAMETERS 0x1E
  150. #define ERROR_CODE_UNSPECIFIED_ERROR 0x1F
  151. #define ERROR_CODE_UNSUPPORTED_LMP_PARAMETER_VALUE_UNSUPPORTED_LL_PARAMETER_VALUE 0x20
  152. #define ERROR_CODE_ROLE_CHANGE_NOT_ALLOWED 0x21
  153. #define ERROR_CODE_LMP_RESPONSE_TIMEOUT_LL_RESPONSE_TIMEOUT 0x22
  154. #define ERROR_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23
  155. #define ERROR_CODE_LMP_PDU_NOT_ALLOWED 0x24
  156. #define ERROR_CODE_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25
  157. #define ERROR_CODE_LINK_KEY_CANNOT_BE_CHANGED 0x26
  158. #define ERROR_CODE_REQUESTED_QOS_NOT_SUPPORTED 0x27
  159. #define ERROR_CODE_INSTANT_PASSED 0x28
  160. #define ERROR_CODE_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29
  161. #define ERROR_CODE_DIFFERENT_TRANSACTION_COLLISION 0x2A
  162. #define ERROR_CODE_RESERVED 0x2B
  163. #define ERROR_CODE_QOS_UNACCEPTABLE_PARAMETER 0x2C
  164. #define ERROR_CODE_QOS_REJECTED 0x2D
  165. #define ERROR_CODE_CHANNEL_CLASSIFICATION_NOT_SUPPORTED 0x2E
  166. #define ERROR_CODE_INSUFFICIENT_SECURITY 0x2F
  167. #define ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30
  168. // #define ERROR_CODE_RESERVED
  169. #define ERROR_CODE_ROLE_SWITCH_PENDING 0x32
  170. // #define ERROR_CODE_RESERVED
  171. #define ERROR_CODE_RESERVED_SLOT_VIOLATION 0x34
  172. #define ERROR_CODE_ROLE_SWITCH_FAILED 0x35
  173. #define ERROR_CODE_EXTENDED_INQUIRY_RESPONSE_TOO_LARGE 0x36
  174. #define ERROR_CODE_SECURE_SIMPLE_PAIRING_NOT_SUPPORTED_BY_HOST 0x37
  175. #define ERROR_CODE_HOST_BUSY_PAIRING 0x38
  176. #define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_NO_SUITABLE_CHANNEL_FOUND 0x39
  177. #define ERROR_CODE_CONTROLLER_BUSY 0x3A
  178. #define ERROR_CODE_UNACCEPTABLE_CONNECTION_PARAMETERS 0x3B
  179. #define ERROR_CODE_DIRECTED_ADVERTISING_TIMEOUT 0x3C
  180. #define ERROR_CODE_CONNECTION_TERMINATED_DUE_TO_MIC_FAILURE 0x3D
  181. #define ERROR_CODE_CONNECTION_FAILED_TO_BE_ESTABLISHED 0x3E
  182. #define ERROR_CODE_MAC_CONNECTION_FAILED 0x3F
  183. #define ERROR_CODE_COARSE_CLOCK_ADJUSTMENT_REJECTED_BUT_WILL_TRY_TO_ADJUST_USING_CLOCK_DRAGGING 0x40
  184. // BTstack defined ERRORS, mapped into BLuetooth status code range
  185. #define BTSTACK_CONNECTION_TO_BTDAEMON_FAILED 0x50
  186. #define BTSTACK_ACTIVATION_FAILED_SYSTEM_BLUETOOTH 0x51
  187. #define BTSTACK_ACTIVATION_POWERON_FAILED 0x52
  188. #define BTSTACK_ACTIVATION_FAILED_UNKNOWN 0x53
  189. #define BTSTACK_NOT_ACTIVATED 0x54
  190. #define BTSTACK_BUSY 0x55
  191. #define BTSTACK_MEMORY_ALLOC_FAILED 0x56
  192. #define BTSTACK_ACL_BUFFERS_FULL 0x57
  193. // l2cap errors - enumeration by the command that created them
  194. #define L2CAP_COMMAND_REJECT_REASON_COMMAND_NOT_UNDERSTOOD 0x60
  195. #define L2CAP_COMMAND_REJECT_REASON_SIGNALING_MTU_EXCEEDED 0x61
  196. #define L2CAP_COMMAND_REJECT_REASON_INVALID_CID_IN_REQUEST 0x62
  197. #define L2CAP_CONNECTION_RESPONSE_RESULT_SUCCESSFUL 0x63
  198. #define L2CAP_CONNECTION_RESPONSE_RESULT_PENDING 0x64
  199. #define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_PSM 0x65
  200. #define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_SECURITY 0x66
  201. #define L2CAP_CONNECTION_RESPONSE_RESULT_REFUSED_RESOURCES 0x67
  202. #define L2CAP_CONNECTION_RESPONSE_RESULT_ERTM_NOT_SUPPORTED 0x68
  203. // should be L2CAP_CONNECTION_RTX_TIMEOUT
  204. #define L2CAP_CONNECTION_RESPONSE_RESULT_RTX_TIMEOUT 0x69
  205. #define L2CAP_CONNECTION_BASEBAND_DISCONNECT 0x6A
  206. #define L2CAP_SERVICE_ALREADY_REGISTERED 0x6B
  207. #define L2CAP_DATA_LEN_EXCEEDS_REMOTE_MTU 0x6C
  208. #define L2CAP_SERVICE_DOES_NOT_EXIST 0x6D
  209. #define L2CAP_LOCAL_CID_DOES_NOT_EXIST 0x6E
  210. #define RFCOMM_MULTIPLEXER_STOPPED 0x70
  211. #define RFCOMM_CHANNEL_ALREADY_REGISTERED 0x71
  212. #define RFCOMM_NO_OUTGOING_CREDITS 0x72
  213. #define RFCOMM_AGGREGATE_FLOW_OFF 0x73
  214. #define RFCOMM_DATA_LEN_EXCEEDS_MTU 0x74
  215. #define SDP_HANDLE_ALREADY_REGISTERED 0x80
  216. #define SDP_QUERY_INCOMPLETE 0x81
  217. #define SDP_SERVICE_NOT_FOUND 0x82
  218. #define SDP_HANDLE_INVALID 0x83
  219. #define SDP_QUERY_BUSY 0x84
  220. #define ATT_HANDLE_VALUE_INDICATION_IN_PROGRESS 0x90
  221. #define ATT_HANDLE_VALUE_INDICATION_TIMEOUT 0x91
  222. #define ATT_HANDLE_VALUE_INDICATION_DISCONNECT 0x92
  223. #define GATT_CLIENT_NOT_CONNECTED 0x93
  224. #define GATT_CLIENT_BUSY 0x94
  225. #define GATT_CLIENT_IN_WRONG_STATE 0x95
  226. #define GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS 0x96
  227. #define GATT_CLIENT_VALUE_TOO_LONG 0x97
  228. #define GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED 0x98
  229. #define GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED 0x99
  230. #define BNEP_SERVICE_ALREADY_REGISTERED 0xA0
  231. #define BNEP_CHANNEL_NOT_CONNECTED 0xA1
  232. #define BNEP_DATA_LEN_EXCEEDS_MTU 0xA2
  233. // OBEX ERRORS
  234. #define OBEX_UNKNOWN_ERROR 0xB0
  235. #define OBEX_CONNECT_FAILED 0xB1
  236. #define OBEX_DISCONNECTED 0xB2
  237. #define OBEX_NOT_FOUND 0xB3
  238. #define OBEX_NOT_ACCEPTABLE 0xB4
  239. #define MESH_ERROR_APPKEY_INDEX_INVALID 0xD0
  240. /* ENUM_END */
  241. /* ENUM_START: AVRCP_BROWSING_ERROR_CODE */
  242. #define AVRCP_BROWSING_ERROR_CODE_INVALID_COMMAND 0x00 // Sent if TG received a PDU that it did not understand. Valid for All.
  243. #define AVRCP_BROWSING_ERROR_CODE_INVALID_PARAMETER 0x01 // Sent if the TG received a PDU with a parameter ID that it did not understand. Sent if there is only one parameter ID in the PDU. Valid for All.
  244. #define AVRCP_BROWSING_ERROR_CODE_SPECIFIED_PARAMETER_NOT_FOUND 0x02 // Sent if the parameter ID is understood, but content is wrong or corrupted. Valid for All.
  245. #define AVRCP_BROWSING_ERROR_CODE_INTERNAL_ERROR 0x03 // Sent if there are error conditions not covered by a more specific error code. Valid for All.
  246. #define AVRCP_BROWSING_ERROR_CODE_SUCCESS 0x04 // This is the status that should be returned if the operation was successful. Valid for All except where the response CType is AV/C REJECTED.
  247. #define AVRCP_BROWSING_ERROR_CODE_UID_CHANGED 0x05 // The UIDs on the device have changed. Valid for All.
  248. #define AVRCP_BROWSING_ERROR_CODE_RESERVED_06 0x06 // Valid for All.
  249. #define AVRCP_BROWSING_ERROR_CODE_INVALID_DIRECTION 0x07 // The Direction parameter is invalid. Valid for Change Path.
  250. #define AVRCP_BROWSING_ERROR_CODE_NOT_A_DIRECTORY 0x08 // The UID provided does not refer to a folder item. Valid for Change Path.
  251. #define AVRCP_BROWSING_ERROR_CODE_DOES_NOT_EXIST 0x09 // The UID provided does not refer to any currently valid. Valid for Change Path, PlayItem, AddToNowPlaying, GetItemAttributes.
  252. #define AVRCP_BROWSING_ERROR_CODE_INVALID_SCOPE 0x0a // The scope parameter is invalid. Valid for GetFolderItems, PlayItem, AddToNowPlayer, GetItemAttributes,.
  253. #define AVRCP_BROWSING_ERROR_CODE_RANGE_OUT_OF_BOUNDS 0x0b // The start of range provided is not valid. Valid for GetFolderItems.
  254. #define AVRCP_BROWSING_ERROR_CODE_UID_IS_A_DIRECTORY 0x0c // The UID provided refers to a directory, which cannot be handled by this media player. Valid for PlayItem, AddToNowPlaying.
  255. #define AVRCP_BROWSING_ERROR_CODE_MEDIA_IN_USES 0x0d // The media is not able to be used for this operation at this time. Valid for PlayItem, AddToNowPlaying.
  256. #define AVRCP_BROWSING_ERROR_CODE_NOW_PLAYING_LIST_FULL 0x0e // No more items can be added to the Now Playing List. Valid for AddToNowPlaying.
  257. #define AVRCP_BROWSING_ERROR_CODE_SEARCH_NOT_SUPPORTED 0x0f // The Browsed Media Player does not support search. Valid for Search.
  258. #define AVRCP_BROWSING_ERROR_CODE_SEARCH_IN_PROGRESS 0x10 // A search operation is already in progress. Valid for Search.
  259. #define AVRCP_BROWSING_ERROR_CODE_INVALID_PLAYER_ID 0x11 // The specified Player Id does not refer to a valid player. Valid for SetAddressedPlayer, SetBrowsedPlayer.
  260. #define AVRCP_BROWSING_ERROR_CODE_PLAYER_NOT_BROWSABLE 0x12 // The Player Id supplied refers to a Media Player which does not support browsing. Valid for SetBrowsedPlayer.
  261. #define AVRCP_BROWSING_ERROR_CODE_PLAYER_NOT_ADDRESSED 0x13 // The Player Id supplied refers to a player which is not currently addressed, and the command is not able to be performed if the player is not set as addressed. Valid for Search SetBrowsedPlayer.
  262. #define AVRCP_BROWSING_ERROR_CODE_NO_VALID_SEARCH_RESULTS 0x14 // The Search result list does not contain valid entries, e.g. after being invalidated due to change of browsed player. Valid for GetFolderItems.
  263. #define AVRCP_BROWSING_ERROR_CODE_NO_AVAILABLE_PLAYERS 0x15 // Valid for All.
  264. #define AVRCP_BROWSING_ERROR_CODE_ADDRESSED_PLAYER_CHANGED 0x16 // Valid for Register Notification.
  265. // 0x17-0xff Reserved
  266. /* ENUM_END */
  267. // HCI roles
  268. typedef enum {
  269. HCI_ROLE_MASTER = 0,
  270. HCI_ROLE_SLAVE = 1,
  271. HCI_ROLE_INVALID = 0xff,
  272. } hci_role_t;
  273. // packet sizes (max payload)
  274. #define HCI_ACL_DM1_SIZE 17
  275. #define HCI_ACL_DH1_SIZE 27
  276. #define HCI_ACL_2DH1_SIZE 54
  277. #define HCI_ACL_3DH1_SIZE 83
  278. #define HCI_ACL_DM3_SIZE 121
  279. #define HCI_ACL_DH3_SIZE 183
  280. #define HCI_ACL_DM5_SIZE 224
  281. #define HCI_ACL_DH5_SIZE 339
  282. #define HCI_ACL_2DH3_SIZE 367
  283. #define HCI_ACL_3DH3_SIZE 552
  284. #define HCI_ACL_2DH5_SIZE 679
  285. #define HCI_ACL_3DH5_SIZE 1021
  286. #define LE_ADVERTISING_DATA_SIZE 31
  287. // Link Policy Settings
  288. #define LM_LINK_POLICY_DISABLE_ALL_LM_MODES 0
  289. #define LM_LINK_POLICY_ENABLE_ROLE_SWITCH 1
  290. #define LM_LINK_POLICY_ENABLE_HOLD_MODE 2
  291. #define LM_LINK_POLICY_ENABLE_SNIFF_MODE 4
  292. // ACL Connection Modes
  293. #define ACL_CONNECTION_MODE_ACTIVE 0
  294. #define ACL_CONNECTION_MODE_HOLD 1
  295. #define ACL_CONNECTION_MODE_SNIFF 2
  296. /**
  297. * Default INQ Mode
  298. */
  299. #define GAP_IAC_GENERAL_INQUIRY 0x9E8B33L // General/Unlimited Inquiry Access Code (GIAC)
  300. #define GAP_IAC_LIMITED_INQUIRY 0x9E8B00L // Limited Dedicated Inquiry Access Code (LIAC)
  301. /**
  302. * SSP IO Capabilities
  303. */
  304. #define SSP_IO_CAPABILITY_DISPLAY_ONLY 0
  305. #define SSP_IO_CAPABILITY_DISPLAY_YES_NO 1
  306. #define SSP_IO_CAPABILITY_KEYBOARD_ONLY 2
  307. #define SSP_IO_CAPABILITY_NO_INPUT_NO_OUTPUT 3
  308. #define SSP_IO_CAPABILITY_UNKNOWN 0xff
  309. /**
  310. * SSP Authentication Requirements, see IO Capability Request Reply Commmand
  311. */
  312. // Numeric comparison with automatic accept allowed.
  313. #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_NO_BONDING 0x00
  314. // Use IO Capabilities to deter- mine authentication procedure
  315. #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_NO_BONDING 0x01
  316. // Numeric compar- ison with automatic accept allowed.
  317. #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_DEDICATED_BONDING 0x02
  318. // Use IO Capabilities to determine authentication procedure
  319. #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_DEDICATED_BONDING 0x03
  320. // Numeric Compari- son with automatic accept allowed.
  321. #define SSP_IO_AUTHREQ_MITM_PROTECTION_NOT_REQUIRED_GENERAL_BONDING 0x04
  322. // Use IO capabilities to determine authentication procedure.
  323. #define SSP_IO_AUTHREQ_MITM_PROTECTION_REQUIRED_GENERAL_BONDING 0x05
  324. // OGFs
  325. #define OGF_LINK_CONTROL 0x01
  326. #define OGF_LINK_POLICY 0x02
  327. #define OGF_CONTROLLER_BASEBAND 0x03
  328. #define OGF_INFORMATIONAL_PARAMETERS 0x04
  329. #define OGF_STATUS_PARAMETERS 0x05
  330. #define OGF_TESTING 0x06
  331. #define OGF_LE_CONTROLLER 0x08
  332. #define OGF_VENDOR 0x3f
  333. /**
  334. * L2CAP Layer
  335. */
  336. #define L2CAP_HEADER_SIZE 4
  337. // minimum signaling MTU
  338. #define L2CAP_MINIMAL_MTU 48
  339. #define L2CAP_DEFAULT_MTU 672
  340. // Minimum/default MTU
  341. #define L2CAP_LE_DEFAULT_MTU 23
  342. // L2CAP Fixed Channel IDs
  343. #define L2CAP_CID_SIGNALING 0x0001
  344. #define L2CAP_CID_CONNECTIONLESS_CHANNEL 0x0002
  345. #define L2CAP_CID_ATTRIBUTE_PROTOCOL 0x0004
  346. #define L2CAP_CID_SIGNALING_LE 0x0005
  347. #define L2CAP_CID_SECURITY_MANAGER_PROTOCOL 0x0006
  348. /**
  349. * SDP Protocol
  350. */
  351. // Device Vendor ID Sources
  352. #define DEVICE_ID_VENDOR_ID_SOURCE_BLUETOOTH 0x0001
  353. #define DEVICE_ID_VENDOR_ID_SOURCE_USB 0x0002
  354. // OBEX
  355. #define SDP_vCard_2_1 0x01
  356. #define SDP_vCard_3_0 0x02
  357. #define SDP_vCal_1_0 0x03
  358. #define SDP_iCal_2_0 0x04
  359. #define SDP_vNote 0x05
  360. #define SDP_vMessage 0x06
  361. #define SDP_OBEXFileTypeAny 0xFF
  362. /**
  363. * RFCOMM Protocol
  364. */
  365. // Line Status
  366. #define LINE_STATUS_NO_ERROR 0x00
  367. #define LINE_STATUS_OVERRUN_ERROR 0x03
  368. #define LINE_STATUS_PARITY_ERORR 0x05
  369. #define LINE_STATUS_FRAMING_ERROR 0x09
  370. // Modem Status Flags
  371. #define MODEM_STATUS_FC 0x02
  372. #define MODEM_STATUS_RTC 0x04
  373. #define MODEM_STATUS_RTR 0x08
  374. #define MODEM_STATUS_IC 0x40
  375. #define MODEM_STATUS_DV 0x80
  376. typedef enum rpn_baud {
  377. RPN_BAUD_2400 = 0,
  378. RPN_BAUD_4800,
  379. RPN_BAUD_7200,
  380. RPN_BAUD_9600,
  381. RPN_BAUD_19200,
  382. RPN_BAUD_38400,
  383. RPN_BAUD_57600,
  384. RPN_BAUD_115200,
  385. RPN_BAUD_230400
  386. } rpn_baud_t;
  387. typedef enum rpn_data_bits {
  388. RPN_DATA_BITS_5 = 0,
  389. RPN_DATA_BITS_6 = 0,
  390. RPN_DATA_BITS_7 = 0,
  391. RPN_DATA_BITS_8 = 0
  392. } rpn_data_bits_t;
  393. typedef enum rpn_stop_bits {
  394. RPN_STOP_BITS_1_0 = 0,
  395. RPN_STOP_BITS_1_5
  396. } rpn_stop_bits_t;
  397. typedef enum rpn_parity {
  398. RPN_PARITY_NONE = 0,
  399. RPN_PARITY_ODD = 1,
  400. RPN_PARITY_EVEN = 3,
  401. RPN_PARITY_MARK = 5,
  402. RPN_PARITY_SPACE = 7,
  403. } rpn_parity_t;
  404. typedef enum rpn_flow_control {
  405. RPN_FLOW_CONTROL_XONXOFF_ON_INPUT = 1 << 0,
  406. RPN_FLOW_CONTROL_XONXOFF_ON_OUTPUT = 1 << 1,
  407. RPN_FLOW_CONTROL_RTR_ON_INPUT = 1 << 2,
  408. RPN_FLOW_CONTROL_RTR_ON_OUTPUT = 1 << 3,
  409. RPN_FLOW_CONTROL_RTC_ON_INPUT = 1 << 4,
  410. RPN_FLOW_CONTROL_RTC_ON_OUTPUT = 1 << 5,
  411. } rpn_flow_control_t;
  412. #define RPN_PARAM_MASK_0_BAUD 0x01
  413. #define RPN_PARAM_MASK_0_DATA_BITS 0x02
  414. #define RPN_PARAM_MASK_0_STOP_BITS 0x04
  415. #define RPN_PARAM_MASK_0_PARITY 0x08
  416. #define RPN_PARAM_MASK_0_PARITY_TYPE 0x10
  417. #define RPN_PARAM_MASK_0_XON_CHAR 0x20
  418. #define RPN_PARAM_MASK_0_XOFF_CHAR 0x40
  419. #define RPN_PARAM_MASK_0_RESERVED 0x80
  420. // @note: values are identical to rpn_flow_control_t
  421. #define RPN_PARAM_MASK_1_XONOFF_ON_INPUT 0x01
  422. #define RPN_PARAM_MASK_1_XONOFF_ON_OUTPUT 0x02
  423. #define RPN_PARAM_MASK_1_RTR_ON_INPUT 0x04
  424. #define RPN_PARAM_MASK_1_RTR_ON_OUTPUT 0x08
  425. #define RPN_PARAM_MASK_1_RTC_ON_INPUT 0x10
  426. #define RPN_PARAM_MASK_1_RTC_ON_OUTPUT 0x20
  427. #define RPN_PARAM_MASK_1_RESERVED_0 0x40
  428. #define RPN_PARAM_MASK_1_RESERVED_1 0x80
  429. /**
  430. * BNEP Protocol
  431. */
  432. #ifndef ETHER_ADDR_LEN
  433. #define ETHER_ADDR_LEN 6
  434. #endif
  435. #ifndef ETHERTYPE_VLAN
  436. #define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tag */
  437. #endif
  438. #define BNEP_MTU_MIN 1691
  439. /**
  440. * PAN Profile
  441. */
  442. typedef enum {
  443. BNEP_SECURITY_NONE = 0x0000,
  444. BNEP_SECURITY_SERVICE_LEVEL_ENFORCED,
  445. BNEP_SECURITY_802_1X
  446. } security_description_t;
  447. typedef enum {
  448. PAN_NET_ACCESS_TYPE_PSTN = 0x0000,
  449. PAN_NET_ACCESS_TYPE_ISDN,
  450. PAN_NET_ACCESS_TYPE_DSL,
  451. PAN_NET_ACCESS_TYPE_CABLE_MODEM,
  452. PAN_NET_ACCESS_TYPE_10MB_ETHERNET,
  453. PAN_NET_ACCESS_TYPE_100MB_ETHERNET,
  454. PAN_NET_ACCESS_TYPE_4MB_TOKEN_RING,
  455. PAN_NET_ACCESS_TYPE_16MB_TOKEN_RING,
  456. PAN_NET_ACCESS_TYPE_100MB_TOKEN_RING,
  457. PAN_NET_ACCESS_TYPE_FDDI,
  458. PAN_NET_ACCESS_TYPE_GSM,
  459. PAN_NET_ACCESS_TYPE_CDMA,
  460. PAN_NET_ACCESS_TYPE_GPRS,
  461. PAN_NET_ACCESS_TYPE_3G,
  462. PAN_NET_ACCESS_TYPE_CELULAR,
  463. PAN_NET_ACCESS_TYPE_OTHER = 0xFFFE,
  464. PAN_NET_ACCESS_TYPE_NONE
  465. } net_access_type_t;
  466. /**
  467. * ATT
  468. */
  469. // Minimum/default MTU
  470. #define ATT_DEFAULT_MTU 23
  471. // MARK: ATT Error Codes
  472. #define ATT_ERROR_SUCCESS 0x00
  473. #define ATT_ERROR_INVALID_HANDLE 0x01
  474. #define ATT_ERROR_READ_NOT_PERMITTED 0x02
  475. #define ATT_ERROR_WRITE_NOT_PERMITTED 0x03
  476. #define ATT_ERROR_INVALID_PDU 0x04
  477. #define ATT_ERROR_INSUFFICIENT_AUTHENTICATION 0x05
  478. #define ATT_ERROR_REQUEST_NOT_SUPPORTED 0x06
  479. #define ATT_ERROR_INVALID_OFFSET 0x07
  480. #define ATT_ERROR_INSUFFICIENT_AUTHORIZATION 0x08
  481. #define ATT_ERROR_PREPARE_QUEUE_FULL 0x09
  482. #define ATT_ERROR_ATTRIBUTE_NOT_FOUND 0x0a
  483. #define ATT_ERROR_ATTRIBUTE_NOT_LONG 0x0b
  484. #define ATT_ERROR_INSUFFICIENT_ENCRYPTION_KEY_SIZE 0x0c
  485. #define ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH 0x0d
  486. #define ATT_ERROR_UNLIKELY_ERROR 0x0e
  487. #define ATT_ERROR_INSUFFICIENT_ENCRYPTION 0x0f
  488. #define ATT_ERROR_UNSUPPORTED_GROUP_TYPE 0x10
  489. #define ATT_ERROR_INSUFFICIENT_RESOURCES 0x11
  490. // MARK: ATT Error Codes used internally by BTstack
  491. #define ATT_ERROR_HCI_DISCONNECT_RECEIVED 0x1f
  492. #define ATT_ERROR_BONDING_INFORMATION_MISSING 0x70
  493. #define ATT_ERROR_DATA_MISMATCH 0x7e
  494. #define ATT_ERROR_TIMEOUT 0x7F
  495. #define ATT_ERROR_WRITE_RESPONSE_PENDING 0x100
  496. // MARK: ATT Error Codes from Cycling Power Service spec
  497. #define CYCLING_POWER_ERROR_CODE_INAPPROPRIATE_CONNECTION_PARAMETERS 0x80
  498. #define CYCLING_POWER_ERROR_CODE_PROCEDURE_ALREADY_IN_PROGRESS 0xFE
  499. #define CYCLING_POWER_ERROR_CODE_CCC_DESCRIPTOR_IMPROPERLY_CONFIGURED 0xFD
  500. // MARK: ATT Error Codes from Cycling Speed and Cadence Service spec
  501. #define CYCLING_SPEED_AND_CADENCE_ERROR_CODE_PROCEDURE_ALREADY_IN_PROGRESS 0x80
  502. #define CYCLING_SPEED_AND_CADENCE_ERROR_CODE_CCC_DESCRIPTOR_IMPROPERLY_CONFIGURED 0x81
  503. // MARK: Attribute Property Flags
  504. #define ATT_PROPERTY_BROADCAST 0x01
  505. #define ATT_PROPERTY_READ 0x02
  506. #define ATT_PROPERTY_WRITE_WITHOUT_RESPONSE 0x04
  507. #define ATT_PROPERTY_WRITE 0x08
  508. #define ATT_PROPERTY_NOTIFY 0x10
  509. #define ATT_PROPERTY_INDICATE 0x20
  510. #define ATT_PROPERTY_AUTHENTICATED_SIGNED_WRITE 0x40
  511. #define ATT_PROPERTY_EXTENDED_PROPERTIES 0x80
  512. // MARK: Attribute Property Flag, BTstack extension
  513. // value is asked from client
  514. #define ATT_PROPERTY_DYNAMIC 0x100
  515. // Security levels
  516. #define ATT_SECURITY_NONE 0
  517. #define ATT_SECURITY_ENCRYPTED 1
  518. #define ATT_SECURITY_AUTHENTICATED 2
  519. #define ATT_SECURITY_AUTHORIZED 3
  520. #define ATT_SECURITY_AUTHENTICATED_SC 4
  521. // ATT Transaction Timeout of 30 seconds for Command/Response or Indication/Confirmation
  522. #define ATT_TRANSACTION_TIMEOUT_MS 30000
  523. #define ATT_TRANSACTION_MODE_NONE 0x0
  524. #define ATT_TRANSACTION_MODE_ACTIVE 0x1
  525. #define ATT_TRANSACTION_MODE_EXECUTE 0x2
  526. #define ATT_TRANSACTION_MODE_CANCEL 0x3
  527. #define ATT_TRANSACTION_MODE_VALIDATE 0x4
  528. // MARK: GATT UUIDs
  529. #define GATT_PRIMARY_SERVICE_UUID 0x2800
  530. #define GATT_SECONDARY_SERVICE_UUID 0x2801
  531. #define GATT_INCLUDE_SERVICE_UUID 0x2802
  532. #define GATT_CHARACTERISTICS_UUID 0x2803
  533. #define GATT_CHARACTERISTIC_EXTENDED_PROPERTIES 0x2900
  534. #define GATT_CHARACTERISTIC_USER_DESCRIPTION 0x2901
  535. #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION 0x2902
  536. #define GATT_SERVER_CHARACTERISTICS_CONFIGURATION 0x2903
  537. #define GATT_CHARACTERISTIC_PRESENTATION_FORMAT 0x2904
  538. #define GATT_CHARACTERISTIC_AGGREGATE_FORMAT 0x2905
  539. #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE 0
  540. #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION 1
  541. #define GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION 2
  542. #define GATT_CLIENT_ANY_CONNECTION 0xffff
  543. #define GATT_CLIENT_ANY_VALUE_HANDLE 0x0000
  544. // GAP Service and Characteristics
  545. #define GAP_SERVICE_UUID 0x1800
  546. #define GAP_DEVICE_NAME_UUID 0x2a00
  547. #define GAP_APPEARANCE_UUID 0x2a01
  548. #define GAP_PERIPHERAL_PRIVACY_FLAG 0x2a02
  549. #define GAP_RECONNECTION_ADDRESS_UUID 0x2a03
  550. #define GAP_PERIPHERAL_PREFERRED_CONNECTION_PARAMETERS_UUID 0x2a04
  551. #define GAP_SERVICE_CHANGED 0x2a05
  552. // Bluetooth GATT types
  553. typedef struct {
  554. uint16_t year; // 0 - year is not known; or [1582,9999]
  555. uint8_t month; // 0 - month is not known; or [1,12]
  556. uint8_t day; // 0 - day is not known; or [1,31]
  557. uint8_t hours; // [0,23]
  558. uint8_t minutes; // [0,59]
  559. uint8_t seconds; // [0,59]
  560. } gatt_date_time_t;
  561. /**
  562. * SM - LE Security Manager
  563. */
  564. // Bluetooth Spec definitions
  565. typedef enum {
  566. SM_CODE_PAIRING_REQUEST = 0X01,
  567. SM_CODE_PAIRING_RESPONSE,
  568. SM_CODE_PAIRING_CONFIRM,
  569. SM_CODE_PAIRING_RANDOM,
  570. SM_CODE_PAIRING_FAILED,
  571. SM_CODE_ENCRYPTION_INFORMATION,
  572. SM_CODE_MASTER_IDENTIFICATION,
  573. SM_CODE_IDENTITY_INFORMATION,
  574. SM_CODE_IDENTITY_ADDRESS_INFORMATION,
  575. SM_CODE_SIGNING_INFORMATION,
  576. SM_CODE_SECURITY_REQUEST,
  577. SM_CODE_PAIRING_PUBLIC_KEY,
  578. SM_CODE_PAIRING_DHKEY_CHECK,
  579. SM_CODE_KEYPRESS_NOTIFICATION,
  580. } SECURITY_MANAGER_COMMANDS;
  581. // IO Capability Values
  582. typedef enum {
  583. IO_CAPABILITY_DISPLAY_ONLY = 0,
  584. IO_CAPABILITY_DISPLAY_YES_NO,
  585. IO_CAPABILITY_KEYBOARD_ONLY,
  586. IO_CAPABILITY_NO_INPUT_NO_OUTPUT,
  587. IO_CAPABILITY_KEYBOARD_DISPLAY, // not used by secure simple pairing
  588. } io_capability_t;
  589. // Authentication requirement flags
  590. #define SM_AUTHREQ_NO_BONDING 0x00
  591. #define SM_AUTHREQ_BONDING 0x01
  592. #define SM_AUTHREQ_MITM_PROTECTION 0x04
  593. #define SM_AUTHREQ_SECURE_CONNECTION 0x08
  594. #define SM_AUTHREQ_KEYPRESS 0x10
  595. // Key distribution flags used by spec
  596. #define SM_KEYDIST_ENC_KEY 0x01
  597. #define SM_KEYDIST_ID_KEY 0x02
  598. #define SM_KEYDIST_SIGN 0x04
  599. #define SM_KEYDIST_LINK_KEY 0x08
  600. // Key distribution flags used internally
  601. #define SM_KEYDIST_FLAG_ENCRYPTION_INFORMATION 0x01
  602. #define SM_KEYDIST_FLAG_MASTER_IDENTIFICATION 0x02
  603. #define SM_KEYDIST_FLAG_IDENTITY_INFORMATION 0x04
  604. #define SM_KEYDIST_FLAG_IDENTITY_ADDRESS_INFORMATION 0x08
  605. #define SM_KEYDIST_FLAG_SIGNING_IDENTIFICATION 0x10
  606. // STK Generation Methods
  607. #define SM_STK_GENERATION_METHOD_JUST_WORKS 0x01
  608. #define SM_STK_GENERATION_METHOD_OOB 0x02
  609. #define SM_STK_GENERATION_METHOD_PASSKEY 0x04
  610. #define SM_STK_GENERATION_METHOD_NUMERIC_COMPARISON 0x08
  611. // Pairing Failed Reasons
  612. #define SM_REASON_RESERVED 0x00
  613. #define SM_REASON_PASSKEY_ENTRY_FAILED 0x01
  614. #define SM_REASON_OOB_NOT_AVAILABLE 0x02
  615. #define SM_REASON_AUTHENTHICATION_REQUIREMENTS 0x03
  616. #define SM_REASON_CONFIRM_VALUE_FAILED 0x04
  617. #define SM_REASON_PAIRING_NOT_SUPPORTED 0x05
  618. #define SM_REASON_ENCRYPTION_KEY_SIZE 0x06
  619. #define SM_REASON_COMMAND_NOT_SUPPORTED 0x07
  620. #define SM_REASON_UNSPECIFIED_REASON 0x08
  621. #define SM_REASON_REPEATED_ATTEMPTS 0x09
  622. #define SM_REASON_INVALID_PARAMETERS 0x0a
  623. #define SM_REASON_DHKEY_CHECK_FAILED 0x0b
  624. #define SM_REASON_NUMERIC_COMPARISON_FAILED 0x0c
  625. // also, invalid parameters
  626. // and reserved
  627. // Keypress Notifications
  628. #define SM_KEYPRESS_PASSKEY_ENTRY_STARTED 0x00
  629. #define SM_KEYPRESS_PASSKEY_DIGIT_ENTERED 0x01
  630. #define SM_KEYPRESS_PASSKEY_DIGIT_ERASED 0x02
  631. #define SM_KEYPRESS_PASSKEY_CLEARED 0x03
  632. #define SM_KEYPRESS_PASSKEY_ENTRY_COMPLETED 0x04
  633. #endif