1/*
2 *  BlueZ - Bluetooth protocol stack for Linux
3 *
4 *  Copyright (C) 2010  Nokia Corporation
5 *  Copyright (C) 2010  Marcel Holtmann <marcel@holtmann.org>
6 *
7 *
8 *  This program is free software; you can redistribute it and/or modify
9 *  it under the terms of the GNU General Public License as published by
10 *  the Free Software Foundation; either version 2 of the License, or
11 *  (at your option) any later version.
12 *
13 *  This program is distributed in the hope that it will be useful,
14 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *  GNU General Public License for more details.
17 *
18 *  You should have received a copy of the GNU General Public License
19 *  along with this program; if not, write to the Free Software
20 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21 *
22 */
23
24#ifndef __packed
25#define __packed __attribute__((packed))
26#endif
27
28#define MGMT_INDEX_NONE			0xFFFF
29
30struct mgmt_hdr {
31	uint16_t opcode;
32	uint16_t index;
33	uint16_t len;
34} __packed;
35#define MGMT_HDR_SIZE	6
36
37#define MGMT_OP_READ_VERSION		0x0001
38struct mgmt_rp_read_version {
39	uint8_t version;
40	uint16_t revision;
41} __packed;
42
43#define MGMT_OP_READ_FEATURES		0x0002
44struct mgmt_rp_read_features {
45	uint8_t features[8];
46} __packed;
47
48#define MGMT_OP_READ_INDEX_LIST		0x0003
49struct mgmt_rp_read_index_list {
50	uint16_t num_controllers;
51	uint16_t index[0];
52} __packed;
53
54/* Reserve one extra byte for names in management messages so that they
55 * are always guaranteed to be nul-terminated */
56#define MGMT_MAX_NAME_LENGTH		(HCI_MAX_NAME_LENGTH + 1)
57
58#define MGMT_OP_READ_INFO		0x0004
59struct mgmt_rp_read_info {
60	uint8_t type;
61	uint8_t powered;
62	uint8_t connectable;
63	uint8_t discoverable;
64	uint8_t pairable;
65	uint8_t sec_mode;
66	bdaddr_t bdaddr;
67	uint8_t dev_class[3];
68	uint8_t features[8];
69	uint16_t manufacturer;
70	uint8_t hci_ver;
71	uint16_t hci_rev;
72	uint8_t name[MGMT_MAX_NAME_LENGTH];
73} __packed;
74
75struct mgmt_mode {
76	uint8_t val;
77} __packed;
78
79#define MGMT_OP_SET_POWERED		0x0005
80
81#define MGMT_OP_SET_DISCOVERABLE	0x0006
82
83#define MGMT_OP_SET_CONNECTABLE		0x0007
84
85#define MGMT_OP_SET_PAIRABLE		0x0008
86
87#define MGMT_OP_ADD_UUID		0x0009
88struct mgmt_cp_add_uuid {
89	uint8_t uuid[16];
90	uint8_t svc_hint;
91} __packed;
92
93#define MGMT_OP_REMOVE_UUID		0x000A
94struct mgmt_cp_remove_uuid {
95	uint8_t uuid[16];
96} __packed;
97
98#define MGMT_OP_SET_DEV_CLASS		0x000B
99struct mgmt_cp_set_dev_class {
100	uint8_t major;
101	uint8_t minor;
102} __packed;
103
104#define MGMT_OP_SET_SERVICE_CACHE	0x000C
105struct mgmt_cp_set_service_cache {
106	uint8_t enable;
107} __packed;
108
109struct mgmt_key_info {
110	bdaddr_t bdaddr;
111	uint8_t type;
112	uint8_t val[16];
113	uint8_t pin_len;
114} __packed;
115
116#define MGMT_OP_LOAD_KEYS		0x000D
117struct mgmt_cp_load_keys {
118	uint8_t debug_keys;
119	uint16_t key_count;
120	struct mgmt_key_info keys[0];
121} __packed;
122
123#define MGMT_OP_REMOVE_KEY		0x000E
124struct mgmt_cp_remove_key {
125	bdaddr_t bdaddr;
126	uint8_t disconnect;
127} __packed;
128
129#define MGMT_OP_DISCONNECT		0x000F
130struct mgmt_cp_disconnect {
131	bdaddr_t bdaddr;
132} __packed;
133struct mgmt_rp_disconnect {
134	bdaddr_t bdaddr;
135} __packed;
136
137#define MGMT_OP_GET_CONNECTIONS		0x0010
138struct mgmt_rp_get_connections {
139	uint16_t conn_count;
140	bdaddr_t conn[0];
141} __packed;
142
143#define MGMT_OP_PIN_CODE_REPLY		0x0011
144struct mgmt_cp_pin_code_reply {
145	bdaddr_t bdaddr;
146	uint8_t pin_len;
147	uint8_t pin_code[16];
148} __packed;
149
150#define MGMT_OP_PIN_CODE_NEG_REPLY	0x0012
151struct mgmt_cp_pin_code_neg_reply {
152	bdaddr_t bdaddr;
153} __packed;
154
155#define MGMT_OP_SET_IO_CAPABILITY	0x0013
156struct mgmt_cp_set_io_capability {
157	uint8_t io_capability;
158} __packed;
159
160#define MGMT_OP_PAIR_DEVICE		0x0014
161struct mgmt_cp_pair_device {
162	bdaddr_t bdaddr;
163	uint8_t io_cap;
164} __packed;
165struct mgmt_rp_pair_device {
166	bdaddr_t bdaddr;
167	uint8_t status;
168} __packed;
169
170#define MGMT_OP_USER_CONFIRM_REPLY	0x0015
171struct mgmt_cp_user_confirm_reply {
172	bdaddr_t bdaddr;
173} __packed;
174struct mgmt_rp_user_confirm_reply {
175	bdaddr_t bdaddr;
176	uint8_t status;
177} __packed;
178
179#define MGMT_OP_USER_CONFIRM_NEG_REPLY	0x0016
180
181#define MGMT_OP_SET_LOCAL_NAME		0x0017
182struct mgmt_cp_set_local_name {
183	uint8_t name[MGMT_MAX_NAME_LENGTH];
184} __packed;
185
186#define MGMT_OP_READ_LOCAL_OOB_DATA	0x0018
187struct mgmt_rp_read_local_oob_data {
188	uint8_t hash[16];
189	uint8_t randomizer[16];
190} __packed;
191
192#define MGMT_OP_ADD_REMOTE_OOB_DATA	0x0019
193struct mgmt_cp_add_remote_oob_data {
194	bdaddr_t bdaddr;
195	uint8_t hash[16];
196	uint8_t randomizer[16];
197} __packed;
198
199#define MGMT_OP_REMOVE_REMOTE_OOB_DATA	0x001A
200struct mgmt_cp_remove_remote_oob_data {
201	bdaddr_t bdaddr;
202} __packed;
203
204#define MGMT_OP_START_DISCOVERY		0x001B
205
206#define MGMT_OP_STOP_DISCOVERY		0x001C
207
208#define MGMT_EV_CMD_COMPLETE		0x0001
209struct mgmt_ev_cmd_complete {
210	uint16_t opcode;
211	uint8_t data[0];
212} __packed;
213
214#define MGMT_EV_CMD_STATUS		0x0002
215struct mgmt_ev_cmd_status {
216	uint8_t status;
217	uint16_t opcode;
218} __packed;
219
220#define MGMT_EV_CONTROLLER_ERROR	0x0003
221struct mgmt_ev_controller_error {
222	uint8_t error_code;
223} __packed;
224
225#define MGMT_EV_INDEX_ADDED		0x0004
226
227#define MGMT_EV_INDEX_REMOVED		0x0005
228
229#define MGMT_EV_POWERED			0x0006
230
231#define MGMT_EV_DISCOVERABLE		0x0007
232
233#define MGMT_EV_CONNECTABLE		0x0008
234
235#define MGMT_EV_PAIRABLE		0x0009
236
237#define MGMT_EV_NEW_KEY			0x000A
238struct mgmt_ev_new_key {
239	uint8_t store_hint;
240	struct mgmt_key_info key;
241} __packed;
242
243#define MGMT_EV_DEVICE_CONNECTED	0x000B
244struct mgmt_ev_device_connected {
245	bdaddr_t bdaddr;
246} __packed;
247
248#define MGMT_EV_DEVICE_DISCONNECTED	0x000C
249struct mgmt_ev_device_disconnected {
250	bdaddr_t bdaddr;
251} __packed;
252
253#define MGMT_EV_CONNECT_FAILED		0x000D
254struct mgmt_ev_connect_failed {
255	bdaddr_t bdaddr;
256	uint8_t status;
257} __packed;
258
259#define MGMT_EV_PIN_CODE_REQUEST	0x000E
260struct mgmt_ev_pin_code_request {
261	bdaddr_t bdaddr;
262	uint8_t secure;
263} __packed;
264
265#define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
266struct mgmt_ev_user_confirm_request {
267	bdaddr_t bdaddr;
268	uint8_t confirm_hint;
269	uint32_t value;
270} __packed;
271
272#define MGMT_EV_AUTH_FAILED		0x0010
273struct mgmt_ev_auth_failed {
274	bdaddr_t bdaddr;
275	uint8_t status;
276} __packed;
277
278#define MGMT_EV_LOCAL_NAME_CHANGED	0x0011
279struct mgmt_ev_local_name_changed {
280	uint8_t name[MGMT_MAX_NAME_LENGTH];
281} __packed;
282
283#define MGMT_EV_DEVICE_FOUND		0x0012
284struct mgmt_ev_device_found {
285	bdaddr_t bdaddr;
286	uint8_t dev_class[3];
287	int8_t rssi;
288	uint8_t eir[HCI_MAX_EIR_LENGTH];
289} __packed;
290
291#define MGMT_EV_REMOTE_NAME		0x0013
292struct mgmt_ev_remote_name {
293	bdaddr_t bdaddr;
294	uint8_t name[MGMT_MAX_NAME_LENGTH];
295} __packed;
296
297#define MGMT_EV_DISCOVERING		0x0014
298