mgmt.h 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * BlueZ - Bluetooth protocol stack for Linux
  4. *
  5. * Copyright (C) 2010 Nokia Corporation
  6. * Copyright (C) 2010 Marcel Holtmann <marcel@holtmann.org>
  7. *
  8. *
  9. */
  10. #ifndef __packed
  11. #define __packed __attribute__((packed))
  12. #endif
  13. #define MGMT_INDEX_NONE 0xFFFF
  14. #define MGMT_STATUS_SUCCESS 0x00
  15. #define MGMT_STATUS_UNKNOWN_COMMAND 0x01
  16. #define MGMT_STATUS_NOT_CONNECTED 0x02
  17. #define MGMT_STATUS_FAILED 0x03
  18. #define MGMT_STATUS_CONNECT_FAILED 0x04
  19. #define MGMT_STATUS_AUTH_FAILED 0x05
  20. #define MGMT_STATUS_NOT_PAIRED 0x06
  21. #define MGMT_STATUS_NO_RESOURCES 0x07
  22. #define MGMT_STATUS_TIMEOUT 0x08
  23. #define MGMT_STATUS_ALREADY_CONNECTED 0x09
  24. #define MGMT_STATUS_BUSY 0x0a
  25. #define MGMT_STATUS_REJECTED 0x0b
  26. #define MGMT_STATUS_NOT_SUPPORTED 0x0c
  27. #define MGMT_STATUS_INVALID_PARAMS 0x0d
  28. #define MGMT_STATUS_DISCONNECTED 0x0e
  29. #define MGMT_STATUS_NOT_POWERED 0x0f
  30. #define MGMT_STATUS_CANCELLED 0x10
  31. #define MGMT_STATUS_INVALID_INDEX 0x11
  32. #define MGMT_STATUS_RFKILLED 0x12
  33. #define MGMT_STATUS_ALREADY_PAIRED 0x13
  34. #define MGMT_STATUS_PERMISSION_DENIED 0x14
  35. struct mgmt_hdr {
  36. uint16_t opcode;
  37. uint16_t index;
  38. uint16_t len;
  39. } __packed;
  40. #define MGMT_HDR_SIZE 6
  41. struct mgmt_tlv {
  42. uint16_t type;
  43. uint8_t length;
  44. uint8_t value[];
  45. } __packed;
  46. struct mgmt_addr_info {
  47. bdaddr_t bdaddr;
  48. uint8_t type;
  49. } __packed;
  50. #define MGMT_OP_READ_VERSION 0x0001
  51. struct mgmt_rp_read_version {
  52. uint8_t version;
  53. uint16_t revision;
  54. } __packed;
  55. #define MGMT_OP_READ_COMMANDS 0x0002
  56. struct mgmt_rp_read_commands {
  57. uint16_t num_commands;
  58. uint16_t num_events;
  59. uint16_t opcodes[0];
  60. } __packed;
  61. #define MGMT_OP_READ_INDEX_LIST 0x0003
  62. struct mgmt_rp_read_index_list {
  63. uint16_t num_controllers;
  64. uint16_t index[0];
  65. } __packed;
  66. /* Reserve one extra byte for names in management messages so that they
  67. * are always guaranteed to be nul-terminated */
  68. #define MGMT_MAX_NAME_LENGTH (248 + 1)
  69. #define MGMT_MAX_SHORT_NAME_LENGTH (10 + 1)
  70. #define MGMT_SETTING_POWERED 0x00000001
  71. #define MGMT_SETTING_CONNECTABLE 0x00000002
  72. #define MGMT_SETTING_FAST_CONNECTABLE 0x00000004
  73. #define MGMT_SETTING_DISCOVERABLE 0x00000008
  74. #define MGMT_SETTING_BONDABLE 0x00000010
  75. #define MGMT_SETTING_LINK_SECURITY 0x00000020
  76. #define MGMT_SETTING_SSP 0x00000040
  77. #define MGMT_SETTING_BREDR 0x00000080
  78. #define MGMT_SETTING_HS 0x00000100
  79. #define MGMT_SETTING_LE 0x00000200
  80. #define MGMT_SETTING_ADVERTISING 0x00000400
  81. #define MGMT_SETTING_SECURE_CONN 0x00000800
  82. #define MGMT_SETTING_DEBUG_KEYS 0x00001000
  83. #define MGMT_SETTING_PRIVACY 0x00002000
  84. #define MGMT_SETTING_CONFIGURATION 0x00004000
  85. #define MGMT_SETTING_STATIC_ADDRESS 0x00008000
  86. #define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
  87. #define MGMT_SETTING_WIDEBAND_SPEECH 0x00020000
  88. #define MGMT_OP_READ_INFO 0x0004
  89. struct mgmt_rp_read_info {
  90. bdaddr_t bdaddr;
  91. uint8_t version;
  92. uint16_t manufacturer;
  93. uint32_t supported_settings;
  94. uint32_t current_settings;
  95. uint8_t dev_class[3];
  96. uint8_t name[MGMT_MAX_NAME_LENGTH];
  97. uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
  98. } __packed;
  99. struct mgmt_mode {
  100. uint8_t val;
  101. } __packed;
  102. struct mgmt_cod {
  103. uint8_t val[3];
  104. } __packed;
  105. #define MGMT_OP_SET_POWERED 0x0005
  106. #define MGMT_OP_SET_DISCOVERABLE 0x0006
  107. struct mgmt_cp_set_discoverable {
  108. uint8_t val;
  109. uint16_t timeout;
  110. } __packed;
  111. #define MGMT_OP_SET_CONNECTABLE 0x0007
  112. #define MGMT_OP_SET_FAST_CONNECTABLE 0x0008
  113. #define MGMT_OP_SET_BONDABLE 0x0009
  114. #define MGMT_OP_SET_LINK_SECURITY 0x000A
  115. #define MGMT_OP_SET_SSP 0x000B
  116. #define MGMT_OP_SET_HS 0x000C
  117. #define MGMT_OP_SET_LE 0x000D
  118. #define MGMT_OP_SET_DEV_CLASS 0x000E
  119. struct mgmt_cp_set_dev_class {
  120. uint8_t major;
  121. uint8_t minor;
  122. } __packed;
  123. #define MGMT_OP_SET_LOCAL_NAME 0x000F
  124. struct mgmt_cp_set_local_name {
  125. uint8_t name[MGMT_MAX_NAME_LENGTH];
  126. uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
  127. } __packed;
  128. #define MGMT_OP_ADD_UUID 0x0010
  129. struct mgmt_cp_add_uuid {
  130. uint8_t uuid[16];
  131. uint8_t svc_hint;
  132. } __packed;
  133. #define MGMT_OP_REMOVE_UUID 0x0011
  134. struct mgmt_cp_remove_uuid {
  135. uint8_t uuid[16];
  136. } __packed;
  137. struct mgmt_link_key_info {
  138. struct mgmt_addr_info addr;
  139. uint8_t type;
  140. uint8_t val[16];
  141. uint8_t pin_len;
  142. } __packed;
  143. #define MGMT_OP_LOAD_LINK_KEYS 0x0012
  144. struct mgmt_cp_load_link_keys {
  145. uint8_t debug_keys;
  146. uint16_t key_count;
  147. struct mgmt_link_key_info keys[0];
  148. } __packed;
  149. struct mgmt_ltk_info {
  150. struct mgmt_addr_info addr;
  151. uint8_t type;
  152. uint8_t central;
  153. uint8_t enc_size;
  154. uint16_t ediv;
  155. uint64_t rand;
  156. uint8_t val[16];
  157. } __packed;
  158. #define MGMT_OP_LOAD_LONG_TERM_KEYS 0x0013
  159. struct mgmt_cp_load_long_term_keys {
  160. uint16_t key_count;
  161. struct mgmt_ltk_info keys[0];
  162. } __packed;
  163. #define MGMT_OP_DISCONNECT 0x0014
  164. struct mgmt_cp_disconnect {
  165. struct mgmt_addr_info addr;
  166. } __packed;
  167. struct mgmt_rp_disconnect {
  168. struct mgmt_addr_info addr;
  169. } __packed;
  170. #define MGMT_OP_GET_CONNECTIONS 0x0015
  171. struct mgmt_rp_get_connections {
  172. uint16_t conn_count;
  173. struct mgmt_addr_info addr[0];
  174. } __packed;
  175. #define MGMT_OP_PIN_CODE_REPLY 0x0016
  176. struct mgmt_cp_pin_code_reply {
  177. struct mgmt_addr_info addr;
  178. uint8_t pin_len;
  179. uint8_t pin_code[16];
  180. } __packed;
  181. #define MGMT_OP_PIN_CODE_NEG_REPLY 0x0017
  182. struct mgmt_cp_pin_code_neg_reply {
  183. struct mgmt_addr_info addr;
  184. } __packed;
  185. #define MGMT_OP_SET_IO_CAPABILITY 0x0018
  186. struct mgmt_cp_set_io_capability {
  187. uint8_t io_capability;
  188. } __packed;
  189. #define MGMT_OP_PAIR_DEVICE 0x0019
  190. struct mgmt_cp_pair_device {
  191. struct mgmt_addr_info addr;
  192. uint8_t io_cap;
  193. } __packed;
  194. struct mgmt_rp_pair_device {
  195. struct mgmt_addr_info addr;
  196. } __packed;
  197. #define MGMT_OP_CANCEL_PAIR_DEVICE 0x001A
  198. #define MGMT_OP_UNPAIR_DEVICE 0x001B
  199. struct mgmt_cp_unpair_device {
  200. struct mgmt_addr_info addr;
  201. uint8_t disconnect;
  202. } __packed;
  203. struct mgmt_rp_unpair_device {
  204. struct mgmt_addr_info addr;
  205. } __packed;
  206. #define MGMT_OP_USER_CONFIRM_REPLY 0x001C
  207. struct mgmt_cp_user_confirm_reply {
  208. struct mgmt_addr_info addr;
  209. } __packed;
  210. struct mgmt_rp_user_confirm_reply {
  211. struct mgmt_addr_info addr;
  212. } __packed;
  213. #define MGMT_OP_USER_CONFIRM_NEG_REPLY 0x001D
  214. #define MGMT_OP_USER_PASSKEY_REPLY 0x001E
  215. struct mgmt_cp_user_passkey_reply {
  216. struct mgmt_addr_info addr;
  217. uint32_t passkey;
  218. } __packed;
  219. struct mgmt_rp_user_passkey_reply {
  220. struct mgmt_addr_info addr;
  221. } __packed;
  222. #define MGMT_OP_USER_PASSKEY_NEG_REPLY 0x001F
  223. struct mgmt_cp_user_passkey_neg_reply {
  224. struct mgmt_addr_info addr;
  225. } __packed;
  226. #define MGMT_OP_READ_LOCAL_OOB_DATA 0x0020
  227. struct mgmt_rp_read_local_oob_data {
  228. uint8_t hash192[16];
  229. uint8_t rand192[16];
  230. uint8_t hash256[16];
  231. uint8_t rand256[16];
  232. } __packed;
  233. #define MGMT_OP_ADD_REMOTE_OOB_DATA 0x0021
  234. struct mgmt_cp_add_remote_oob_data {
  235. struct mgmt_addr_info addr;
  236. uint8_t hash192[16];
  237. uint8_t rand192[16];
  238. uint8_t hash256[16];
  239. uint8_t rand256[16];
  240. } __packed;
  241. #define MGMT_OP_REMOVE_REMOTE_OOB_DATA 0x0022
  242. struct mgmt_cp_remove_remote_oob_data {
  243. struct mgmt_addr_info addr;
  244. } __packed;
  245. #define MGMT_OP_START_DISCOVERY 0x0023
  246. struct mgmt_cp_start_discovery {
  247. uint8_t type;
  248. } __packed;
  249. #define MGMT_OP_STOP_DISCOVERY 0x0024
  250. struct mgmt_cp_stop_discovery {
  251. uint8_t type;
  252. } __packed;
  253. #define MGMT_OP_CONFIRM_NAME 0x0025
  254. struct mgmt_cp_confirm_name {
  255. struct mgmt_addr_info addr;
  256. uint8_t name_known;
  257. } __packed;
  258. struct mgmt_rp_confirm_name {
  259. struct mgmt_addr_info addr;
  260. } __packed;
  261. #define MGMT_OP_BLOCK_DEVICE 0x0026
  262. struct mgmt_cp_block_device {
  263. struct mgmt_addr_info addr;
  264. } __packed;
  265. #define MGMT_OP_UNBLOCK_DEVICE 0x0027
  266. struct mgmt_cp_unblock_device {
  267. struct mgmt_addr_info addr;
  268. } __packed;
  269. #define MGMT_OP_SET_DEVICE_ID 0x0028
  270. struct mgmt_cp_set_device_id {
  271. uint16_t source;
  272. uint16_t vendor;
  273. uint16_t product;
  274. uint16_t version;
  275. } __packed;
  276. #define MGMT_OP_SET_ADVERTISING 0x0029
  277. #define MGMT_OP_SET_BREDR 0x002A
  278. #define MGMT_OP_SET_STATIC_ADDRESS 0x002B
  279. struct mgmt_cp_set_static_address {
  280. bdaddr_t bdaddr;
  281. } __packed;
  282. #define MGMT_OP_SET_SCAN_PARAMS 0x002C
  283. struct mgmt_cp_set_scan_params {
  284. uint16_t interval;
  285. uint16_t window;
  286. } __packed;
  287. #define MGMT_OP_SET_SECURE_CONN 0x002D
  288. #define MGMT_OP_SET_DEBUG_KEYS 0x002E
  289. struct mgmt_irk_info {
  290. struct mgmt_addr_info addr;
  291. uint8_t val[16];
  292. } __packed;
  293. #define MGMT_OP_SET_PRIVACY 0x002F
  294. struct mgmt_cp_set_privacy {
  295. uint8_t privacy;
  296. uint8_t irk[16];
  297. } __packed;
  298. #define MGMT_OP_LOAD_IRKS 0x0030
  299. struct mgmt_cp_load_irks {
  300. uint16_t irk_count;
  301. struct mgmt_irk_info irks[0];
  302. } __packed;
  303. #define MGMT_OP_GET_CONN_INFO 0x0031
  304. struct mgmt_cp_get_conn_info {
  305. struct mgmt_addr_info addr;
  306. } __packed;
  307. struct mgmt_rp_get_conn_info {
  308. struct mgmt_addr_info addr;
  309. int8_t rssi;
  310. int8_t tx_power;
  311. int8_t max_tx_power;
  312. } __packed;
  313. #define MGMT_OP_GET_CLOCK_INFO 0x0032
  314. struct mgmt_cp_get_clock_info {
  315. struct mgmt_addr_info addr;
  316. } __packed;
  317. struct mgmt_rp_get_clock_info {
  318. struct mgmt_addr_info addr;
  319. uint32_t local_clock;
  320. uint32_t piconet_clock;
  321. uint16_t accuracy;
  322. } __packed;
  323. #define MGMT_OP_ADD_DEVICE 0x0033
  324. struct mgmt_cp_add_device {
  325. struct mgmt_addr_info addr;
  326. uint8_t action;
  327. } __packed;
  328. struct mgmt_rp_add_device {
  329. struct mgmt_addr_info addr;
  330. } __packed;
  331. #define MGMT_OP_REMOVE_DEVICE 0x0034
  332. struct mgmt_cp_remove_device {
  333. struct mgmt_addr_info addr;
  334. } __packed;
  335. struct mgmt_rp_remove_device {
  336. struct mgmt_addr_info addr;
  337. } __packed;
  338. struct mgmt_conn_param {
  339. struct mgmt_addr_info addr;
  340. uint16_t min_interval;
  341. uint16_t max_interval;
  342. uint16_t latency;
  343. uint16_t timeout;
  344. } __packed;
  345. #define MGMT_OP_LOAD_CONN_PARAM 0x0035
  346. struct mgmt_cp_load_conn_param {
  347. uint16_t param_count;
  348. struct mgmt_conn_param params[0];
  349. } __packed;
  350. #define MGMT_OP_READ_UNCONF_INDEX_LIST 0x0036
  351. struct mgmt_rp_read_unconf_index_list {
  352. uint16_t num_controllers;
  353. uint16_t index[0];
  354. } __packed;
  355. #define MGMT_OPTION_EXTERNAL_CONFIG 0x00000001
  356. #define MGMT_OPTION_PUBLIC_ADDRESS 0x00000002
  357. #define MGMT_OP_READ_CONFIG_INFO 0x0037
  358. struct mgmt_rp_read_config_info {
  359. uint16_t manufacturer;
  360. uint32_t supported_options;
  361. uint32_t missing_options;
  362. } __packed;
  363. #define MGMT_OP_SET_EXTERNAL_CONFIG 0x0038
  364. struct mgmt_cp_set_external_config {
  365. uint8_t config;
  366. } __packed;
  367. #define MGMT_OP_SET_PUBLIC_ADDRESS 0x0039
  368. struct mgmt_cp_set_public_address {
  369. bdaddr_t bdaddr;
  370. } __packed;
  371. #define MGMT_OP_START_SERVICE_DISCOVERY 0x003A
  372. struct mgmt_cp_start_service_discovery {
  373. uint8_t type;
  374. int8_t rssi;
  375. uint16_t uuid_count;
  376. uint8_t uuids[0][16];
  377. } __packed;
  378. #define MGMT_OP_READ_LOCAL_OOB_EXT_DATA 0x003B
  379. struct mgmt_cp_read_local_oob_ext_data {
  380. uint8_t type;
  381. } __packed;
  382. struct mgmt_rp_read_local_oob_ext_data {
  383. uint8_t type;
  384. uint16_t eir_len;
  385. uint8_t eir[0];
  386. } __packed;
  387. #define MGMT_OP_READ_EXT_INDEX_LIST 0x003C
  388. struct mgmt_rp_read_ext_index_list {
  389. uint16_t num_controllers;
  390. struct {
  391. uint16_t index;
  392. uint8_t type;
  393. uint8_t bus;
  394. } entry[0];
  395. } __packed;
  396. #define MGMT_OP_READ_ADV_FEATURES 0x003D
  397. struct mgmt_rp_read_adv_features {
  398. uint32_t supported_flags;
  399. uint8_t max_adv_data_len;
  400. uint8_t max_scan_rsp_len;
  401. uint8_t max_instances;
  402. uint8_t num_instances;
  403. uint8_t instance[0];
  404. } __packed;
  405. #define MGMT_OP_ADD_ADVERTISING 0x003E
  406. struct mgmt_cp_add_advertising {
  407. uint8_t instance;
  408. uint32_t flags;
  409. uint16_t duration;
  410. uint16_t timeout;
  411. uint8_t adv_data_len;
  412. uint8_t scan_rsp_len;
  413. uint8_t data[0];
  414. } __packed;
  415. struct mgmt_rp_add_advertising {
  416. uint8_t instance;
  417. } __packed;
  418. #define MGMT_ADV_FLAG_CONNECTABLE (1 << 0)
  419. #define MGMT_ADV_FLAG_DISCOV (1 << 1)
  420. #define MGMT_ADV_FLAG_LIMITED_DISCOV (1 << 2)
  421. #define MGMT_ADV_FLAG_MANAGED_FLAGS (1 << 3)
  422. #define MGMT_ADV_FLAG_TX_POWER (1 << 4)
  423. #define MGMT_ADV_FLAG_APPEARANCE (1 << 5)
  424. #define MGMT_ADV_FLAG_LOCAL_NAME (1 << 6)
  425. #define MGMT_ADV_FLAG_SEC_1M (1 << 7)
  426. #define MGMT_ADV_FLAG_SEC_2M (1 << 8)
  427. #define MGMT_ADV_FLAG_SEC_CODED (1 << 9)
  428. #define MGMT_ADV_FLAG_CAN_SET_TX_POWER (1 << 10)
  429. #define MGMT_ADV_FLAG_HW_OFFLOAD (1 << 11)
  430. #define MGMT_ADV_PARAM_DURATION (1 << 12)
  431. #define MGMT_ADV_PARAM_TIMEOUT (1 << 13)
  432. #define MGMT_ADV_PARAM_INTERVALS (1 << 14)
  433. #define MGMT_ADV_PARAM_TX_POWER (1 << 15)
  434. #define MGMT_ADV_PARAM_SCAN_RSP (1 << 16)
  435. #define MGMT_OP_REMOVE_ADVERTISING 0x003F
  436. struct mgmt_cp_remove_advertising {
  437. uint8_t instance;
  438. } __packed;
  439. #define MGMT_REMOVE_ADVERTISING_SIZE 1
  440. struct mgmt_rp_remove_advertising {
  441. uint8_t instance;
  442. } __packed;
  443. #define MGMT_OP_GET_ADV_SIZE_INFO 0x0040
  444. struct mgmt_cp_get_adv_size_info {
  445. uint8_t instance;
  446. uint32_t flags;
  447. } __packed;
  448. #define MGMT_GET_ADV_SIZE_INFO_SIZE 5
  449. struct mgmt_rp_get_adv_size_info {
  450. uint8_t instance;
  451. uint32_t flags;
  452. uint8_t max_adv_data_len;
  453. uint8_t max_scan_rsp_len;
  454. } __packed;
  455. #define MGMT_OP_START_LIMITED_DISCOVERY 0x0041
  456. #define MGMT_OP_READ_EXT_INFO 0x0042
  457. struct mgmt_rp_read_ext_info {
  458. bdaddr_t bdaddr;
  459. uint8_t version;
  460. uint16_t manufacturer;
  461. uint32_t supported_settings;
  462. uint32_t current_settings;
  463. uint16_t eir_len;
  464. uint8_t eir[0];
  465. } __packed;
  466. #define MGMT_OP_SET_APPEARANCE 0x0043
  467. struct mgmt_cp_set_appearance {
  468. uint16_t appearance;
  469. } __packed;
  470. #define MGMT_OP_GET_PHY_CONFIGURATION 0x0044
  471. struct mgmt_rp_get_phy_confguration {
  472. uint32_t supported_phys;
  473. uint32_t configurable_phys;
  474. uint32_t selected_phys;
  475. } __packed;
  476. #define MGMT_PHY_BR_1M_1SLOT 0x00000001
  477. #define MGMT_PHY_BR_1M_3SLOT 0x00000002
  478. #define MGMT_PHY_BR_1M_5SLOT 0x00000004
  479. #define MGMT_PHY_EDR_2M_1SLOT 0x00000008
  480. #define MGMT_PHY_EDR_2M_3SLOT 0x00000010
  481. #define MGMT_PHY_EDR_2M_5SLOT 0x00000020
  482. #define MGMT_PHY_EDR_3M_1SLOT 0x00000040
  483. #define MGMT_PHY_EDR_3M_3SLOT 0x00000080
  484. #define MGMT_PHY_EDR_3M_5SLOT 0x00000100
  485. #define MGMT_PHY_LE_1M_TX 0x00000200
  486. #define MGMT_PHY_LE_1M_RX 0x00000400
  487. #define MGMT_PHY_LE_2M_TX 0x00000800
  488. #define MGMT_PHY_LE_2M_RX 0x00001000
  489. #define MGMT_PHY_LE_CODED_TX 0x00002000
  490. #define MGMT_PHY_LE_CODED_RX 0x00004000
  491. #define MGMT_PHY_LE_TX_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_2M_TX | \
  492. MGMT_PHY_LE_CODED_TX)
  493. #define MGMT_PHY_LE_RX_MASK (MGMT_PHY_LE_1M_RX | MGMT_PHY_LE_2M_RX | \
  494. MGMT_PHY_LE_CODED_RX)
  495. #define MGMT_OP_SET_PHY_CONFIGURATION 0x0045
  496. struct mgmt_cp_set_phy_confguration {
  497. uint32_t selected_phys;
  498. } __packed;
  499. #define MGMT_OP_SET_BLOCKED_KEYS 0x0046
  500. #define MGMT_OP_SET_WIDEBAND_SPEECH 0x0047
  501. #define HCI_BLOCKED_KEY_TYPE_LINKKEY 0x00
  502. #define HCI_BLOCKED_KEY_TYPE_LTK 0x01
  503. #define HCI_BLOCKED_KEY_TYPE_IRK 0x02
  504. struct mgmt_blocked_key_info {
  505. uint8_t type;
  506. uint8_t val[16];
  507. } __packed;
  508. struct mgmt_cp_set_blocked_keys {
  509. uint16_t key_count;
  510. struct mgmt_blocked_key_info keys[0];
  511. } __packed;
  512. #define MGMT_CAP_SEC_FLAGS 0x01
  513. #define MGMT_CAP_MAX_ENC_KEY_SIZE 0x02
  514. #define MGMT_CAP_SMP_MAX_ENC_KEY_SIZE 0x03
  515. #define MGMT_CAP_LE_TX_PWR 0x04
  516. #define MGMT_OP_READ_CONTROLLER_CAP 0x0048
  517. #define MGMT_READ_CONTROLLER_CAP_SIZE 0
  518. struct mgmt_rp_read_controller_cap {
  519. uint16_t cap_len;
  520. uint8_t cap[0];
  521. } __packed;
  522. #define MGMT_OP_READ_EXP_FEATURES_INFO 0x0049
  523. struct mgmt_rp_read_exp_features_info {
  524. uint16_t feature_count;
  525. struct {
  526. uint8_t uuid[16];
  527. uint32_t flags;
  528. } features[];
  529. } __packed;
  530. #define MGMT_OP_SET_EXP_FEATURE 0x004a
  531. struct mgmt_cp_set_exp_feature {
  532. uint8_t uuid[16];
  533. uint8_t action;
  534. } __packed;
  535. #define MGMT_SET_EXP_FEATURE_SIZE 17
  536. struct mgmt_rp_set_exp_feature {
  537. uint8_t uuid[16];
  538. uint32_t flags;
  539. } __packed;
  540. #define MGMT_OP_READ_DEF_SYSTEM_CONFIG 0x004b
  541. struct mgmt_rp_read_default_system_config {
  542. uint8_t parameters[0]; /* mgmt_tlv */
  543. } __packed;
  544. #define MGMT_OP_SET_DEF_SYSTEM_CONFIG 0x004c
  545. struct mgmt_cp_set_default_system_config {
  546. uint8_t parameters[0]; /* mgmt_tlv */
  547. } __packed;
  548. #define MGMT_OP_READ_DEF_RUNTIME_CONFIG 0x004d
  549. struct mgmt_rp_read_default_runtime_config {
  550. uint8_t parameters[0]; /* mgmt_tlv */
  551. } __packed;
  552. #define MGMT_OP_SET_DEF_RUNTIME_CONFIG 0x004e
  553. struct mgmt_cp_set_default_runtime_config {
  554. uint8_t parameters[0]; /* mgmt_tlv */
  555. } __packed;
  556. #define MGMT_OP_GET_DEVICE_FLAGS 0x004F
  557. #define MGMT_GET_DEVICE_FLAGS_SIZE 7
  558. struct mgmt_cp_get_device_flags {
  559. struct mgmt_addr_info addr;
  560. } __packed;
  561. struct mgmt_rp_get_device_flags {
  562. struct mgmt_addr_info addr;
  563. uint32_t supported_flags;
  564. uint32_t current_flags;
  565. } __packed;
  566. #define DEVICE_FLAG_REMOTE_WAKEUP (1 << 0)
  567. #define MGMT_OP_SET_DEVICE_FLAGS 0x0050
  568. #define MGMT_SET_DEVICE_FLAGS_SIZE 11
  569. struct mgmt_cp_set_device_flags {
  570. struct mgmt_addr_info addr;
  571. uint32_t current_flags;
  572. } __packed;
  573. struct mgmt_rp_set_device_flags {
  574. struct mgmt_addr_info addr;
  575. } __packed;
  576. #define MGMT_ADV_MONITOR_FEATURE_MASK_OR_PATTERNS (1 << 0)
  577. #define MGMT_OP_READ_ADV_MONITOR_FEATURES 0x0051
  578. struct mgmt_rp_read_adv_monitor_features {
  579. uint32_t supported_features;
  580. uint32_t enabled_features;
  581. uint16_t max_num_handles;
  582. uint8_t max_num_patterns;
  583. uint16_t num_handles;
  584. uint16_t handles[0];
  585. } __packed;
  586. struct mgmt_adv_pattern {
  587. uint8_t ad_type;
  588. uint8_t offset;
  589. uint8_t length;
  590. uint8_t value[31];
  591. } __packed;
  592. #define MGMT_OP_ADD_ADV_PATTERNS_MONITOR 0x0052
  593. struct mgmt_cp_add_adv_monitor {
  594. uint8_t pattern_count;
  595. struct mgmt_adv_pattern patterns[0];
  596. } __packed;
  597. struct mgmt_rp_add_adv_patterns_monitor {
  598. uint16_t monitor_handle;
  599. } __packed;
  600. #define MGMT_OP_REMOVE_ADV_MONITOR 0x0053
  601. struct mgmt_cp_remove_adv_monitor {
  602. uint16_t monitor_handle;
  603. } __packed;
  604. struct mgmt_rp_remove_adv_monitor {
  605. uint16_t monitor_handle;
  606. } __packed;
  607. #define MGMT_OP_ADD_EXT_ADV_PARAMS 0x0054
  608. struct mgmt_cp_add_ext_adv_params {
  609. uint8_t instance;
  610. uint32_t flags;
  611. uint16_t duration;
  612. uint16_t timeout;
  613. uint32_t min_interval;
  614. uint32_t max_interval;
  615. int8_t tx_power;
  616. } __packed;
  617. struct mgmt_rp_add_ext_adv_params {
  618. uint8_t instance;
  619. int8_t tx_power;
  620. uint8_t max_adv_data_len;
  621. uint8_t max_scan_rsp_len;
  622. } __packed;
  623. #define MGMT_OP_ADD_EXT_ADV_DATA 0x0055
  624. struct mgmt_cp_add_ext_adv_data {
  625. uint8_t instance;
  626. uint8_t adv_data_len;
  627. uint8_t scan_rsp_len;
  628. uint8_t data[0];
  629. } __packed;
  630. struct mgmt_rp_add_ext_adv_data {
  631. uint8_t instance;
  632. } __packed;
  633. struct mgmt_adv_rssi_thresholds {
  634. int8_t high_threshold;
  635. uint16_t high_threshold_timeout;
  636. int8_t low_threshold;
  637. uint16_t low_threshold_timeout;
  638. uint8_t sampling_period;
  639. } __packed;
  640. #define MGMT_OP_ADD_ADV_PATTERNS_MONITOR_RSSI 0x0056
  641. struct mgmt_cp_add_adv_patterns_monitor_rssi {
  642. struct mgmt_adv_rssi_thresholds rssi;
  643. uint8_t pattern_count;
  644. struct mgmt_adv_pattern patterns[0];
  645. } __packed;
  646. #define MGMT_EV_CMD_COMPLETE 0x0001
  647. struct mgmt_ev_cmd_complete {
  648. uint16_t opcode;
  649. uint8_t status;
  650. uint8_t data[0];
  651. } __packed;
  652. #define MGMT_EV_CMD_STATUS 0x0002
  653. struct mgmt_ev_cmd_status {
  654. uint16_t opcode;
  655. uint8_t status;
  656. } __packed;
  657. #define MGMT_EV_CONTROLLER_ERROR 0x0003
  658. struct mgmt_ev_controller_error {
  659. uint8_t error_code;
  660. } __packed;
  661. #define MGMT_EV_INDEX_ADDED 0x0004
  662. #define MGMT_EV_INDEX_REMOVED 0x0005
  663. #define MGMT_EV_NEW_SETTINGS 0x0006
  664. #define MGMT_EV_CLASS_OF_DEV_CHANGED 0x0007
  665. struct mgmt_ev_class_of_dev_changed {
  666. uint8_t dev_class[3];
  667. } __packed;
  668. #define MGMT_EV_LOCAL_NAME_CHANGED 0x0008
  669. struct mgmt_ev_local_name_changed {
  670. uint8_t name[MGMT_MAX_NAME_LENGTH];
  671. uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
  672. } __packed;
  673. #define MGMT_EV_NEW_LINK_KEY 0x0009
  674. struct mgmt_ev_new_link_key {
  675. uint8_t store_hint;
  676. struct mgmt_link_key_info key;
  677. } __packed;
  678. #define MGMT_EV_NEW_LONG_TERM_KEY 0x000A
  679. struct mgmt_ev_new_long_term_key {
  680. uint8_t store_hint;
  681. struct mgmt_ltk_info key;
  682. } __packed;
  683. #define MGMT_EV_DEVICE_CONNECTED 0x000B
  684. struct mgmt_ev_device_connected {
  685. struct mgmt_addr_info addr;
  686. uint32_t flags;
  687. uint16_t eir_len;
  688. uint8_t eir[0];
  689. } __packed;
  690. #define MGMT_DEV_DISCONN_UNKNOWN 0x00
  691. #define MGMT_DEV_DISCONN_TIMEOUT 0x01
  692. #define MGMT_DEV_DISCONN_LOCAL_HOST 0x02
  693. #define MGMT_DEV_DISCONN_REMOTE 0x03
  694. #define MGMT_DEV_DISCONN_LOCAL_HOST_SUSPEND 0x05
  695. #define MGMT_EV_DEVICE_DISCONNECTED 0x000C
  696. struct mgmt_ev_device_disconnected {
  697. struct mgmt_addr_info addr;
  698. uint8_t reason;
  699. } __packed;
  700. #define MGMT_EV_CONNECT_FAILED 0x000D
  701. struct mgmt_ev_connect_failed {
  702. struct mgmt_addr_info addr;
  703. uint8_t status;
  704. } __packed;
  705. #define MGMT_EV_PIN_CODE_REQUEST 0x000E
  706. struct mgmt_ev_pin_code_request {
  707. struct mgmt_addr_info addr;
  708. uint8_t secure;
  709. } __packed;
  710. #define MGMT_EV_USER_CONFIRM_REQUEST 0x000F
  711. struct mgmt_ev_user_confirm_request {
  712. struct mgmt_addr_info addr;
  713. uint8_t confirm_hint;
  714. uint32_t value;
  715. } __packed;
  716. #define MGMT_EV_USER_PASSKEY_REQUEST 0x0010
  717. struct mgmt_ev_user_passkey_request {
  718. struct mgmt_addr_info addr;
  719. } __packed;
  720. #define MGMT_EV_AUTH_FAILED 0x0011
  721. struct mgmt_ev_auth_failed {
  722. struct mgmt_addr_info addr;
  723. uint8_t status;
  724. } __packed;
  725. #define MGMT_DEV_FOUND_CONFIRM_NAME 0x01
  726. #define MGMT_DEV_FOUND_LEGACY_PAIRING 0x02
  727. #define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04
  728. #define MGMT_EV_DEVICE_FOUND 0x0012
  729. struct mgmt_ev_device_found {
  730. struct mgmt_addr_info addr;
  731. int8_t rssi;
  732. uint32_t flags;
  733. uint16_t eir_len;
  734. uint8_t eir[0];
  735. } __packed;
  736. #define MGMT_EV_DISCOVERING 0x0013
  737. struct mgmt_ev_discovering {
  738. uint8_t type;
  739. uint8_t discovering;
  740. } __packed;
  741. #define MGMT_EV_DEVICE_BLOCKED 0x0014
  742. struct mgmt_ev_device_blocked {
  743. struct mgmt_addr_info addr;
  744. } __packed;
  745. #define MGMT_EV_DEVICE_UNBLOCKED 0x0015
  746. struct mgmt_ev_device_unblocked {
  747. struct mgmt_addr_info addr;
  748. } __packed;
  749. #define MGMT_EV_DEVICE_UNPAIRED 0x0016
  750. struct mgmt_ev_device_unpaired {
  751. struct mgmt_addr_info addr;
  752. } __packed;
  753. #define MGMT_EV_PASSKEY_NOTIFY 0x0017
  754. struct mgmt_ev_passkey_notify {
  755. struct mgmt_addr_info addr;
  756. uint32_t passkey;
  757. uint8_t entered;
  758. } __packed;
  759. #define MGMT_EV_NEW_IRK 0x0018
  760. struct mgmt_ev_new_irk {
  761. uint8_t store_hint;
  762. bdaddr_t rpa;
  763. struct mgmt_irk_info key;
  764. } __packed;
  765. struct mgmt_csrk_info {
  766. struct mgmt_addr_info addr;
  767. uint8_t type;
  768. uint8_t val[16];
  769. } __packed;
  770. #define MGMT_EV_NEW_CSRK 0x0019
  771. struct mgmt_ev_new_csrk {
  772. uint8_t store_hint;
  773. struct mgmt_csrk_info key;
  774. } __packed;
  775. #define MGMT_EV_DEVICE_ADDED 0x001a
  776. struct mgmt_ev_device_added {
  777. struct mgmt_addr_info addr;
  778. uint8_t action;
  779. } __packed;
  780. #define MGMT_EV_DEVICE_REMOVED 0x001b
  781. struct mgmt_ev_device_removed {
  782. struct mgmt_addr_info addr;
  783. } __packed;
  784. #define MGMT_EV_NEW_CONN_PARAM 0x001c
  785. struct mgmt_ev_new_conn_param {
  786. struct mgmt_addr_info addr;
  787. uint8_t store_hint;
  788. uint16_t min_interval;
  789. uint16_t max_interval;
  790. uint16_t latency;
  791. uint16_t timeout;
  792. } __packed;
  793. #define MGMT_EV_UNCONF_INDEX_ADDED 0x001d
  794. #define MGMT_EV_UNCONF_INDEX_REMOVED 0x001e
  795. #define MGMT_EV_NEW_CONFIG_OPTIONS 0x001f
  796. #define MGMT_EV_EXT_INDEX_ADDED 0x0020
  797. struct mgmt_ev_ext_index_added {
  798. uint8_t type;
  799. uint8_t bus;
  800. } __packed;
  801. #define MGMT_EV_EXT_INDEX_REMOVED 0x0021
  802. struct mgmt_ev_ext_index_removed {
  803. uint8_t type;
  804. uint8_t bus;
  805. } __packed;
  806. #define MGMT_EV_LOCAL_OOB_DATA_UPDATED 0x0022
  807. struct mgmt_ev_local_oob_data_updated {
  808. uint8_t type;
  809. uint16_t eir_len;
  810. uint8_t eir[0];
  811. } __packed;
  812. #define MGMT_EV_ADVERTISING_ADDED 0x0023
  813. struct mgmt_ev_advertising_added {
  814. uint8_t instance;
  815. } __packed;
  816. #define MGMT_EV_ADVERTISING_REMOVED 0x0024
  817. struct mgmt_ev_advertising_removed {
  818. uint8_t instance;
  819. } __packed;
  820. #define MGMT_EV_EXT_INFO_CHANGED 0x0025
  821. struct mgmt_ev_ext_info_changed {
  822. uint16_t eir_len;
  823. uint8_t eir[0];
  824. } __packed;
  825. #define MGMT_EV_PHY_CONFIGURATION_CHANGED 0x0026
  826. struct mgmt_ev_phy_configuration_changed {
  827. uint16_t selected_phys;
  828. } __packed;
  829. #define MGMT_EV_EXP_FEATURE_CHANGE 0x0027
  830. struct mgmt_ev_exp_feature_changed {
  831. uint8_t uuid[16];
  832. uint32_t flags;
  833. } __packed;
  834. #define MGMT_EV_DEVICE_FLAGS_CHANGED 0x002a
  835. struct mgmt_ev_device_flags_changed {
  836. struct mgmt_addr_info addr;
  837. uint32_t supported_flags;
  838. uint32_t current_flags;
  839. } __packed;
  840. #define MGMT_EV_ADV_MONITOR_ADDED 0x002b
  841. struct mgmt_ev_adv_monitor_added {
  842. uint16_t monitor_handle;
  843. } __packed;
  844. #define MGMT_EV_ADV_MONITOR_REMOVED 0x002c
  845. struct mgmt_ev_adv_monitor_removed {
  846. uint16_t monitor_handle;
  847. } __packed;
  848. #define MGMT_EV_CONTROLLER_SUSPEND 0x002d
  849. struct mgmt_ev_controller_suspend {
  850. uint8_t suspend_state;
  851. } __packed;
  852. #define MGMT_EV_CONTROLLER_RESUME 0x002e
  853. struct mgmt_ev_controller_resume {
  854. struct mgmt_addr_info addr;
  855. uint8_t wake_reason;
  856. } __packed;
  857. static const char *mgmt_op[] = {
  858. "<0x0000>",
  859. "Read Version",
  860. "Read Commands",
  861. "Read Index List",
  862. "Read Controller Info",
  863. "Set Powered",
  864. "Set Discoverable",
  865. "Set Connectable",
  866. "Set Fast Connectable", /* 0x0008 */
  867. "Set Bondable",
  868. "Set Link Security",
  869. "Set Secure Simple Pairing",
  870. "Set High Speed",
  871. "Set Low Energy",
  872. "Set Dev Class",
  873. "Set Local Name",
  874. "Add UUID", /* 0x0010 */
  875. "Remove UUID",
  876. "Load Link Keys",
  877. "Load Long Term Keys",
  878. "Disconnect",
  879. "Get Connections",
  880. "PIN Code Reply",
  881. "PIN Code Neg Reply",
  882. "Set IO Capability", /* 0x0018 */
  883. "Pair Device",
  884. "Cancel Pair Device",
  885. "Unpair Device",
  886. "User Confirm Reply",
  887. "User Confirm Neg Reply",
  888. "User Passkey Reply",
  889. "User Passkey Neg Reply",
  890. "Read Local OOB Data", /* 0x0020 */
  891. "Add Remote OOB Data",
  892. "Remove Remove OOB Data",
  893. "Start Discovery",
  894. "Stop Discovery",
  895. "Confirm Name",
  896. "Block Device",
  897. "Unblock Device",
  898. "Set Device ID", /* 0x0028 */
  899. "Set Advertising",
  900. "Set BR/EDR",
  901. "Set Static Address",
  902. "Set Scan Parameters",
  903. "Set Secure Connections",
  904. "Set Debug Keys",
  905. "Set Privacy",
  906. "Load Identity Resolving Keys", /* 0x0030 */
  907. "Get Connection Information",
  908. "Get Clock Information",
  909. "Add Device",
  910. "Remove Device",
  911. "Load Connection Parameters",
  912. "Read Unconfigured Index List",
  913. "Read Controller Configuration Information",
  914. "Set External Configuration", /* 0x0038 */
  915. "Set Public Address",
  916. "Start Service Discovery",
  917. "Read Local Out Of Band Extended Data",
  918. "Read Extended Controller Index List",
  919. "Read Advertising Features",
  920. "Add Advertising",
  921. "Remove Advertising",
  922. "Get Advertising Size Information", /* 0x0040 */
  923. "Start Limited Discovery",
  924. "Read Extended Controller Information",
  925. "Set Appearance",
  926. "Get PHY Configuration",
  927. "Set PHY Configuration",
  928. "Set Blocked Keys",
  929. "Set Wideband Speech",
  930. "Read Controller Capabilities Information", /* 0x0048 */
  931. "Read Experimental Features Information",
  932. "Set Experimental Feature",
  933. "Read Default System Configuration",
  934. "Set Default System Configuration",
  935. "Read Default Runtime Configuration",
  936. "Set Default Runtime Configuration",
  937. "Get Device Flags",
  938. "Set Device Flags", /* 0x0050 */
  939. "Read Advertisement Monitor Features",
  940. "Add Advertisement Patterns Monitor",
  941. "Remove Advertisement Monitor",
  942. "Add Extended Advertisement Parameters", /* 0x0054 */
  943. "Add Extended Advertisement Data",
  944. "Add Advertisement Patterns Monitor RSSI",
  945. };
  946. static const char *mgmt_ev[] = {
  947. "<0x0000>",
  948. "Command Complete",
  949. "Command Status",
  950. "Controller Error",
  951. "Index Added",
  952. "Index Removed",
  953. "New Settings",
  954. "Class of Device Changed",
  955. "Local Name Changed", /* 0x0008 */
  956. "New Link Key",
  957. "New Long Term Key",
  958. "Device Connected",
  959. "Device Disconnected",
  960. "Connect Failed",
  961. "PIN Code Request",
  962. "User Confirm Request",
  963. "User Passkey Request", /* 0x0010 */
  964. "Authentication Failed",
  965. "Device Found",
  966. "Discovering",
  967. "Device Blocked",
  968. "Device Unblocked",
  969. "Device Unpaired",
  970. "Passkey Notify",
  971. "New Identity Resolving Key", /* 0x0018 */
  972. "New Signature Resolving Key",
  973. "Device Added",
  974. "Device Removed",
  975. "New Connection Parameter",
  976. "Unconfigured Index Added",
  977. "Unconfigured Index Removed",
  978. "New Configuration Options",
  979. "Extended Index Added", /* 0x0020 */
  980. "Extended Index Removed",
  981. "Local Out Of Band Extended Data Updated",
  982. "Advertising Added",
  983. "Advertising Removed",
  984. "Extended Controller Information Changed",
  985. "PHY Configuration Changed",
  986. "Experimental Feature Changed",
  987. "Default System Configuration Changed", /* 0x0028 */
  988. "Default Runtime Configuration Changed",
  989. "Device Flags Changed",
  990. "Advertisement Monitor Added", /* 0x002b */
  991. "Advertisement Monitor Removed",
  992. "Controller Suspend",
  993. "Controller Resume",
  994. };
  995. static const char *mgmt_status[] = {
  996. "Success",
  997. "Unknown Command",
  998. "Not Connected",
  999. "Failed",
  1000. "Connect Failed",
  1001. "Authentication Failed",
  1002. "Not Paired",
  1003. "No Resources",
  1004. "Timeout",
  1005. "Already Connected",
  1006. "Busy",
  1007. "Rejected",
  1008. "Not Supported",
  1009. "Invalid Parameters",
  1010. "Disconnected",
  1011. "Not Powered",
  1012. "Cancelled",
  1013. "Invalid Index",
  1014. "Blocked through rfkill",
  1015. "Already Paired",
  1016. "Permission Denied",
  1017. "Connection Not Established",
  1018. };
  1019. #ifndef NELEM
  1020. #define NELEM(x) (sizeof(x) / sizeof((x)[0]))
  1021. #endif
  1022. static inline const char *mgmt_opstr(uint16_t op)
  1023. {
  1024. if (op >= NELEM(mgmt_op))
  1025. return "<unknown opcode>";
  1026. return mgmt_op[op];
  1027. }
  1028. static inline const char *mgmt_evstr(uint16_t ev)
  1029. {
  1030. if (ev >= NELEM(mgmt_ev))
  1031. return "<unknown event>";
  1032. return mgmt_ev[ev];
  1033. }
  1034. static inline const char *mgmt_errstr(uint8_t status)
  1035. {
  1036. if (status >= NELEM(mgmt_status))
  1037. return "<unknown status>";
  1038. return mgmt_status[status];
  1039. }