xref: /OK3568_Linux_fs/kernel/include/net/bluetooth/mgmt.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun    BlueZ - Bluetooth protocol stack for Linux
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun    Copyright (C) 2010  Nokia Corporation
5*4882a593Smuzhiyun    Copyright (C) 2011-2012  Intel Corporation
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun    This program is free software; you can redistribute it and/or modify
8*4882a593Smuzhiyun    it under the terms of the GNU General Public License version 2 as
9*4882a593Smuzhiyun    published by the Free Software Foundation;
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12*4882a593Smuzhiyun    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13*4882a593Smuzhiyun    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14*4882a593Smuzhiyun    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15*4882a593Smuzhiyun    CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16*4882a593Smuzhiyun    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17*4882a593Smuzhiyun    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18*4882a593Smuzhiyun    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21*4882a593Smuzhiyun    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22*4882a593Smuzhiyun    SOFTWARE IS DISCLAIMED.
23*4882a593Smuzhiyun */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define MGMT_INDEX_NONE			0xFFFF
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define MGMT_STATUS_SUCCESS		0x00
28*4882a593Smuzhiyun #define MGMT_STATUS_UNKNOWN_COMMAND	0x01
29*4882a593Smuzhiyun #define MGMT_STATUS_NOT_CONNECTED	0x02
30*4882a593Smuzhiyun #define MGMT_STATUS_FAILED		0x03
31*4882a593Smuzhiyun #define MGMT_STATUS_CONNECT_FAILED	0x04
32*4882a593Smuzhiyun #define MGMT_STATUS_AUTH_FAILED		0x05
33*4882a593Smuzhiyun #define MGMT_STATUS_NOT_PAIRED		0x06
34*4882a593Smuzhiyun #define MGMT_STATUS_NO_RESOURCES	0x07
35*4882a593Smuzhiyun #define MGMT_STATUS_TIMEOUT		0x08
36*4882a593Smuzhiyun #define MGMT_STATUS_ALREADY_CONNECTED	0x09
37*4882a593Smuzhiyun #define MGMT_STATUS_BUSY		0x0a
38*4882a593Smuzhiyun #define MGMT_STATUS_REJECTED		0x0b
39*4882a593Smuzhiyun #define MGMT_STATUS_NOT_SUPPORTED	0x0c
40*4882a593Smuzhiyun #define MGMT_STATUS_INVALID_PARAMS	0x0d
41*4882a593Smuzhiyun #define MGMT_STATUS_DISCONNECTED	0x0e
42*4882a593Smuzhiyun #define MGMT_STATUS_NOT_POWERED		0x0f
43*4882a593Smuzhiyun #define MGMT_STATUS_CANCELLED		0x10
44*4882a593Smuzhiyun #define MGMT_STATUS_INVALID_INDEX	0x11
45*4882a593Smuzhiyun #define MGMT_STATUS_RFKILLED		0x12
46*4882a593Smuzhiyun #define MGMT_STATUS_ALREADY_PAIRED	0x13
47*4882a593Smuzhiyun #define MGMT_STATUS_PERMISSION_DENIED	0x14
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct mgmt_hdr {
50*4882a593Smuzhiyun 	__le16	opcode;
51*4882a593Smuzhiyun 	__le16	index;
52*4882a593Smuzhiyun 	__le16	len;
53*4882a593Smuzhiyun } __packed;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun struct mgmt_tlv {
56*4882a593Smuzhiyun 	__le16 type;
57*4882a593Smuzhiyun 	__u8   length;
58*4882a593Smuzhiyun 	__u8   value[];
59*4882a593Smuzhiyun } __packed;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun struct mgmt_addr_info {
62*4882a593Smuzhiyun 	bdaddr_t	bdaddr;
63*4882a593Smuzhiyun 	__u8		type;
64*4882a593Smuzhiyun } __packed;
65*4882a593Smuzhiyun #define MGMT_ADDR_INFO_SIZE		7
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #define MGMT_OP_READ_VERSION		0x0001
68*4882a593Smuzhiyun #define MGMT_READ_VERSION_SIZE		0
69*4882a593Smuzhiyun struct mgmt_rp_read_version {
70*4882a593Smuzhiyun 	__u8	version;
71*4882a593Smuzhiyun 	__le16	revision;
72*4882a593Smuzhiyun } __packed;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define MGMT_OP_READ_COMMANDS		0x0002
75*4882a593Smuzhiyun #define MGMT_READ_COMMANDS_SIZE		0
76*4882a593Smuzhiyun struct mgmt_rp_read_commands {
77*4882a593Smuzhiyun 	__le16	num_commands;
78*4882a593Smuzhiyun 	__le16	num_events;
79*4882a593Smuzhiyun 	__le16	opcodes[];
80*4882a593Smuzhiyun } __packed;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define MGMT_OP_READ_INDEX_LIST		0x0003
83*4882a593Smuzhiyun #define MGMT_READ_INDEX_LIST_SIZE	0
84*4882a593Smuzhiyun struct mgmt_rp_read_index_list {
85*4882a593Smuzhiyun 	__le16	num_controllers;
86*4882a593Smuzhiyun 	__le16	index[];
87*4882a593Smuzhiyun } __packed;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* Reserve one extra byte for names in management messages so that they
90*4882a593Smuzhiyun  * are always guaranteed to be nul-terminated */
91*4882a593Smuzhiyun #define MGMT_MAX_NAME_LENGTH		(HCI_MAX_NAME_LENGTH + 1)
92*4882a593Smuzhiyun #define MGMT_MAX_SHORT_NAME_LENGTH	(HCI_MAX_SHORT_NAME_LENGTH + 1)
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define MGMT_SETTING_POWERED		0x00000001
95*4882a593Smuzhiyun #define MGMT_SETTING_CONNECTABLE	0x00000002
96*4882a593Smuzhiyun #define MGMT_SETTING_FAST_CONNECTABLE	0x00000004
97*4882a593Smuzhiyun #define MGMT_SETTING_DISCOVERABLE	0x00000008
98*4882a593Smuzhiyun #define MGMT_SETTING_BONDABLE		0x00000010
99*4882a593Smuzhiyun #define MGMT_SETTING_LINK_SECURITY	0x00000020
100*4882a593Smuzhiyun #define MGMT_SETTING_SSP		0x00000040
101*4882a593Smuzhiyun #define MGMT_SETTING_BREDR		0x00000080
102*4882a593Smuzhiyun #define MGMT_SETTING_HS			0x00000100
103*4882a593Smuzhiyun #define MGMT_SETTING_LE			0x00000200
104*4882a593Smuzhiyun #define MGMT_SETTING_ADVERTISING	0x00000400
105*4882a593Smuzhiyun #define MGMT_SETTING_SECURE_CONN	0x00000800
106*4882a593Smuzhiyun #define MGMT_SETTING_DEBUG_KEYS		0x00001000
107*4882a593Smuzhiyun #define MGMT_SETTING_PRIVACY		0x00002000
108*4882a593Smuzhiyun #define MGMT_SETTING_CONFIGURATION	0x00004000
109*4882a593Smuzhiyun #define MGMT_SETTING_STATIC_ADDRESS	0x00008000
110*4882a593Smuzhiyun #define MGMT_SETTING_PHY_CONFIGURATION	0x00010000
111*4882a593Smuzhiyun #define MGMT_SETTING_WIDEBAND_SPEECH	0x00020000
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define MGMT_OP_READ_INFO		0x0004
114*4882a593Smuzhiyun #define MGMT_READ_INFO_SIZE		0
115*4882a593Smuzhiyun struct mgmt_rp_read_info {
116*4882a593Smuzhiyun 	bdaddr_t	bdaddr;
117*4882a593Smuzhiyun 	__u8		version;
118*4882a593Smuzhiyun 	__le16		manufacturer;
119*4882a593Smuzhiyun 	__le32		supported_settings;
120*4882a593Smuzhiyun 	__le32		current_settings;
121*4882a593Smuzhiyun 	__u8		dev_class[3];
122*4882a593Smuzhiyun 	__u8		name[MGMT_MAX_NAME_LENGTH];
123*4882a593Smuzhiyun 	__u8		short_name[MGMT_MAX_SHORT_NAME_LENGTH];
124*4882a593Smuzhiyun } __packed;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct mgmt_mode {
127*4882a593Smuzhiyun 	__u8 val;
128*4882a593Smuzhiyun } __packed;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #define MGMT_SETTING_SIZE		1
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define MGMT_OP_SET_POWERED		0x0005
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define MGMT_OP_SET_DISCOVERABLE	0x0006
135*4882a593Smuzhiyun struct mgmt_cp_set_discoverable {
136*4882a593Smuzhiyun 	__u8	val;
137*4882a593Smuzhiyun 	__le16	timeout;
138*4882a593Smuzhiyun } __packed;
139*4882a593Smuzhiyun #define MGMT_SET_DISCOVERABLE_SIZE	3
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define MGMT_OP_SET_CONNECTABLE		0x0007
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define MGMT_OP_SET_FAST_CONNECTABLE	0x0008
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define MGMT_OP_SET_BONDABLE		0x0009
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define MGMT_OP_SET_LINK_SECURITY	0x000A
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun #define MGMT_OP_SET_SSP			0x000B
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define MGMT_OP_SET_HS			0x000C
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun #define MGMT_OP_SET_LE			0x000D
154*4882a593Smuzhiyun #define MGMT_OP_SET_DEV_CLASS		0x000E
155*4882a593Smuzhiyun struct mgmt_cp_set_dev_class {
156*4882a593Smuzhiyun 	__u8	major;
157*4882a593Smuzhiyun 	__u8	minor;
158*4882a593Smuzhiyun } __packed;
159*4882a593Smuzhiyun #define MGMT_SET_DEV_CLASS_SIZE		2
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #define MGMT_OP_SET_LOCAL_NAME		0x000F
162*4882a593Smuzhiyun struct mgmt_cp_set_local_name {
163*4882a593Smuzhiyun 	__u8	name[MGMT_MAX_NAME_LENGTH];
164*4882a593Smuzhiyun 	__u8	short_name[MGMT_MAX_SHORT_NAME_LENGTH];
165*4882a593Smuzhiyun } __packed;
166*4882a593Smuzhiyun #define MGMT_SET_LOCAL_NAME_SIZE	260
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define MGMT_OP_ADD_UUID		0x0010
169*4882a593Smuzhiyun struct mgmt_cp_add_uuid {
170*4882a593Smuzhiyun 	__u8	uuid[16];
171*4882a593Smuzhiyun 	__u8	svc_hint;
172*4882a593Smuzhiyun } __packed;
173*4882a593Smuzhiyun #define MGMT_ADD_UUID_SIZE		17
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define MGMT_OP_REMOVE_UUID		0x0011
176*4882a593Smuzhiyun struct mgmt_cp_remove_uuid {
177*4882a593Smuzhiyun 	__u8	uuid[16];
178*4882a593Smuzhiyun } __packed;
179*4882a593Smuzhiyun #define MGMT_REMOVE_UUID_SIZE		16
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun struct mgmt_link_key_info {
182*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
183*4882a593Smuzhiyun 	__u8	type;
184*4882a593Smuzhiyun 	__u8	val[16];
185*4882a593Smuzhiyun 	__u8	pin_len;
186*4882a593Smuzhiyun } __packed;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun #define MGMT_OP_LOAD_LINK_KEYS		0x0012
189*4882a593Smuzhiyun struct mgmt_cp_load_link_keys {
190*4882a593Smuzhiyun 	__u8	debug_keys;
191*4882a593Smuzhiyun 	__le16	key_count;
192*4882a593Smuzhiyun 	struct	mgmt_link_key_info keys[];
193*4882a593Smuzhiyun } __packed;
194*4882a593Smuzhiyun #define MGMT_LOAD_LINK_KEYS_SIZE	3
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #define MGMT_LTK_UNAUTHENTICATED	0x00
197*4882a593Smuzhiyun #define MGMT_LTK_AUTHENTICATED		0x01
198*4882a593Smuzhiyun #define MGMT_LTK_P256_UNAUTH		0x02
199*4882a593Smuzhiyun #define MGMT_LTK_P256_AUTH		0x03
200*4882a593Smuzhiyun #define MGMT_LTK_P256_DEBUG		0x04
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun struct mgmt_ltk_info {
203*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
204*4882a593Smuzhiyun 	__u8	type;
205*4882a593Smuzhiyun 	__u8	master;
206*4882a593Smuzhiyun 	__u8	enc_size;
207*4882a593Smuzhiyun 	__le16	ediv;
208*4882a593Smuzhiyun 	__le64	rand;
209*4882a593Smuzhiyun 	__u8	val[16];
210*4882a593Smuzhiyun } __packed;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #define MGMT_OP_LOAD_LONG_TERM_KEYS	0x0013
213*4882a593Smuzhiyun struct mgmt_cp_load_long_term_keys {
214*4882a593Smuzhiyun 	__le16	key_count;
215*4882a593Smuzhiyun 	struct	mgmt_ltk_info keys[];
216*4882a593Smuzhiyun } __packed;
217*4882a593Smuzhiyun #define MGMT_LOAD_LONG_TERM_KEYS_SIZE	2
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define MGMT_OP_DISCONNECT		0x0014
220*4882a593Smuzhiyun struct mgmt_cp_disconnect {
221*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
222*4882a593Smuzhiyun } __packed;
223*4882a593Smuzhiyun #define MGMT_DISCONNECT_SIZE		MGMT_ADDR_INFO_SIZE
224*4882a593Smuzhiyun struct mgmt_rp_disconnect {
225*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
226*4882a593Smuzhiyun } __packed;
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun #define MGMT_OP_GET_CONNECTIONS		0x0015
229*4882a593Smuzhiyun #define MGMT_GET_CONNECTIONS_SIZE	0
230*4882a593Smuzhiyun struct mgmt_rp_get_connections {
231*4882a593Smuzhiyun 	__le16 conn_count;
232*4882a593Smuzhiyun 	struct mgmt_addr_info addr[];
233*4882a593Smuzhiyun } __packed;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun #define MGMT_OP_PIN_CODE_REPLY		0x0016
236*4882a593Smuzhiyun struct mgmt_cp_pin_code_reply {
237*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
238*4882a593Smuzhiyun 	__u8	pin_len;
239*4882a593Smuzhiyun 	__u8	pin_code[16];
240*4882a593Smuzhiyun } __packed;
241*4882a593Smuzhiyun #define MGMT_PIN_CODE_REPLY_SIZE	(MGMT_ADDR_INFO_SIZE + 17)
242*4882a593Smuzhiyun struct mgmt_rp_pin_code_reply {
243*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
244*4882a593Smuzhiyun } __packed;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #define MGMT_OP_PIN_CODE_NEG_REPLY	0x0017
247*4882a593Smuzhiyun struct mgmt_cp_pin_code_neg_reply {
248*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
249*4882a593Smuzhiyun } __packed;
250*4882a593Smuzhiyun #define MGMT_PIN_CODE_NEG_REPLY_SIZE	MGMT_ADDR_INFO_SIZE
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #define MGMT_OP_SET_IO_CAPABILITY	0x0018
253*4882a593Smuzhiyun struct mgmt_cp_set_io_capability {
254*4882a593Smuzhiyun 	__u8	io_capability;
255*4882a593Smuzhiyun } __packed;
256*4882a593Smuzhiyun #define MGMT_SET_IO_CAPABILITY_SIZE	1
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun #define MGMT_OP_PAIR_DEVICE		0x0019
259*4882a593Smuzhiyun struct mgmt_cp_pair_device {
260*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
261*4882a593Smuzhiyun 	__u8	io_cap;
262*4882a593Smuzhiyun } __packed;
263*4882a593Smuzhiyun #define MGMT_PAIR_DEVICE_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
264*4882a593Smuzhiyun struct mgmt_rp_pair_device {
265*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
266*4882a593Smuzhiyun } __packed;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun #define MGMT_OP_CANCEL_PAIR_DEVICE	0x001A
269*4882a593Smuzhiyun #define MGMT_CANCEL_PAIR_DEVICE_SIZE	MGMT_ADDR_INFO_SIZE
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #define MGMT_OP_UNPAIR_DEVICE		0x001B
272*4882a593Smuzhiyun struct mgmt_cp_unpair_device {
273*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
274*4882a593Smuzhiyun 	__u8 disconnect;
275*4882a593Smuzhiyun } __packed;
276*4882a593Smuzhiyun #define MGMT_UNPAIR_DEVICE_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
277*4882a593Smuzhiyun struct mgmt_rp_unpair_device {
278*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun #define MGMT_OP_USER_CONFIRM_REPLY	0x001C
282*4882a593Smuzhiyun struct mgmt_cp_user_confirm_reply {
283*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
284*4882a593Smuzhiyun } __packed;
285*4882a593Smuzhiyun #define MGMT_USER_CONFIRM_REPLY_SIZE	MGMT_ADDR_INFO_SIZE
286*4882a593Smuzhiyun struct mgmt_rp_user_confirm_reply {
287*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
288*4882a593Smuzhiyun } __packed;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #define MGMT_OP_USER_CONFIRM_NEG_REPLY	0x001D
291*4882a593Smuzhiyun struct mgmt_cp_user_confirm_neg_reply {
292*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
293*4882a593Smuzhiyun } __packed;
294*4882a593Smuzhiyun #define MGMT_USER_CONFIRM_NEG_REPLY_SIZE MGMT_ADDR_INFO_SIZE
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun #define MGMT_OP_USER_PASSKEY_REPLY	0x001E
297*4882a593Smuzhiyun struct mgmt_cp_user_passkey_reply {
298*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
299*4882a593Smuzhiyun 	__le32	passkey;
300*4882a593Smuzhiyun } __packed;
301*4882a593Smuzhiyun #define MGMT_USER_PASSKEY_REPLY_SIZE	(MGMT_ADDR_INFO_SIZE + 4)
302*4882a593Smuzhiyun struct mgmt_rp_user_passkey_reply {
303*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
304*4882a593Smuzhiyun } __packed;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun #define MGMT_OP_USER_PASSKEY_NEG_REPLY	0x001F
307*4882a593Smuzhiyun struct mgmt_cp_user_passkey_neg_reply {
308*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
309*4882a593Smuzhiyun } __packed;
310*4882a593Smuzhiyun #define MGMT_USER_PASSKEY_NEG_REPLY_SIZE MGMT_ADDR_INFO_SIZE
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun #define MGMT_OP_READ_LOCAL_OOB_DATA	0x0020
313*4882a593Smuzhiyun #define MGMT_READ_LOCAL_OOB_DATA_SIZE	0
314*4882a593Smuzhiyun struct mgmt_rp_read_local_oob_data {
315*4882a593Smuzhiyun 	__u8	hash192[16];
316*4882a593Smuzhiyun 	__u8	rand192[16];
317*4882a593Smuzhiyun 	__u8	hash256[16];
318*4882a593Smuzhiyun 	__u8	rand256[16];
319*4882a593Smuzhiyun } __packed;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #define MGMT_OP_ADD_REMOTE_OOB_DATA	0x0021
322*4882a593Smuzhiyun struct mgmt_cp_add_remote_oob_data {
323*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
324*4882a593Smuzhiyun 	__u8	hash[16];
325*4882a593Smuzhiyun 	__u8	rand[16];
326*4882a593Smuzhiyun } __packed;
327*4882a593Smuzhiyun #define MGMT_ADD_REMOTE_OOB_DATA_SIZE	(MGMT_ADDR_INFO_SIZE + 32)
328*4882a593Smuzhiyun struct mgmt_cp_add_remote_oob_ext_data {
329*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
330*4882a593Smuzhiyun 	__u8	hash192[16];
331*4882a593Smuzhiyun 	__u8	rand192[16];
332*4882a593Smuzhiyun 	__u8	hash256[16];
333*4882a593Smuzhiyun 	__u8	rand256[16];
334*4882a593Smuzhiyun } __packed;
335*4882a593Smuzhiyun #define MGMT_ADD_REMOTE_OOB_EXT_DATA_SIZE (MGMT_ADDR_INFO_SIZE + 64)
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun #define MGMT_OP_REMOVE_REMOTE_OOB_DATA	0x0022
338*4882a593Smuzhiyun struct mgmt_cp_remove_remote_oob_data {
339*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
340*4882a593Smuzhiyun } __packed;
341*4882a593Smuzhiyun #define MGMT_REMOVE_REMOTE_OOB_DATA_SIZE MGMT_ADDR_INFO_SIZE
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun #define MGMT_OP_START_DISCOVERY		0x0023
344*4882a593Smuzhiyun struct mgmt_cp_start_discovery {
345*4882a593Smuzhiyun 	__u8 type;
346*4882a593Smuzhiyun } __packed;
347*4882a593Smuzhiyun #define MGMT_START_DISCOVERY_SIZE	1
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun #define MGMT_OP_STOP_DISCOVERY		0x0024
350*4882a593Smuzhiyun struct mgmt_cp_stop_discovery {
351*4882a593Smuzhiyun 	__u8 type;
352*4882a593Smuzhiyun } __packed;
353*4882a593Smuzhiyun #define MGMT_STOP_DISCOVERY_SIZE	1
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun #define MGMT_OP_CONFIRM_NAME		0x0025
356*4882a593Smuzhiyun struct mgmt_cp_confirm_name {
357*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
358*4882a593Smuzhiyun 	__u8	name_known;
359*4882a593Smuzhiyun } __packed;
360*4882a593Smuzhiyun #define MGMT_CONFIRM_NAME_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
361*4882a593Smuzhiyun struct mgmt_rp_confirm_name {
362*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
363*4882a593Smuzhiyun } __packed;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun #define MGMT_OP_BLOCK_DEVICE		0x0026
366*4882a593Smuzhiyun struct mgmt_cp_block_device {
367*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
368*4882a593Smuzhiyun } __packed;
369*4882a593Smuzhiyun #define MGMT_BLOCK_DEVICE_SIZE		MGMT_ADDR_INFO_SIZE
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define MGMT_OP_UNBLOCK_DEVICE		0x0027
372*4882a593Smuzhiyun struct mgmt_cp_unblock_device {
373*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
374*4882a593Smuzhiyun } __packed;
375*4882a593Smuzhiyun #define MGMT_UNBLOCK_DEVICE_SIZE	MGMT_ADDR_INFO_SIZE
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun #define MGMT_OP_SET_DEVICE_ID		0x0028
378*4882a593Smuzhiyun struct mgmt_cp_set_device_id {
379*4882a593Smuzhiyun 	__le16	source;
380*4882a593Smuzhiyun 	__le16	vendor;
381*4882a593Smuzhiyun 	__le16	product;
382*4882a593Smuzhiyun 	__le16	version;
383*4882a593Smuzhiyun } __packed;
384*4882a593Smuzhiyun #define MGMT_SET_DEVICE_ID_SIZE		8
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun #define MGMT_OP_SET_ADVERTISING		0x0029
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun #define MGMT_OP_SET_BREDR		0x002A
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun #define MGMT_OP_SET_STATIC_ADDRESS	0x002B
391*4882a593Smuzhiyun struct mgmt_cp_set_static_address {
392*4882a593Smuzhiyun 	bdaddr_t bdaddr;
393*4882a593Smuzhiyun } __packed;
394*4882a593Smuzhiyun #define MGMT_SET_STATIC_ADDRESS_SIZE	6
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun #define MGMT_OP_SET_SCAN_PARAMS		0x002C
397*4882a593Smuzhiyun struct mgmt_cp_set_scan_params {
398*4882a593Smuzhiyun 	__le16	interval;
399*4882a593Smuzhiyun 	__le16	window;
400*4882a593Smuzhiyun } __packed;
401*4882a593Smuzhiyun #define MGMT_SET_SCAN_PARAMS_SIZE	4
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun #define MGMT_OP_SET_SECURE_CONN		0x002D
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun #define MGMT_OP_SET_DEBUG_KEYS		0x002E
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun #define MGMT_OP_SET_PRIVACY		0x002F
408*4882a593Smuzhiyun struct mgmt_cp_set_privacy {
409*4882a593Smuzhiyun 	__u8 privacy;
410*4882a593Smuzhiyun 	__u8 irk[16];
411*4882a593Smuzhiyun } __packed;
412*4882a593Smuzhiyun #define MGMT_SET_PRIVACY_SIZE		17
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun struct mgmt_irk_info {
415*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
416*4882a593Smuzhiyun 	__u8 val[16];
417*4882a593Smuzhiyun } __packed;
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun #define MGMT_OP_LOAD_IRKS		0x0030
420*4882a593Smuzhiyun struct mgmt_cp_load_irks {
421*4882a593Smuzhiyun 	__le16 irk_count;
422*4882a593Smuzhiyun 	struct mgmt_irk_info irks[];
423*4882a593Smuzhiyun } __packed;
424*4882a593Smuzhiyun #define MGMT_LOAD_IRKS_SIZE		2
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun #define MGMT_OP_GET_CONN_INFO		0x0031
427*4882a593Smuzhiyun struct mgmt_cp_get_conn_info {
428*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
429*4882a593Smuzhiyun } __packed;
430*4882a593Smuzhiyun #define MGMT_GET_CONN_INFO_SIZE		MGMT_ADDR_INFO_SIZE
431*4882a593Smuzhiyun struct mgmt_rp_get_conn_info {
432*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
433*4882a593Smuzhiyun 	__s8	rssi;
434*4882a593Smuzhiyun 	__s8	tx_power;
435*4882a593Smuzhiyun 	__s8	max_tx_power;
436*4882a593Smuzhiyun } __packed;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun #define MGMT_OP_GET_CLOCK_INFO		0x0032
439*4882a593Smuzhiyun struct mgmt_cp_get_clock_info {
440*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
441*4882a593Smuzhiyun } __packed;
442*4882a593Smuzhiyun #define MGMT_GET_CLOCK_INFO_SIZE	MGMT_ADDR_INFO_SIZE
443*4882a593Smuzhiyun struct mgmt_rp_get_clock_info {
444*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
445*4882a593Smuzhiyun 	__le32  local_clock;
446*4882a593Smuzhiyun 	__le32  piconet_clock;
447*4882a593Smuzhiyun 	__le16  accuracy;
448*4882a593Smuzhiyun } __packed;
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun #define MGMT_OP_ADD_DEVICE		0x0033
451*4882a593Smuzhiyun struct mgmt_cp_add_device {
452*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
453*4882a593Smuzhiyun 	__u8	action;
454*4882a593Smuzhiyun } __packed;
455*4882a593Smuzhiyun #define MGMT_ADD_DEVICE_SIZE		(MGMT_ADDR_INFO_SIZE + 1)
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun #define MGMT_OP_REMOVE_DEVICE		0x0034
458*4882a593Smuzhiyun struct mgmt_cp_remove_device {
459*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
460*4882a593Smuzhiyun } __packed;
461*4882a593Smuzhiyun #define MGMT_REMOVE_DEVICE_SIZE		MGMT_ADDR_INFO_SIZE
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun struct mgmt_conn_param {
464*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
465*4882a593Smuzhiyun 	__le16 min_interval;
466*4882a593Smuzhiyun 	__le16 max_interval;
467*4882a593Smuzhiyun 	__le16 latency;
468*4882a593Smuzhiyun 	__le16 timeout;
469*4882a593Smuzhiyun } __packed;
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun #define MGMT_OP_LOAD_CONN_PARAM		0x0035
472*4882a593Smuzhiyun struct mgmt_cp_load_conn_param {
473*4882a593Smuzhiyun 	__le16 param_count;
474*4882a593Smuzhiyun 	struct mgmt_conn_param params[];
475*4882a593Smuzhiyun } __packed;
476*4882a593Smuzhiyun #define MGMT_LOAD_CONN_PARAM_SIZE	2
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun #define MGMT_OP_READ_UNCONF_INDEX_LIST	0x0036
479*4882a593Smuzhiyun #define MGMT_READ_UNCONF_INDEX_LIST_SIZE 0
480*4882a593Smuzhiyun struct mgmt_rp_read_unconf_index_list {
481*4882a593Smuzhiyun 	__le16	num_controllers;
482*4882a593Smuzhiyun 	__le16	index[];
483*4882a593Smuzhiyun } __packed;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun #define MGMT_OPTION_EXTERNAL_CONFIG	0x00000001
486*4882a593Smuzhiyun #define MGMT_OPTION_PUBLIC_ADDRESS	0x00000002
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun #define MGMT_OP_READ_CONFIG_INFO	0x0037
489*4882a593Smuzhiyun #define MGMT_READ_CONFIG_INFO_SIZE	0
490*4882a593Smuzhiyun struct mgmt_rp_read_config_info {
491*4882a593Smuzhiyun 	__le16	manufacturer;
492*4882a593Smuzhiyun 	__le32	supported_options;
493*4882a593Smuzhiyun 	__le32	missing_options;
494*4882a593Smuzhiyun } __packed;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun #define MGMT_OP_SET_EXTERNAL_CONFIG	0x0038
497*4882a593Smuzhiyun struct mgmt_cp_set_external_config {
498*4882a593Smuzhiyun 	__u8 config;
499*4882a593Smuzhiyun } __packed;
500*4882a593Smuzhiyun #define MGMT_SET_EXTERNAL_CONFIG_SIZE	1
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun #define MGMT_OP_SET_PUBLIC_ADDRESS	0x0039
503*4882a593Smuzhiyun struct mgmt_cp_set_public_address {
504*4882a593Smuzhiyun 	bdaddr_t bdaddr;
505*4882a593Smuzhiyun } __packed;
506*4882a593Smuzhiyun #define MGMT_SET_PUBLIC_ADDRESS_SIZE	6
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun #define MGMT_OP_START_SERVICE_DISCOVERY	0x003A
509*4882a593Smuzhiyun struct mgmt_cp_start_service_discovery {
510*4882a593Smuzhiyun 	__u8 type;
511*4882a593Smuzhiyun 	__s8 rssi;
512*4882a593Smuzhiyun 	__le16 uuid_count;
513*4882a593Smuzhiyun 	__u8 uuids[][16];
514*4882a593Smuzhiyun } __packed;
515*4882a593Smuzhiyun #define MGMT_START_SERVICE_DISCOVERY_SIZE 4
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun #define MGMT_OP_READ_LOCAL_OOB_EXT_DATA	0x003B
518*4882a593Smuzhiyun struct mgmt_cp_read_local_oob_ext_data {
519*4882a593Smuzhiyun 	__u8 type;
520*4882a593Smuzhiyun } __packed;
521*4882a593Smuzhiyun #define MGMT_READ_LOCAL_OOB_EXT_DATA_SIZE 1
522*4882a593Smuzhiyun struct mgmt_rp_read_local_oob_ext_data {
523*4882a593Smuzhiyun 	__u8    type;
524*4882a593Smuzhiyun 	__le16	eir_len;
525*4882a593Smuzhiyun 	__u8	eir[];
526*4882a593Smuzhiyun } __packed;
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun #define MGMT_OP_READ_EXT_INDEX_LIST	0x003C
529*4882a593Smuzhiyun #define MGMT_READ_EXT_INDEX_LIST_SIZE	0
530*4882a593Smuzhiyun struct mgmt_rp_read_ext_index_list {
531*4882a593Smuzhiyun 	__le16	num_controllers;
532*4882a593Smuzhiyun 	struct {
533*4882a593Smuzhiyun 		__le16 index;
534*4882a593Smuzhiyun 		__u8   type;
535*4882a593Smuzhiyun 		__u8   bus;
536*4882a593Smuzhiyun 	} entry[];
537*4882a593Smuzhiyun } __packed;
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun #define MGMT_OP_READ_ADV_FEATURES	0x0003D
540*4882a593Smuzhiyun #define MGMT_READ_ADV_FEATURES_SIZE	0
541*4882a593Smuzhiyun struct mgmt_rp_read_adv_features {
542*4882a593Smuzhiyun 	__le32 supported_flags;
543*4882a593Smuzhiyun 	__u8   max_adv_data_len;
544*4882a593Smuzhiyun 	__u8   max_scan_rsp_len;
545*4882a593Smuzhiyun 	__u8   max_instances;
546*4882a593Smuzhiyun 	__u8   num_instances;
547*4882a593Smuzhiyun 	__u8   instance[];
548*4882a593Smuzhiyun } __packed;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun #define MGMT_OP_ADD_ADVERTISING		0x003E
551*4882a593Smuzhiyun struct mgmt_cp_add_advertising {
552*4882a593Smuzhiyun 	__u8	instance;
553*4882a593Smuzhiyun 	__le32	flags;
554*4882a593Smuzhiyun 	__le16	duration;
555*4882a593Smuzhiyun 	__le16	timeout;
556*4882a593Smuzhiyun 	__u8	adv_data_len;
557*4882a593Smuzhiyun 	__u8	scan_rsp_len;
558*4882a593Smuzhiyun 	__u8	data[];
559*4882a593Smuzhiyun } __packed;
560*4882a593Smuzhiyun #define MGMT_ADD_ADVERTISING_SIZE	11
561*4882a593Smuzhiyun struct mgmt_rp_add_advertising {
562*4882a593Smuzhiyun 	__u8	instance;
563*4882a593Smuzhiyun } __packed;
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun #define MGMT_ADV_FLAG_CONNECTABLE	BIT(0)
566*4882a593Smuzhiyun #define MGMT_ADV_FLAG_DISCOV		BIT(1)
567*4882a593Smuzhiyun #define MGMT_ADV_FLAG_LIMITED_DISCOV	BIT(2)
568*4882a593Smuzhiyun #define MGMT_ADV_FLAG_MANAGED_FLAGS	BIT(3)
569*4882a593Smuzhiyun #define MGMT_ADV_FLAG_TX_POWER		BIT(4)
570*4882a593Smuzhiyun #define MGMT_ADV_FLAG_APPEARANCE	BIT(5)
571*4882a593Smuzhiyun #define MGMT_ADV_FLAG_LOCAL_NAME	BIT(6)
572*4882a593Smuzhiyun #define MGMT_ADV_FLAG_SEC_1M 		BIT(7)
573*4882a593Smuzhiyun #define MGMT_ADV_FLAG_SEC_2M 		BIT(8)
574*4882a593Smuzhiyun #define MGMT_ADV_FLAG_SEC_CODED 	BIT(9)
575*4882a593Smuzhiyun #define MGMT_ADV_FLAG_CAN_SET_TX_POWER	BIT(10)
576*4882a593Smuzhiyun #define MGMT_ADV_FLAG_HW_OFFLOAD	BIT(11)
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun #define MGMT_ADV_FLAG_SEC_MASK	(MGMT_ADV_FLAG_SEC_1M | MGMT_ADV_FLAG_SEC_2M | \
579*4882a593Smuzhiyun 				 MGMT_ADV_FLAG_SEC_CODED)
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun #define MGMT_OP_REMOVE_ADVERTISING	0x003F
582*4882a593Smuzhiyun struct mgmt_cp_remove_advertising {
583*4882a593Smuzhiyun 	__u8	instance;
584*4882a593Smuzhiyun } __packed;
585*4882a593Smuzhiyun #define MGMT_REMOVE_ADVERTISING_SIZE	1
586*4882a593Smuzhiyun struct mgmt_rp_remove_advertising {
587*4882a593Smuzhiyun 	__u8	instance;
588*4882a593Smuzhiyun } __packed;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun #define MGMT_OP_GET_ADV_SIZE_INFO	0x0040
591*4882a593Smuzhiyun struct mgmt_cp_get_adv_size_info {
592*4882a593Smuzhiyun 	__u8	instance;
593*4882a593Smuzhiyun 	__le32	flags;
594*4882a593Smuzhiyun } __packed;
595*4882a593Smuzhiyun #define MGMT_GET_ADV_SIZE_INFO_SIZE	5
596*4882a593Smuzhiyun struct mgmt_rp_get_adv_size_info {
597*4882a593Smuzhiyun 	__u8	instance;
598*4882a593Smuzhiyun 	__le32	flags;
599*4882a593Smuzhiyun 	__u8	max_adv_data_len;
600*4882a593Smuzhiyun 	__u8	max_scan_rsp_len;
601*4882a593Smuzhiyun } __packed;
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun #define MGMT_OP_START_LIMITED_DISCOVERY	0x0041
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun #define MGMT_OP_READ_EXT_INFO		0x0042
606*4882a593Smuzhiyun #define MGMT_READ_EXT_INFO_SIZE		0
607*4882a593Smuzhiyun struct mgmt_rp_read_ext_info {
608*4882a593Smuzhiyun 	bdaddr_t bdaddr;
609*4882a593Smuzhiyun 	__u8     version;
610*4882a593Smuzhiyun 	__le16   manufacturer;
611*4882a593Smuzhiyun 	__le32   supported_settings;
612*4882a593Smuzhiyun 	__le32   current_settings;
613*4882a593Smuzhiyun 	__le16   eir_len;
614*4882a593Smuzhiyun 	__u8     eir[];
615*4882a593Smuzhiyun } __packed;
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #define MGMT_OP_SET_APPEARANCE		0x0043
618*4882a593Smuzhiyun struct mgmt_cp_set_appearance {
619*4882a593Smuzhiyun 	__le16	appearance;
620*4882a593Smuzhiyun } __packed;
621*4882a593Smuzhiyun #define MGMT_SET_APPEARANCE_SIZE	2
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun #define MGMT_OP_GET_PHY_CONFIGURATION	0x0044
624*4882a593Smuzhiyun struct mgmt_rp_get_phy_confguration {
625*4882a593Smuzhiyun 	__le32	supported_phys;
626*4882a593Smuzhiyun 	__le32	configurable_phys;
627*4882a593Smuzhiyun 	__le32	selected_phys;
628*4882a593Smuzhiyun } __packed;
629*4882a593Smuzhiyun #define MGMT_GET_PHY_CONFIGURATION_SIZE	0
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun #define MGMT_PHY_BR_1M_1SLOT	0x00000001
632*4882a593Smuzhiyun #define MGMT_PHY_BR_1M_3SLOT	0x00000002
633*4882a593Smuzhiyun #define MGMT_PHY_BR_1M_5SLOT	0x00000004
634*4882a593Smuzhiyun #define MGMT_PHY_EDR_2M_1SLOT	0x00000008
635*4882a593Smuzhiyun #define MGMT_PHY_EDR_2M_3SLOT	0x00000010
636*4882a593Smuzhiyun #define MGMT_PHY_EDR_2M_5SLOT	0x00000020
637*4882a593Smuzhiyun #define MGMT_PHY_EDR_3M_1SLOT	0x00000040
638*4882a593Smuzhiyun #define MGMT_PHY_EDR_3M_3SLOT	0x00000080
639*4882a593Smuzhiyun #define MGMT_PHY_EDR_3M_5SLOT	0x00000100
640*4882a593Smuzhiyun #define MGMT_PHY_LE_1M_TX		0x00000200
641*4882a593Smuzhiyun #define MGMT_PHY_LE_1M_RX		0x00000400
642*4882a593Smuzhiyun #define MGMT_PHY_LE_2M_TX		0x00000800
643*4882a593Smuzhiyun #define MGMT_PHY_LE_2M_RX		0x00001000
644*4882a593Smuzhiyun #define MGMT_PHY_LE_CODED_TX	0x00002000
645*4882a593Smuzhiyun #define MGMT_PHY_LE_CODED_RX	0x00004000
646*4882a593Smuzhiyun 
647*4882a593Smuzhiyun #define MGMT_PHY_BREDR_MASK (MGMT_PHY_BR_1M_1SLOT | MGMT_PHY_BR_1M_3SLOT | \
648*4882a593Smuzhiyun 			     MGMT_PHY_BR_1M_5SLOT | MGMT_PHY_EDR_2M_1SLOT | \
649*4882a593Smuzhiyun 			     MGMT_PHY_EDR_2M_3SLOT | MGMT_PHY_EDR_2M_5SLOT | \
650*4882a593Smuzhiyun 			     MGMT_PHY_EDR_3M_1SLOT | MGMT_PHY_EDR_3M_3SLOT | \
651*4882a593Smuzhiyun 			     MGMT_PHY_EDR_3M_5SLOT)
652*4882a593Smuzhiyun #define MGMT_PHY_LE_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_1M_RX | \
653*4882a593Smuzhiyun 			  MGMT_PHY_LE_2M_TX | MGMT_PHY_LE_2M_RX | \
654*4882a593Smuzhiyun 			  MGMT_PHY_LE_CODED_TX | MGMT_PHY_LE_CODED_RX)
655*4882a593Smuzhiyun #define MGMT_PHY_LE_TX_MASK (MGMT_PHY_LE_1M_TX | MGMT_PHY_LE_2M_TX | \
656*4882a593Smuzhiyun 			     MGMT_PHY_LE_CODED_TX)
657*4882a593Smuzhiyun #define MGMT_PHY_LE_RX_MASK (MGMT_PHY_LE_1M_RX | MGMT_PHY_LE_2M_RX | \
658*4882a593Smuzhiyun 			     MGMT_PHY_LE_CODED_RX)
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun #define MGMT_OP_SET_PHY_CONFIGURATION	0x0045
661*4882a593Smuzhiyun struct mgmt_cp_set_phy_confguration {
662*4882a593Smuzhiyun 	__le32	selected_phys;
663*4882a593Smuzhiyun } __packed;
664*4882a593Smuzhiyun #define MGMT_SET_PHY_CONFIGURATION_SIZE	4
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun #define MGMT_OP_SET_BLOCKED_KEYS	0x0046
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun #define HCI_BLOCKED_KEY_TYPE_LINKKEY	0x00
669*4882a593Smuzhiyun #define HCI_BLOCKED_KEY_TYPE_LTK	0x01
670*4882a593Smuzhiyun #define HCI_BLOCKED_KEY_TYPE_IRK	0x02
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun struct mgmt_blocked_key_info {
673*4882a593Smuzhiyun 	__u8 type;
674*4882a593Smuzhiyun 	__u8 val[16];
675*4882a593Smuzhiyun } __packed;
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun struct mgmt_cp_set_blocked_keys {
678*4882a593Smuzhiyun 	__le16 key_count;
679*4882a593Smuzhiyun 	struct mgmt_blocked_key_info keys[];
680*4882a593Smuzhiyun } __packed;
681*4882a593Smuzhiyun #define MGMT_OP_SET_BLOCKED_KEYS_SIZE 2
682*4882a593Smuzhiyun 
683*4882a593Smuzhiyun #define MGMT_OP_SET_WIDEBAND_SPEECH	0x0047
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun #define MGMT_OP_READ_SECURITY_INFO	0x0048
686*4882a593Smuzhiyun #define MGMT_READ_SECURITY_INFO_SIZE	0
687*4882a593Smuzhiyun struct mgmt_rp_read_security_info {
688*4882a593Smuzhiyun 	__le16   sec_len;
689*4882a593Smuzhiyun 	__u8     sec[];
690*4882a593Smuzhiyun } __packed;
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun #define MGMT_OP_READ_EXP_FEATURES_INFO	0x0049
693*4882a593Smuzhiyun #define MGMT_READ_EXP_FEATURES_INFO_SIZE 0
694*4882a593Smuzhiyun struct mgmt_rp_read_exp_features_info {
695*4882a593Smuzhiyun 	__le16 feature_count;
696*4882a593Smuzhiyun 	struct {
697*4882a593Smuzhiyun 		__u8   uuid[16];
698*4882a593Smuzhiyun 		__le32 flags;
699*4882a593Smuzhiyun 	} features[];
700*4882a593Smuzhiyun } __packed;
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun #define MGMT_OP_SET_EXP_FEATURE		0x004a
703*4882a593Smuzhiyun struct mgmt_cp_set_exp_feature {
704*4882a593Smuzhiyun 	__u8   uuid[16];
705*4882a593Smuzhiyun 	__u8   param[];
706*4882a593Smuzhiyun } __packed;
707*4882a593Smuzhiyun #define MGMT_SET_EXP_FEATURE_SIZE	16
708*4882a593Smuzhiyun struct mgmt_rp_set_exp_feature {
709*4882a593Smuzhiyun 	__u8   uuid[16];
710*4882a593Smuzhiyun 	__le32 flags;
711*4882a593Smuzhiyun } __packed;
712*4882a593Smuzhiyun 
713*4882a593Smuzhiyun #define MGMT_OP_READ_DEF_SYSTEM_CONFIG	0x004b
714*4882a593Smuzhiyun #define MGMT_READ_DEF_SYSTEM_CONFIG_SIZE	0
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun #define MGMT_OP_SET_DEF_SYSTEM_CONFIG	0x004c
717*4882a593Smuzhiyun #define MGMT_SET_DEF_SYSTEM_CONFIG_SIZE		0
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun #define MGMT_OP_READ_DEF_RUNTIME_CONFIG	0x004d
720*4882a593Smuzhiyun #define MGMT_READ_DEF_RUNTIME_CONFIG_SIZE	0
721*4882a593Smuzhiyun 
722*4882a593Smuzhiyun #define MGMT_OP_SET_DEF_RUNTIME_CONFIG	0x004e
723*4882a593Smuzhiyun #define MGMT_SET_DEF_RUNTIME_CONFIG_SIZE	0
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun #define MGMT_OP_GET_DEVICE_FLAGS	0x004F
726*4882a593Smuzhiyun #define MGMT_GET_DEVICE_FLAGS_SIZE	7
727*4882a593Smuzhiyun struct mgmt_cp_get_device_flags {
728*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
729*4882a593Smuzhiyun } __packed;
730*4882a593Smuzhiyun struct mgmt_rp_get_device_flags {
731*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
732*4882a593Smuzhiyun 	__le32 supported_flags;
733*4882a593Smuzhiyun 	__le32 current_flags;
734*4882a593Smuzhiyun } __packed;
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun #define MGMT_OP_SET_DEVICE_FLAGS	0x0050
737*4882a593Smuzhiyun #define MGMT_SET_DEVICE_FLAGS_SIZE	11
738*4882a593Smuzhiyun struct mgmt_cp_set_device_flags {
739*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
740*4882a593Smuzhiyun 	__le32 current_flags;
741*4882a593Smuzhiyun } __packed;
742*4882a593Smuzhiyun struct mgmt_rp_set_device_flags {
743*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
744*4882a593Smuzhiyun } __packed;
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun #define MGMT_ADV_MONITOR_FEATURE_MASK_OR_PATTERNS    BIT(0)
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun #define MGMT_OP_READ_ADV_MONITOR_FEATURES	0x0051
749*4882a593Smuzhiyun #define MGMT_READ_ADV_MONITOR_FEATURES_SIZE	0
750*4882a593Smuzhiyun struct mgmt_rp_read_adv_monitor_features {
751*4882a593Smuzhiyun 	__le32 supported_features;
752*4882a593Smuzhiyun 	__le32 enabled_features;
753*4882a593Smuzhiyun 	__le16 max_num_handles;
754*4882a593Smuzhiyun 	__u8 max_num_patterns;
755*4882a593Smuzhiyun 	__le16 num_handles;
756*4882a593Smuzhiyun 	__le16 handles[];
757*4882a593Smuzhiyun }  __packed;
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun struct mgmt_adv_pattern {
760*4882a593Smuzhiyun 	__u8 ad_type;
761*4882a593Smuzhiyun 	__u8 offset;
762*4882a593Smuzhiyun 	__u8 length;
763*4882a593Smuzhiyun 	__u8 value[31];
764*4882a593Smuzhiyun } __packed;
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun #define MGMT_OP_ADD_ADV_PATTERNS_MONITOR	0x0052
767*4882a593Smuzhiyun struct mgmt_cp_add_adv_patterns_monitor {
768*4882a593Smuzhiyun 	__u8 pattern_count;
769*4882a593Smuzhiyun 	struct mgmt_adv_pattern patterns[];
770*4882a593Smuzhiyun } __packed;
771*4882a593Smuzhiyun #define MGMT_ADD_ADV_PATTERNS_MONITOR_SIZE	1
772*4882a593Smuzhiyun struct mgmt_rp_add_adv_patterns_monitor {
773*4882a593Smuzhiyun 	__le16 monitor_handle;
774*4882a593Smuzhiyun } __packed;
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun #define MGMT_OP_REMOVE_ADV_MONITOR		0x0053
777*4882a593Smuzhiyun struct mgmt_cp_remove_adv_monitor {
778*4882a593Smuzhiyun 	__le16 monitor_handle;
779*4882a593Smuzhiyun } __packed;
780*4882a593Smuzhiyun #define MGMT_REMOVE_ADV_MONITOR_SIZE		2
781*4882a593Smuzhiyun struct mgmt_rp_remove_adv_monitor {
782*4882a593Smuzhiyun 	__le16 monitor_handle;
783*4882a593Smuzhiyun } __packed;
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun #define MGMT_EV_CMD_COMPLETE		0x0001
786*4882a593Smuzhiyun struct mgmt_ev_cmd_complete {
787*4882a593Smuzhiyun 	__le16	opcode;
788*4882a593Smuzhiyun 	__u8	status;
789*4882a593Smuzhiyun 	__u8	data[];
790*4882a593Smuzhiyun } __packed;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun #define MGMT_EV_CMD_STATUS		0x0002
793*4882a593Smuzhiyun struct mgmt_ev_cmd_status {
794*4882a593Smuzhiyun 	__le16	opcode;
795*4882a593Smuzhiyun 	__u8	status;
796*4882a593Smuzhiyun } __packed;
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun #define MGMT_EV_CONTROLLER_ERROR	0x0003
799*4882a593Smuzhiyun struct mgmt_ev_controller_error {
800*4882a593Smuzhiyun 	__u8	error_code;
801*4882a593Smuzhiyun } __packed;
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun #define MGMT_EV_INDEX_ADDED		0x0004
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun #define MGMT_EV_INDEX_REMOVED		0x0005
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun #define MGMT_EV_NEW_SETTINGS		0x0006
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun #define MGMT_EV_CLASS_OF_DEV_CHANGED	0x0007
810*4882a593Smuzhiyun struct mgmt_ev_class_of_dev_changed {
811*4882a593Smuzhiyun 	__u8	dev_class[3];
812*4882a593Smuzhiyun };
813*4882a593Smuzhiyun 
814*4882a593Smuzhiyun #define MGMT_EV_LOCAL_NAME_CHANGED	0x0008
815*4882a593Smuzhiyun struct mgmt_ev_local_name_changed {
816*4882a593Smuzhiyun 	__u8	name[MGMT_MAX_NAME_LENGTH];
817*4882a593Smuzhiyun 	__u8	short_name[MGMT_MAX_SHORT_NAME_LENGTH];
818*4882a593Smuzhiyun } __packed;
819*4882a593Smuzhiyun 
820*4882a593Smuzhiyun #define MGMT_EV_NEW_LINK_KEY		0x0009
821*4882a593Smuzhiyun struct mgmt_ev_new_link_key {
822*4882a593Smuzhiyun 	__u8	store_hint;
823*4882a593Smuzhiyun 	struct mgmt_link_key_info key;
824*4882a593Smuzhiyun } __packed;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun #define MGMT_EV_NEW_LONG_TERM_KEY	0x000A
827*4882a593Smuzhiyun struct mgmt_ev_new_long_term_key {
828*4882a593Smuzhiyun 	__u8	store_hint;
829*4882a593Smuzhiyun 	struct mgmt_ltk_info key;
830*4882a593Smuzhiyun } __packed;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun #define MGMT_EV_DEVICE_CONNECTED	0x000B
833*4882a593Smuzhiyun struct mgmt_ev_device_connected {
834*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
835*4882a593Smuzhiyun 	__le32	flags;
836*4882a593Smuzhiyun 	__le16	eir_len;
837*4882a593Smuzhiyun 	__u8	eir[];
838*4882a593Smuzhiyun } __packed;
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_UNKNOWN	0x00
841*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_TIMEOUT	0x01
842*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_LOCAL_HOST	0x02
843*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_REMOTE		0x03
844*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_AUTH_FAILURE	0x04
845*4882a593Smuzhiyun #define MGMT_DEV_DISCONN_LOCAL_HOST_SUSPEND	0x05
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun #define MGMT_EV_DEVICE_DISCONNECTED	0x000C
848*4882a593Smuzhiyun struct mgmt_ev_device_disconnected {
849*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
850*4882a593Smuzhiyun 	__u8	reason;
851*4882a593Smuzhiyun } __packed;
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun #define MGMT_EV_CONNECT_FAILED		0x000D
854*4882a593Smuzhiyun struct mgmt_ev_connect_failed {
855*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
856*4882a593Smuzhiyun 	__u8	status;
857*4882a593Smuzhiyun } __packed;
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun #define MGMT_EV_PIN_CODE_REQUEST	0x000E
860*4882a593Smuzhiyun struct mgmt_ev_pin_code_request {
861*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
862*4882a593Smuzhiyun 	__u8	secure;
863*4882a593Smuzhiyun } __packed;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun #define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
866*4882a593Smuzhiyun struct mgmt_ev_user_confirm_request {
867*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
868*4882a593Smuzhiyun 	__u8	confirm_hint;
869*4882a593Smuzhiyun 	__le32	value;
870*4882a593Smuzhiyun } __packed;
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun #define MGMT_EV_USER_PASSKEY_REQUEST	0x0010
873*4882a593Smuzhiyun struct mgmt_ev_user_passkey_request {
874*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
875*4882a593Smuzhiyun } __packed;
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun #define MGMT_EV_AUTH_FAILED		0x0011
878*4882a593Smuzhiyun struct mgmt_ev_auth_failed {
879*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
880*4882a593Smuzhiyun 	__u8	status;
881*4882a593Smuzhiyun } __packed;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun #define MGMT_DEV_FOUND_CONFIRM_NAME    0x01
884*4882a593Smuzhiyun #define MGMT_DEV_FOUND_LEGACY_PAIRING  0x02
885*4882a593Smuzhiyun #define MGMT_DEV_FOUND_NOT_CONNECTABLE 0x04
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun #define MGMT_EV_DEVICE_FOUND		0x0012
888*4882a593Smuzhiyun struct mgmt_ev_device_found {
889*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
890*4882a593Smuzhiyun 	__s8	rssi;
891*4882a593Smuzhiyun 	__le32	flags;
892*4882a593Smuzhiyun 	__le16	eir_len;
893*4882a593Smuzhiyun 	__u8	eir[];
894*4882a593Smuzhiyun } __packed;
895*4882a593Smuzhiyun 
896*4882a593Smuzhiyun #define MGMT_EV_DISCOVERING		0x0013
897*4882a593Smuzhiyun struct mgmt_ev_discovering {
898*4882a593Smuzhiyun 	__u8	type;
899*4882a593Smuzhiyun 	__u8	discovering;
900*4882a593Smuzhiyun } __packed;
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun #define MGMT_EV_DEVICE_BLOCKED		0x0014
903*4882a593Smuzhiyun struct mgmt_ev_device_blocked {
904*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
905*4882a593Smuzhiyun } __packed;
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun #define MGMT_EV_DEVICE_UNBLOCKED	0x0015
908*4882a593Smuzhiyun struct mgmt_ev_device_unblocked {
909*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
910*4882a593Smuzhiyun } __packed;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun #define MGMT_EV_DEVICE_UNPAIRED		0x0016
913*4882a593Smuzhiyun struct mgmt_ev_device_unpaired {
914*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
915*4882a593Smuzhiyun } __packed;
916*4882a593Smuzhiyun 
917*4882a593Smuzhiyun #define MGMT_EV_PASSKEY_NOTIFY		0x0017
918*4882a593Smuzhiyun struct mgmt_ev_passkey_notify {
919*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
920*4882a593Smuzhiyun 	__le32	passkey;
921*4882a593Smuzhiyun 	__u8	entered;
922*4882a593Smuzhiyun } __packed;
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun #define MGMT_EV_NEW_IRK			0x0018
925*4882a593Smuzhiyun struct mgmt_ev_new_irk {
926*4882a593Smuzhiyun 	__u8     store_hint;
927*4882a593Smuzhiyun 	bdaddr_t rpa;
928*4882a593Smuzhiyun 	struct mgmt_irk_info irk;
929*4882a593Smuzhiyun } __packed;
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun #define MGMT_CSRK_LOCAL_UNAUTHENTICATED		0x00
932*4882a593Smuzhiyun #define MGMT_CSRK_REMOTE_UNAUTHENTICATED	0x01
933*4882a593Smuzhiyun #define MGMT_CSRK_LOCAL_AUTHENTICATED		0x02
934*4882a593Smuzhiyun #define MGMT_CSRK_REMOTE_AUTHENTICATED		0x03
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun struct mgmt_csrk_info {
937*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
938*4882a593Smuzhiyun 	__u8 type;
939*4882a593Smuzhiyun 	__u8 val[16];
940*4882a593Smuzhiyun } __packed;
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun #define MGMT_EV_NEW_CSRK		0x0019
943*4882a593Smuzhiyun struct mgmt_ev_new_csrk {
944*4882a593Smuzhiyun 	__u8 store_hint;
945*4882a593Smuzhiyun 	struct mgmt_csrk_info key;
946*4882a593Smuzhiyun } __packed;
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun #define MGMT_EV_DEVICE_ADDED		0x001a
949*4882a593Smuzhiyun struct mgmt_ev_device_added {
950*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
951*4882a593Smuzhiyun 	__u8 action;
952*4882a593Smuzhiyun } __packed;
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun #define MGMT_EV_DEVICE_REMOVED		0x001b
955*4882a593Smuzhiyun struct mgmt_ev_device_removed {
956*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
957*4882a593Smuzhiyun } __packed;
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun #define MGMT_EV_NEW_CONN_PARAM		0x001c
960*4882a593Smuzhiyun struct mgmt_ev_new_conn_param {
961*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
962*4882a593Smuzhiyun 	__u8 store_hint;
963*4882a593Smuzhiyun 	__le16 min_interval;
964*4882a593Smuzhiyun 	__le16 max_interval;
965*4882a593Smuzhiyun 	__le16 latency;
966*4882a593Smuzhiyun 	__le16 timeout;
967*4882a593Smuzhiyun } __packed;
968*4882a593Smuzhiyun 
969*4882a593Smuzhiyun #define MGMT_EV_UNCONF_INDEX_ADDED	0x001d
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun #define MGMT_EV_UNCONF_INDEX_REMOVED	0x001e
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun #define MGMT_EV_NEW_CONFIG_OPTIONS	0x001f
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun struct mgmt_ev_ext_index {
976*4882a593Smuzhiyun 	__u8 type;
977*4882a593Smuzhiyun 	__u8 bus;
978*4882a593Smuzhiyun } __packed;
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun #define MGMT_EV_EXT_INDEX_ADDED		0x0020
981*4882a593Smuzhiyun 
982*4882a593Smuzhiyun #define MGMT_EV_EXT_INDEX_REMOVED	0x0021
983*4882a593Smuzhiyun 
984*4882a593Smuzhiyun #define MGMT_EV_LOCAL_OOB_DATA_UPDATED	0x0022
985*4882a593Smuzhiyun struct mgmt_ev_local_oob_data_updated {
986*4882a593Smuzhiyun 	__u8    type;
987*4882a593Smuzhiyun 	__le16	eir_len;
988*4882a593Smuzhiyun 	__u8	eir[];
989*4882a593Smuzhiyun } __packed;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun #define MGMT_EV_ADVERTISING_ADDED	0x0023
992*4882a593Smuzhiyun struct mgmt_ev_advertising_added {
993*4882a593Smuzhiyun 	__u8    instance;
994*4882a593Smuzhiyun } __packed;
995*4882a593Smuzhiyun 
996*4882a593Smuzhiyun #define MGMT_EV_ADVERTISING_REMOVED	0x0024
997*4882a593Smuzhiyun struct mgmt_ev_advertising_removed {
998*4882a593Smuzhiyun 	__u8    instance;
999*4882a593Smuzhiyun } __packed;
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun #define MGMT_EV_EXT_INFO_CHANGED	0x0025
1002*4882a593Smuzhiyun struct mgmt_ev_ext_info_changed {
1003*4882a593Smuzhiyun 	__le16	eir_len;
1004*4882a593Smuzhiyun 	__u8	eir[];
1005*4882a593Smuzhiyun } __packed;
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun #define MGMT_EV_PHY_CONFIGURATION_CHANGED	0x0026
1008*4882a593Smuzhiyun struct mgmt_ev_phy_configuration_changed {
1009*4882a593Smuzhiyun 	__le32	selected_phys;
1010*4882a593Smuzhiyun } __packed;
1011*4882a593Smuzhiyun 
1012*4882a593Smuzhiyun #define MGMT_EV_EXP_FEATURE_CHANGED	0x0027
1013*4882a593Smuzhiyun struct mgmt_ev_exp_feature_changed {
1014*4882a593Smuzhiyun 	__u8	uuid[16];
1015*4882a593Smuzhiyun 	__le32	flags;
1016*4882a593Smuzhiyun } __packed;
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun #define MGMT_EV_DEVICE_FLAGS_CHANGED		0x002a
1019*4882a593Smuzhiyun struct mgmt_ev_device_flags_changed {
1020*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
1021*4882a593Smuzhiyun 	__le32 supported_flags;
1022*4882a593Smuzhiyun 	__le32 current_flags;
1023*4882a593Smuzhiyun } __packed;
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun #define MGMT_EV_ADV_MONITOR_ADDED	0x002b
1026*4882a593Smuzhiyun struct mgmt_ev_adv_monitor_added {
1027*4882a593Smuzhiyun 	__le16 monitor_handle;
1028*4882a593Smuzhiyun }  __packed;
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun #define MGMT_EV_ADV_MONITOR_REMOVED	0x002c
1031*4882a593Smuzhiyun struct mgmt_ev_adv_monitor_removed {
1032*4882a593Smuzhiyun 	__le16 monitor_handle;
1033*4882a593Smuzhiyun }  __packed;
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun #define MGMT_EV_CONTROLLER_SUSPEND		0x002d
1036*4882a593Smuzhiyun struct mgmt_ev_controller_suspend {
1037*4882a593Smuzhiyun 	__u8	suspend_state;
1038*4882a593Smuzhiyun } __packed;
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun #define MGMT_EV_CONTROLLER_RESUME		0x002e
1041*4882a593Smuzhiyun struct mgmt_ev_controller_resume {
1042*4882a593Smuzhiyun 	__u8	wake_reason;
1043*4882a593Smuzhiyun 	struct mgmt_addr_info addr;
1044*4882a593Smuzhiyun } __packed;
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun #define MGMT_WAKE_REASON_NON_BT_WAKE		0x0
1047*4882a593Smuzhiyun #define MGMT_WAKE_REASON_UNEXPECTED		0x1
1048*4882a593Smuzhiyun #define MGMT_WAKE_REASON_REMOTE_WAKE		0x2
1049