xref: /openbmc/linux/include/net/bluetooth/mgmt.h (revision d13eafce)
1 /*
2    BlueZ - Bluetooth protocol stack for Linux
3 
4    Copyright (C) 2010  Nokia Corporation
5    Copyright (C) 2011-2012  Intel Corporation
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License version 2 as
9    published by the Free Software Foundation;
10 
11    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 
20    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22    SOFTWARE IS DISCLAIMED.
23 */
24 
25 #define MGMT_INDEX_NONE			0xFFFF
26 
27 #define MGMT_STATUS_SUCCESS		0x00
28 #define MGMT_STATUS_UNKNOWN_COMMAND	0x01
29 #define MGMT_STATUS_NOT_CONNECTED	0x02
30 #define MGMT_STATUS_FAILED		0x03
31 #define MGMT_STATUS_CONNECT_FAILED	0x04
32 #define MGMT_STATUS_AUTH_FAILED		0x05
33 #define MGMT_STATUS_NOT_PAIRED		0x06
34 #define MGMT_STATUS_NO_RESOURCES	0x07
35 #define MGMT_STATUS_TIMEOUT		0x08
36 #define MGMT_STATUS_ALREADY_CONNECTED	0x09
37 #define MGMT_STATUS_BUSY		0x0a
38 #define MGMT_STATUS_REJECTED		0x0b
39 #define MGMT_STATUS_NOT_SUPPORTED	0x0c
40 #define MGMT_STATUS_INVALID_PARAMS	0x0d
41 #define MGMT_STATUS_DISCONNECTED	0x0e
42 #define MGMT_STATUS_NOT_POWERED		0x0f
43 #define MGMT_STATUS_CANCELLED		0x10
44 #define MGMT_STATUS_INVALID_INDEX	0x11
45 #define MGMT_STATUS_RFKILLED		0x12
46 
47 struct mgmt_hdr {
48 	__le16	opcode;
49 	__le16	index;
50 	__le16	len;
51 } __packed;
52 
53 struct mgmt_addr_info {
54 	bdaddr_t	bdaddr;
55 	__u8		type;
56 } __packed;
57 #define MGMT_ADDR_INFO_SIZE		7
58 
59 #define MGMT_OP_READ_VERSION		0x0001
60 #define MGMT_READ_VERSION_SIZE		0
61 struct mgmt_rp_read_version {
62 	__u8	version;
63 	__le16	revision;
64 } __packed;
65 
66 #define MGMT_OP_READ_COMMANDS		0x0002
67 #define MGMT_READ_COMMANDS_SIZE		0
68 struct mgmt_rp_read_commands {
69 	__le16	num_commands;
70 	__le16	num_events;
71 	__le16	opcodes[0];
72 } __packed;
73 
74 #define MGMT_OP_READ_INDEX_LIST		0x0003
75 #define MGMT_READ_INDEX_LIST_SIZE	0
76 struct mgmt_rp_read_index_list {
77 	__le16	num_controllers;
78 	__le16	index[0];
79 } __packed;
80 
81 /* Reserve one extra byte for names in management messages so that they
82  * are always guaranteed to be nul-terminated */
83 #define MGMT_MAX_NAME_LENGTH		(HCI_MAX_NAME_LENGTH + 1)
84 #define MGMT_MAX_SHORT_NAME_LENGTH	(HCI_MAX_SHORT_NAME_LENGTH + 1)
85 
86 #define MGMT_SETTING_POWERED		0x00000001
87 #define MGMT_SETTING_CONNECTABLE	0x00000002
88 #define MGMT_SETTING_FAST_CONNECTABLE	0x00000004
89 #define MGMT_SETTING_DISCOVERABLE	0x00000008
90 #define MGMT_SETTING_PAIRABLE		0x00000010
91 #define MGMT_SETTING_LINK_SECURITY	0x00000020
92 #define MGMT_SETTING_SSP		0x00000040
93 #define MGMT_SETTING_BREDR		0x00000080
94 #define MGMT_SETTING_HS			0x00000100
95 #define MGMT_SETTING_LE			0x00000200
96 #define MGMT_SETTING_ADVERTISING	0x00000400
97 
98 #define MGMT_OP_READ_INFO		0x0004
99 #define MGMT_READ_INFO_SIZE		0
100 struct mgmt_rp_read_info {
101 	bdaddr_t	bdaddr;
102 	__u8		version;
103 	__le16		manufacturer;
104 	__le32		supported_settings;
105 	__le32		current_settings;
106 	__u8		dev_class[3];
107 	__u8		name[MGMT_MAX_NAME_LENGTH];
108 	__u8		short_name[MGMT_MAX_SHORT_NAME_LENGTH];
109 } __packed;
110 
111 struct mgmt_mode {
112 	__u8 val;
113 } __packed;
114 
115 #define MGMT_SETTING_SIZE		1
116 
117 #define MGMT_OP_SET_POWERED		0x0005
118 
119 #define MGMT_OP_SET_DISCOVERABLE	0x0006
120 struct mgmt_cp_set_discoverable {
121 	__u8	val;
122 	__le16	timeout;
123 } __packed;
124 #define MGMT_SET_DISCOVERABLE_SIZE	3
125 
126 #define MGMT_OP_SET_CONNECTABLE		0x0007
127 
128 #define MGMT_OP_SET_FAST_CONNECTABLE	0x0008
129 
130 #define MGMT_OP_SET_PAIRABLE		0x0009
131 
132 #define MGMT_OP_SET_LINK_SECURITY	0x000A
133 
134 #define MGMT_OP_SET_SSP			0x000B
135 
136 #define MGMT_OP_SET_HS			0x000C
137 
138 #define MGMT_OP_SET_LE			0x000D
139 #define MGMT_OP_SET_DEV_CLASS		0x000E
140 struct mgmt_cp_set_dev_class {
141 	__u8	major;
142 	__u8	minor;
143 } __packed;
144 #define MGMT_SET_DEV_CLASS_SIZE		2
145 
146 #define MGMT_OP_SET_LOCAL_NAME		0x000F
147 struct mgmt_cp_set_local_name {
148 	__u8	name[MGMT_MAX_NAME_LENGTH];
149 	__u8	short_name[MGMT_MAX_SHORT_NAME_LENGTH];
150 } __packed;
151 #define MGMT_SET_LOCAL_NAME_SIZE	260
152 
153 #define MGMT_OP_ADD_UUID		0x0010
154 struct mgmt_cp_add_uuid {
155 	__u8	uuid[16];
156 	__u8	svc_hint;
157 } __packed;
158 #define MGMT_ADD_UUID_SIZE		17
159 
160 #define MGMT_OP_REMOVE_UUID		0x0011
161 struct mgmt_cp_remove_uuid {
162 	__u8	uuid[16];
163 } __packed;
164 #define MGMT_REMOVE_UUID_SIZE		16
165 
166 struct mgmt_link_key_info {
167 	struct mgmt_addr_info addr;
168 	__u8	type;
169 	__u8	val[16];
170 	__u8	pin_len;
171 } __packed;
172 
173 #define MGMT_OP_LOAD_LINK_KEYS		0x0012
174 struct mgmt_cp_load_link_keys {
175 	__u8	debug_keys;
176 	__le16	key_count;
177 	struct	mgmt_link_key_info keys[0];
178 } __packed;
179 #define MGMT_LOAD_LINK_KEYS_SIZE	3
180 
181 struct mgmt_ltk_info {
182 	struct mgmt_addr_info addr;
183 	__u8	authenticated;
184 	__u8	master;
185 	__u8	enc_size;
186 	__le16	ediv;
187 	__u8	rand[8];
188 	__u8	val[16];
189 } __packed;
190 
191 #define MGMT_OP_LOAD_LONG_TERM_KEYS	0x0013
192 struct mgmt_cp_load_long_term_keys {
193 	__le16	key_count;
194 	struct	mgmt_ltk_info keys[0];
195 } __packed;
196 #define MGMT_LOAD_LONG_TERM_KEYS_SIZE	2
197 
198 #define MGMT_OP_DISCONNECT		0x0014
199 struct mgmt_cp_disconnect {
200 	struct mgmt_addr_info addr;
201 } __packed;
202 #define MGMT_DISCONNECT_SIZE		MGMT_ADDR_INFO_SIZE
203 struct mgmt_rp_disconnect {
204 	struct mgmt_addr_info addr;
205 } __packed;
206 
207 #define MGMT_OP_GET_CONNECTIONS		0x0015
208 #define MGMT_GET_CONNECTIONS_SIZE	0
209 struct mgmt_rp_get_connections {
210 	__le16 conn_count;
211 	struct mgmt_addr_info addr[0];
212 } __packed;
213 
214 #define MGMT_OP_PIN_CODE_REPLY		0x0016
215 struct mgmt_cp_pin_code_reply {
216 	struct mgmt_addr_info addr;
217 	__u8	pin_len;
218 	__u8	pin_code[16];
219 } __packed;
220 #define MGMT_PIN_CODE_REPLY_SIZE	(MGMT_ADDR_INFO_SIZE + 17)
221 struct mgmt_rp_pin_code_reply {
222 	struct mgmt_addr_info addr;
223 } __packed;
224 
225 #define MGMT_OP_PIN_CODE_NEG_REPLY	0x0017
226 struct mgmt_cp_pin_code_neg_reply {
227 	struct mgmt_addr_info addr;
228 } __packed;
229 #define MGMT_PIN_CODE_NEG_REPLY_SIZE	MGMT_ADDR_INFO_SIZE
230 
231 #define MGMT_OP_SET_IO_CAPABILITY	0x0018
232 struct mgmt_cp_set_io_capability {
233 	__u8	io_capability;
234 } __packed;
235 #define MGMT_SET_IO_CAPABILITY_SIZE	1
236 
237 #define MGMT_OP_PAIR_DEVICE		0x0019
238 struct mgmt_cp_pair_device {
239 	struct mgmt_addr_info addr;
240 	__u8	io_cap;
241 } __packed;
242 #define MGMT_PAIR_DEVICE_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
243 struct mgmt_rp_pair_device {
244 	struct mgmt_addr_info addr;
245 } __packed;
246 
247 #define MGMT_OP_CANCEL_PAIR_DEVICE	0x001A
248 #define MGMT_CANCEL_PAIR_DEVICE_SIZE	MGMT_ADDR_INFO_SIZE
249 
250 #define MGMT_OP_UNPAIR_DEVICE		0x001B
251 struct mgmt_cp_unpair_device {
252 	struct mgmt_addr_info addr;
253 	__u8 disconnect;
254 } __packed;
255 #define MGMT_UNPAIR_DEVICE_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
256 struct mgmt_rp_unpair_device {
257 	struct mgmt_addr_info addr;
258 };
259 
260 #define MGMT_OP_USER_CONFIRM_REPLY	0x001C
261 struct mgmt_cp_user_confirm_reply {
262 	struct mgmt_addr_info addr;
263 } __packed;
264 #define MGMT_USER_CONFIRM_REPLY_SIZE	MGMT_ADDR_INFO_SIZE
265 struct mgmt_rp_user_confirm_reply {
266 	struct mgmt_addr_info addr;
267 } __packed;
268 
269 #define MGMT_OP_USER_CONFIRM_NEG_REPLY	0x001D
270 struct mgmt_cp_user_confirm_neg_reply {
271 	struct mgmt_addr_info addr;
272 } __packed;
273 #define MGMT_USER_CONFIRM_NEG_REPLY_SIZE MGMT_ADDR_INFO_SIZE
274 
275 #define MGMT_OP_USER_PASSKEY_REPLY	0x001E
276 struct mgmt_cp_user_passkey_reply {
277 	struct mgmt_addr_info addr;
278 	__le32	passkey;
279 } __packed;
280 #define MGMT_USER_PASSKEY_REPLY_SIZE	(MGMT_ADDR_INFO_SIZE + 4)
281 struct mgmt_rp_user_passkey_reply {
282 	struct mgmt_addr_info addr;
283 } __packed;
284 
285 #define MGMT_OP_USER_PASSKEY_NEG_REPLY	0x001F
286 struct mgmt_cp_user_passkey_neg_reply {
287 	struct mgmt_addr_info addr;
288 } __packed;
289 #define MGMT_USER_PASSKEY_NEG_REPLY_SIZE MGMT_ADDR_INFO_SIZE
290 
291 #define MGMT_OP_READ_LOCAL_OOB_DATA	0x0020
292 #define MGMT_READ_LOCAL_OOB_DATA_SIZE	0
293 struct mgmt_rp_read_local_oob_data {
294 	__u8	hash[16];
295 	__u8	randomizer[16];
296 } __packed;
297 
298 #define MGMT_OP_ADD_REMOTE_OOB_DATA	0x0021
299 struct mgmt_cp_add_remote_oob_data {
300 	struct mgmt_addr_info addr;
301 	__u8	hash[16];
302 	__u8	randomizer[16];
303 } __packed;
304 #define MGMT_ADD_REMOTE_OOB_DATA_SIZE	(MGMT_ADDR_INFO_SIZE + 32)
305 
306 #define MGMT_OP_REMOVE_REMOTE_OOB_DATA	0x0022
307 struct mgmt_cp_remove_remote_oob_data {
308 	struct mgmt_addr_info addr;
309 } __packed;
310 #define MGMT_REMOVE_REMOTE_OOB_DATA_SIZE MGMT_ADDR_INFO_SIZE
311 
312 #define MGMT_OP_START_DISCOVERY		0x0023
313 struct mgmt_cp_start_discovery {
314 	__u8 type;
315 } __packed;
316 #define MGMT_START_DISCOVERY_SIZE	1
317 
318 #define MGMT_OP_STOP_DISCOVERY		0x0024
319 struct mgmt_cp_stop_discovery {
320 	__u8 type;
321 } __packed;
322 #define MGMT_STOP_DISCOVERY_SIZE	1
323 
324 #define MGMT_OP_CONFIRM_NAME		0x0025
325 struct mgmt_cp_confirm_name {
326 	struct mgmt_addr_info addr;
327 	__u8	name_known;
328 } __packed;
329 #define MGMT_CONFIRM_NAME_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
330 struct mgmt_rp_confirm_name {
331 	struct mgmt_addr_info addr;
332 } __packed;
333 
334 #define MGMT_OP_BLOCK_DEVICE		0x0026
335 struct mgmt_cp_block_device {
336 	struct mgmt_addr_info addr;
337 } __packed;
338 #define MGMT_BLOCK_DEVICE_SIZE		MGMT_ADDR_INFO_SIZE
339 
340 #define MGMT_OP_UNBLOCK_DEVICE		0x0027
341 struct mgmt_cp_unblock_device {
342 	struct mgmt_addr_info addr;
343 } __packed;
344 #define MGMT_UNBLOCK_DEVICE_SIZE	MGMT_ADDR_INFO_SIZE
345 
346 #define MGMT_OP_SET_DEVICE_ID		0x0028
347 struct mgmt_cp_set_device_id {
348 	__le16	source;
349 	__le16	vendor;
350 	__le16	product;
351 	__le16	version;
352 } __packed;
353 #define MGMT_SET_DEVICE_ID_SIZE		8
354 
355 #define MGMT_OP_SET_ADVERTISING		0x0029
356 
357 #define MGMT_OP_SET_BREDR		0x002A
358 
359 #define MGMT_OP_SET_STATIC_ADDRESS	0x002B
360 struct mgmt_cp_set_static_address {
361 	bdaddr_t bdaddr;
362 } __packed;
363 #define MGMT_SET_STATIC_ADDRESS_SIZE	6
364 
365 #define MGMT_EV_CMD_COMPLETE		0x0001
366 struct mgmt_ev_cmd_complete {
367 	__le16	opcode;
368 	__u8	status;
369 	__u8	data[0];
370 } __packed;
371 
372 #define MGMT_EV_CMD_STATUS		0x0002
373 struct mgmt_ev_cmd_status {
374 	__le16	opcode;
375 	__u8	status;
376 } __packed;
377 
378 #define MGMT_EV_CONTROLLER_ERROR	0x0003
379 struct mgmt_ev_controller_error {
380 	__u8	error_code;
381 } __packed;
382 
383 #define MGMT_EV_INDEX_ADDED		0x0004
384 
385 #define MGMT_EV_INDEX_REMOVED		0x0005
386 
387 #define MGMT_EV_NEW_SETTINGS		0x0006
388 
389 #define MGMT_EV_CLASS_OF_DEV_CHANGED	0x0007
390 struct mgmt_ev_class_of_dev_changed {
391 	__u8	dev_class[3];
392 };
393 
394 #define MGMT_EV_LOCAL_NAME_CHANGED	0x0008
395 struct mgmt_ev_local_name_changed {
396 	__u8	name[MGMT_MAX_NAME_LENGTH];
397 	__u8	short_name[MGMT_MAX_SHORT_NAME_LENGTH];
398 } __packed;
399 
400 #define MGMT_EV_NEW_LINK_KEY		0x0009
401 struct mgmt_ev_new_link_key {
402 	__u8	store_hint;
403 	struct mgmt_link_key_info key;
404 } __packed;
405 
406 #define MGMT_EV_NEW_LONG_TERM_KEY	0x000A
407 struct mgmt_ev_new_long_term_key {
408 	__u8	store_hint;
409 	struct mgmt_ltk_info key;
410 } __packed;
411 
412 #define MGMT_EV_DEVICE_CONNECTED	0x000B
413 struct mgmt_ev_device_connected {
414 	struct mgmt_addr_info addr;
415 	__le32	flags;
416 	__le16	eir_len;
417 	__u8	eir[0];
418 } __packed;
419 
420 #define MGMT_DEV_DISCONN_UNKNOWN	0x00
421 #define MGMT_DEV_DISCONN_TIMEOUT	0x01
422 #define MGMT_DEV_DISCONN_LOCAL_HOST	0x02
423 #define MGMT_DEV_DISCONN_REMOTE		0x03
424 
425 #define MGMT_EV_DEVICE_DISCONNECTED	0x000C
426 struct mgmt_ev_device_disconnected {
427 	struct mgmt_addr_info addr;
428 	__u8	reason;
429 } __packed;
430 
431 #define MGMT_EV_CONNECT_FAILED		0x000D
432 struct mgmt_ev_connect_failed {
433 	struct mgmt_addr_info addr;
434 	__u8	status;
435 } __packed;
436 
437 #define MGMT_EV_PIN_CODE_REQUEST	0x000E
438 struct mgmt_ev_pin_code_request {
439 	struct mgmt_addr_info addr;
440 	__u8	secure;
441 } __packed;
442 
443 #define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
444 struct mgmt_ev_user_confirm_request {
445 	struct mgmt_addr_info addr;
446 	__u8	confirm_hint;
447 	__le32	value;
448 } __packed;
449 
450 #define MGMT_EV_USER_PASSKEY_REQUEST	0x0010
451 struct mgmt_ev_user_passkey_request {
452 	struct mgmt_addr_info addr;
453 } __packed;
454 
455 #define MGMT_EV_AUTH_FAILED		0x0011
456 struct mgmt_ev_auth_failed {
457 	struct mgmt_addr_info addr;
458 	__u8	status;
459 } __packed;
460 
461 #define MGMT_DEV_FOUND_CONFIRM_NAME    0x01
462 #define MGMT_DEV_FOUND_LEGACY_PAIRING  0x02
463 
464 #define MGMT_EV_DEVICE_FOUND		0x0012
465 struct mgmt_ev_device_found {
466 	struct mgmt_addr_info addr;
467 	__s8	rssi;
468 	__le32	flags;
469 	__le16	eir_len;
470 	__u8	eir[0];
471 } __packed;
472 
473 #define MGMT_EV_DISCOVERING		0x0013
474 struct mgmt_ev_discovering {
475 	__u8	type;
476 	__u8	discovering;
477 } __packed;
478 
479 #define MGMT_EV_DEVICE_BLOCKED		0x0014
480 struct mgmt_ev_device_blocked {
481 	struct mgmt_addr_info addr;
482 } __packed;
483 
484 #define MGMT_EV_DEVICE_UNBLOCKED	0x0015
485 struct mgmt_ev_device_unblocked {
486 	struct mgmt_addr_info addr;
487 } __packed;
488 
489 #define MGMT_EV_DEVICE_UNPAIRED		0x0016
490 struct mgmt_ev_device_unpaired {
491 	struct mgmt_addr_info addr;
492 } __packed;
493 
494 #define MGMT_EV_PASSKEY_NOTIFY		0x0017
495 struct mgmt_ev_passkey_notify {
496 	struct mgmt_addr_info addr;
497 	__le32	passkey;
498 	__u8	entered;
499 } __packed;
500