tizen 2.3.1 release
[framework/connectivity/bluez.git] / lib / mgmt.h
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
30 #define MGMT_STATUS_SUCCESS             0x00
31 #define MGMT_STATUS_UNKNOWN_COMMAND     0x01
32 #define MGMT_STATUS_NOT_CONNECTED       0x02
33 #define MGMT_STATUS_FAILED              0x03
34 #define MGMT_STATUS_CONNECT_FAILED      0x04
35 #define MGMT_STATUS_AUTH_FAILED         0x05
36 #define MGMT_STATUS_NOT_PAIRED          0x06
37 #define MGMT_STATUS_NO_RESOURCES        0x07
38 #define MGMT_STATUS_TIMEOUT             0x08
39 #define MGMT_STATUS_ALREADY_CONNECTED   0x09
40 #define MGMT_STATUS_BUSY                0x0a
41 #define MGMT_STATUS_REJECTED            0x0b
42 #define MGMT_STATUS_NOT_SUPPORTED       0x0c
43 #define MGMT_STATUS_INVALID_PARAMS      0x0d
44 #define MGMT_STATUS_DISCONNECTED        0x0e
45 #define MGMT_STATUS_NOT_POWERED         0x0f
46 #define MGMT_STATUS_CANCELLED           0x10
47 #define MGMT_STATUS_INVALID_INDEX       0x11
48 #define MGMT_STATUS_RFKILLED            0x12
49
50 struct mgmt_hdr {
51         uint16_t opcode;
52         uint16_t index;
53         uint16_t len;
54 } __packed;
55 #define MGMT_HDR_SIZE   6
56
57 struct mgmt_addr_info {
58         bdaddr_t bdaddr;
59         uint8_t type;
60 } __packed;
61
62 #define MGMT_OP_READ_VERSION            0x0001
63 struct mgmt_rp_read_version {
64         uint8_t version;
65         uint16_t revision;
66 } __packed;
67
68 #define MGMT_OP_READ_COMMANDS           0x0002
69 struct mgmt_rp_read_commands {
70         uint16_t num_commands;
71         uint16_t num_events;
72         uint16_t opcodes[0];
73 } __packed;
74
75 #define MGMT_OP_READ_INDEX_LIST         0x0003
76 struct mgmt_rp_read_index_list {
77         uint16_t num_controllers;
78         uint16_t 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            (248 + 1)
84 #define MGMT_MAX_SHORT_NAME_LENGTH      (10 + 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_BONDABLE           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 #define MGMT_SETTING_SECURE_CONN        0x00000800
98 #define MGMT_SETTING_DEBUG_KEYS         0x00001000
99 #define MGMT_SETTING_PRIVACY            0x00002000
100 #define MGMT_SETTING_CONFIGURATION      0x00004000
101 #define MGMT_SETTING_STATIC_ADDRESS     0x00008000
102
103 #define MGMT_OP_READ_INFO               0x0004
104 struct mgmt_rp_read_info {
105         bdaddr_t bdaddr;
106         uint8_t version;
107         uint16_t manufacturer;
108         uint32_t supported_settings;
109         uint32_t current_settings;
110         uint8_t dev_class[3];
111         uint8_t name[MGMT_MAX_NAME_LENGTH];
112         uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
113 } __packed;
114
115 struct mgmt_mode {
116         uint8_t val;
117 } __packed;
118
119 struct mgmt_cod {
120         uint8_t val[3];
121 } __packed;
122
123 #define MGMT_OP_SET_POWERED             0x0005
124
125 #define MGMT_OP_SET_DISCOVERABLE        0x0006
126 struct mgmt_cp_set_discoverable {
127         uint8_t val;
128         uint16_t timeout;
129 } __packed;
130
131 #define MGMT_OP_SET_CONNECTABLE         0x0007
132
133 #define MGMT_OP_SET_FAST_CONNECTABLE    0x0008
134
135 #define MGMT_OP_SET_BONDABLE            0x0009
136
137 #define MGMT_OP_SET_LINK_SECURITY       0x000A
138
139 #define MGMT_OP_SET_SSP                 0x000B
140
141 #define MGMT_OP_SET_HS                  0x000C
142
143 #define MGMT_OP_SET_LE                  0x000D
144
145 #define MGMT_OP_SET_DEV_CLASS           0x000E
146 struct mgmt_cp_set_dev_class {
147         uint8_t major;
148         uint8_t minor;
149 } __packed;
150
151 #define MGMT_OP_SET_LOCAL_NAME          0x000F
152 struct mgmt_cp_set_local_name {
153         uint8_t name[MGMT_MAX_NAME_LENGTH];
154         uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
155 } __packed;
156
157 #define MGMT_OP_ADD_UUID                0x0010
158 struct mgmt_cp_add_uuid {
159         uint8_t uuid[16];
160         uint8_t svc_hint;
161 } __packed;
162
163 #define MGMT_OP_REMOVE_UUID             0x0011
164 struct mgmt_cp_remove_uuid {
165         uint8_t uuid[16];
166 } __packed;
167
168 struct mgmt_link_key_info {
169         struct mgmt_addr_info addr;
170         uint8_t type;
171         uint8_t val[16];
172         uint8_t pin_len;
173 } __packed;
174
175 #define MGMT_OP_LOAD_LINK_KEYS          0x0012
176 struct mgmt_cp_load_link_keys {
177         uint8_t debug_keys;
178         uint16_t key_count;
179         struct mgmt_link_key_info keys[0];
180 } __packed;
181
182 struct mgmt_ltk_info {
183         struct mgmt_addr_info addr;
184         uint8_t type;
185         uint8_t master;
186         uint8_t enc_size;
187         uint16_t ediv;
188         uint64_t rand;
189         uint8_t val[16];
190 } __packed;
191
192 #define MGMT_OP_LOAD_LONG_TERM_KEYS     0x0013
193 struct mgmt_cp_load_long_term_keys {
194         uint16_t key_count;
195         struct mgmt_ltk_info keys[0];
196 } __packed;
197
198 #define MGMT_OP_DISCONNECT              0x0014
199 struct mgmt_cp_disconnect {
200         struct mgmt_addr_info addr;
201 } __packed;
202 struct mgmt_rp_disconnect {
203         struct mgmt_addr_info addr;
204 } __packed;
205
206 #define MGMT_OP_GET_CONNECTIONS         0x0015
207 struct mgmt_rp_get_connections {
208         uint16_t conn_count;
209         struct mgmt_addr_info addr[0];
210 } __packed;
211
212 #define MGMT_OP_PIN_CODE_REPLY          0x0016
213 struct mgmt_cp_pin_code_reply {
214         struct mgmt_addr_info addr;
215         uint8_t pin_len;
216         uint8_t pin_code[16];
217 } __packed;
218
219 #define MGMT_OP_PIN_CODE_NEG_REPLY      0x0017
220 struct mgmt_cp_pin_code_neg_reply {
221         struct mgmt_addr_info addr;
222 } __packed;
223
224 #define MGMT_OP_SET_IO_CAPABILITY       0x0018
225 struct mgmt_cp_set_io_capability {
226         uint8_t io_capability;
227 } __packed;
228
229 #define MGMT_OP_PAIR_DEVICE             0x0019
230 struct mgmt_cp_pair_device {
231         struct mgmt_addr_info addr;
232         uint8_t io_cap;
233 } __packed;
234 struct mgmt_rp_pair_device {
235         struct mgmt_addr_info addr;
236 } __packed;
237
238 #define MGMT_OP_CANCEL_PAIR_DEVICE      0x001A
239
240 #define MGMT_OP_UNPAIR_DEVICE           0x001B
241 struct mgmt_cp_unpair_device {
242         struct mgmt_addr_info addr;
243         uint8_t disconnect;
244 } __packed;
245 struct mgmt_rp_unpair_device {
246         struct mgmt_addr_info addr;
247 } __packed;
248
249 #define MGMT_OP_USER_CONFIRM_REPLY      0x001C
250 struct mgmt_cp_user_confirm_reply {
251         struct mgmt_addr_info addr;
252 } __packed;
253 struct mgmt_rp_user_confirm_reply {
254         struct mgmt_addr_info addr;
255 } __packed;
256
257 #define MGMT_OP_USER_CONFIRM_NEG_REPLY  0x001D
258
259 #define MGMT_OP_USER_PASSKEY_REPLY      0x001E
260 struct mgmt_cp_user_passkey_reply {
261         struct mgmt_addr_info addr;
262         uint32_t passkey;
263 } __packed;
264 struct mgmt_rp_user_passkey_reply {
265         struct mgmt_addr_info addr;
266 } __packed;
267
268 #define MGMT_OP_USER_PASSKEY_NEG_REPLY  0x001F
269 struct mgmt_cp_user_passkey_neg_reply {
270         struct mgmt_addr_info addr;
271 } __packed;
272
273 #define MGMT_OP_READ_LOCAL_OOB_DATA     0x0020
274 struct mgmt_rp_read_local_oob_data {
275         uint8_t hash[16];
276         uint8_t randomizer[16];
277 } __packed;
278 struct mgmt_rp_read_local_oob_ext_data {
279         uint8_t hash192[16];
280         uint8_t randomizer192[16];
281         uint8_t hash256[16];
282         uint8_t randomizer256[16];
283 } __packed;
284
285 #define MGMT_OP_ADD_REMOTE_OOB_DATA     0x0021
286 struct mgmt_cp_add_remote_oob_data {
287         struct mgmt_addr_info addr;
288         uint8_t hash192[16];
289         uint8_t rand192[16];
290         uint8_t hash256[16];
291         uint8_t rand256[16];
292 } __packed;
293
294 #define MGMT_OP_REMOVE_REMOTE_OOB_DATA  0x0022
295 struct mgmt_cp_remove_remote_oob_data {
296         struct mgmt_addr_info addr;
297 } __packed;
298
299 #define MGMT_OP_START_DISCOVERY         0x0023
300 struct mgmt_cp_start_discovery {
301         uint8_t type;
302 } __packed;
303
304 #define MGMT_OP_STOP_DISCOVERY          0x0024
305 struct mgmt_cp_stop_discovery {
306         uint8_t type;
307 } __packed;
308
309 #define MGMT_OP_CONFIRM_NAME            0x0025
310 struct mgmt_cp_confirm_name {
311         struct mgmt_addr_info addr;
312         uint8_t name_known;
313 } __packed;
314 struct mgmt_rp_confirm_name {
315         struct mgmt_addr_info addr;
316 } __packed;
317
318 #define MGMT_OP_BLOCK_DEVICE            0x0026
319 struct mgmt_cp_block_device {
320         struct mgmt_addr_info addr;
321 } __packed;
322
323 #define MGMT_OP_UNBLOCK_DEVICE          0x0027
324 struct mgmt_cp_unblock_device {
325         struct mgmt_addr_info addr;
326 } __packed;
327
328 #define MGMT_OP_SET_DEVICE_ID           0x0028
329 struct mgmt_cp_set_device_id {
330         uint16_t source;
331         uint16_t vendor;
332         uint16_t product;
333         uint16_t version;
334 } __packed;
335
336 #define MGMT_OP_SET_ADVERTISING         0x0029
337
338 #define MGMT_OP_SET_BREDR               0x002A
339
340 #define MGMT_OP_SET_STATIC_ADDRESS      0x002B
341 struct mgmt_cp_set_static_address {
342         bdaddr_t bdaddr;
343 } __packed;
344
345 #define MGMT_OP_SET_SCAN_PARAMS         0x002C
346 struct mgmt_cp_set_scan_params {
347         uint16_t interval;
348         uint16_t window;
349 } __packed;
350
351 #define MGMT_OP_SET_SECURE_CONN         0x002D
352
353 #define MGMT_OP_SET_DEBUG_KEYS          0x002E
354
355 struct mgmt_irk_info {
356         struct mgmt_addr_info addr;
357         uint8_t val[16];
358 } __packed;
359
360 #define MGMT_OP_SET_PRIVACY             0x002F
361 struct mgmt_cp_set_privacy {
362         uint8_t privacy;
363         uint8_t irk[16];
364 } __packed;
365
366 #define MGMT_OP_LOAD_IRKS               0x0030
367 struct mgmt_cp_load_irks {
368         uint16_t irk_count;
369         struct mgmt_irk_info irks[0];
370 } __packed;
371
372 #define MGMT_OP_GET_CONN_INFO           0x0031
373 struct mgmt_cp_get_conn_info {
374         struct mgmt_addr_info addr;
375 } __packed;
376 struct mgmt_rp_get_conn_info {
377         struct mgmt_addr_info addr;
378         int8_t rssi;
379         int8_t tx_power;
380         int8_t max_tx_power;
381 } __packed;
382
383 #define MGMT_OP_GET_CLOCK_INFO          0x0032
384 struct mgmt_cp_get_clock_info {
385         struct mgmt_addr_info addr;
386 } __packed;
387 struct mgmt_rp_get_clock_info {
388         struct mgmt_addr_info addr;
389         uint32_t  local_clock;
390         uint32_t  piconet_clock;
391         uint16_t  accuracy;
392 } __packed;
393
394 #define MGMT_OP_ADD_DEVICE              0x0033
395 struct mgmt_cp_add_device {
396         struct mgmt_addr_info addr;
397         uint8_t action;
398 } __packed;
399 struct mgmt_rp_add_device {
400         struct mgmt_addr_info addr;
401 } __packed;
402
403 #define MGMT_OP_REMOVE_DEVICE           0x0034
404 struct mgmt_cp_remove_device {
405         struct mgmt_addr_info addr;
406 } __packed;
407 struct mgmt_rp_remove_device {
408         struct mgmt_addr_info addr;
409 } __packed;
410
411 struct mgmt_conn_param {
412         struct mgmt_addr_info addr;
413         uint16_t min_interval;
414         uint16_t max_interval;
415         uint16_t latency;
416         uint16_t timeout;
417 } __packed;
418
419 #define MGMT_OP_LOAD_CONN_PARAM         0x0035
420 struct mgmt_cp_load_conn_param {
421         uint16_t param_count;
422         struct mgmt_conn_param params[0];
423 } __packed;
424
425 #define MGMT_OP_READ_UNCONF_INDEX_LIST  0x0036
426 struct mgmt_rp_read_unconf_index_list {
427         uint16_t num_controllers;
428         uint16_t index[0];
429 } __packed;
430
431 #define MGMT_OPTION_EXTERNAL_CONFIG     0x00000001
432 #define MGMT_OPTION_PUBLIC_ADDRESS      0x00000002
433
434 #define MGMT_OP_READ_CONFIG_INFO        0x0037
435 struct mgmt_rp_read_config_info {
436         uint16_t manufacturer;
437         uint32_t supported_options;
438         uint32_t missing_options;
439 } __packed;
440
441 #define MGMT_OP_SET_EXTERNAL_CONFIG     0x0038
442 struct mgmt_cp_set_external_config {
443         uint8_t config;
444 } __packed;
445
446 #define MGMT_OP_SET_PUBLIC_ADDRESS      0x0039
447 struct mgmt_cp_set_public_address {
448         bdaddr_t bdaddr;
449 } __packed;
450
451 #define MGMT_OP_START_SERVICE_DISCOVERY         0x003A
452 struct mgmt_cp_start_service_discovery {
453         uint8_t type;
454         int8_t rssi;
455         uint16_t uuid_count;
456         uint8_t uuids[0][16];
457 } __packed;
458 #define MGMT_START_SERVICE_DISCOVERY_SIZE       4
459
460 #define MGMT_EV_CMD_COMPLETE            0x0001
461 struct mgmt_ev_cmd_complete {
462         uint16_t opcode;
463         uint8_t status;
464         uint8_t data[0];
465 } __packed;
466
467 #define MGMT_EV_CMD_STATUS              0x0002
468 struct mgmt_ev_cmd_status {
469         uint16_t opcode;
470         uint8_t status;
471 } __packed;
472
473 #define MGMT_EV_CONTROLLER_ERROR        0x0003
474 struct mgmt_ev_controller_error {
475         uint8_t error_code;
476 } __packed;
477
478 #define MGMT_EV_INDEX_ADDED             0x0004
479
480 #define MGMT_EV_INDEX_REMOVED           0x0005
481
482 #define MGMT_EV_NEW_SETTINGS            0x0006
483
484 #define MGMT_EV_CLASS_OF_DEV_CHANGED    0x0007
485 struct mgmt_ev_class_of_dev_changed {
486         uint8_t class_of_dev[3];
487 } __packed;
488
489 #define MGMT_EV_LOCAL_NAME_CHANGED      0x0008
490 struct mgmt_ev_local_name_changed {
491         uint8_t name[MGMT_MAX_NAME_LENGTH];
492         uint8_t short_name[MGMT_MAX_SHORT_NAME_LENGTH];
493 } __packed;
494
495 #define MGMT_EV_NEW_LINK_KEY            0x0009
496 struct mgmt_ev_new_link_key {
497         uint8_t store_hint;
498         struct mgmt_link_key_info key;
499 } __packed;
500
501 #define MGMT_EV_NEW_LONG_TERM_KEY       0x000A
502 struct mgmt_ev_new_long_term_key {
503         uint8_t store_hint;
504         struct mgmt_ltk_info key;
505 } __packed;
506
507 #define MGMT_EV_DEVICE_CONNECTED        0x000B
508 struct mgmt_ev_device_connected {
509         struct mgmt_addr_info addr;
510         uint32_t flags;
511         uint16_t eir_len;
512         uint8_t eir[0];
513 } __packed;
514
515 #define MGMT_DEV_DISCONN_UNKNOWN        0x00
516 #define MGMT_DEV_DISCONN_TIMEOUT        0x01
517 #define MGMT_DEV_DISCONN_LOCAL_HOST     0x02
518 #define MGMT_DEV_DISCONN_REMOTE         0x03
519
520 #define MGMT_EV_DEVICE_DISCONNECTED     0x000C
521 struct mgmt_ev_device_disconnected {
522         struct mgmt_addr_info addr;
523         uint8_t reason;
524 } __packed;
525
526 #define MGMT_EV_CONNECT_FAILED          0x000D
527 struct mgmt_ev_connect_failed {
528         struct mgmt_addr_info addr;
529         uint8_t status;
530 } __packed;
531
532 #define MGMT_EV_PIN_CODE_REQUEST        0x000E
533 struct mgmt_ev_pin_code_request {
534         struct mgmt_addr_info addr;
535         uint8_t secure;
536 } __packed;
537
538 #define MGMT_EV_USER_CONFIRM_REQUEST    0x000F
539 struct mgmt_ev_user_confirm_request {
540         struct mgmt_addr_info addr;
541         uint8_t confirm_hint;
542         uint32_t value;
543 } __packed;
544
545 #define MGMT_EV_USER_PASSKEY_REQUEST    0x0010
546 struct mgmt_ev_user_passkey_request {
547         struct mgmt_addr_info addr;
548 } __packed;
549
550 #define MGMT_EV_AUTH_FAILED             0x0011
551 struct mgmt_ev_auth_failed {
552         struct mgmt_addr_info addr;
553         uint8_t status;
554 } __packed;
555
556 #define MGMT_DEV_FOUND_CONFIRM_NAME     0x01
557 #define MGMT_DEV_FOUND_LEGACY_PAIRING   0x02
558 #define MGMT_DEV_FOUND_NOT_CONNECTABLE  0x04
559
560 #define MGMT_EV_DEVICE_FOUND            0x0012
561 struct mgmt_ev_device_found {
562         struct mgmt_addr_info addr;
563         int8_t rssi;
564         uint32_t flags;
565         uint16_t eir_len;
566         uint8_t eir[0];
567 } __packed;
568
569 #define MGMT_EV_DISCOVERING             0x0013
570 struct mgmt_ev_discovering {
571         uint8_t type;
572         uint8_t discovering;
573 } __packed;
574
575 #define MGMT_EV_DEVICE_BLOCKED          0x0014
576 struct mgmt_ev_device_blocked {
577         struct mgmt_addr_info addr;
578 } __packed;
579
580 #define MGMT_EV_DEVICE_UNBLOCKED        0x0015
581 struct mgmt_ev_device_unblocked {
582         struct mgmt_addr_info addr;
583 } __packed;
584
585 #define MGMT_EV_DEVICE_UNPAIRED         0x0016
586 struct mgmt_ev_device_unpaired {
587         struct mgmt_addr_info addr;
588 } __packed;
589
590 #define MGMT_EV_PASSKEY_NOTIFY          0x0017
591 struct mgmt_ev_passkey_notify {
592         struct mgmt_addr_info addr;
593         uint32_t passkey;
594         uint8_t entered;
595 } __packed;
596
597 #define MGMT_EV_NEW_IRK                 0x0018
598 struct mgmt_ev_new_irk {
599         uint8_t  store_hint;
600         bdaddr_t rpa;
601         struct mgmt_irk_info key;
602 } __packed;
603
604 struct mgmt_csrk_info {
605         struct mgmt_addr_info addr;
606         uint8_t type;
607         uint8_t val[16];
608 } __packed;
609
610 #define MGMT_EV_NEW_CSRK                0x0019
611 struct mgmt_ev_new_csrk {
612         uint8_t store_hint;
613         struct mgmt_csrk_info key;
614 } __packed;
615
616 #define MGMT_EV_DEVICE_ADDED            0x001a
617 struct mgmt_ev_device_added {
618         struct mgmt_addr_info addr;
619         uint8_t action;
620 } __packed;
621
622 #define MGMT_EV_DEVICE_REMOVED          0x001b
623 struct mgmt_ev_device_removed {
624         struct mgmt_addr_info addr;
625 } __packed;
626
627 #define MGMT_EV_NEW_CONN_PARAM          0x001c
628 struct mgmt_ev_new_conn_param {
629         struct mgmt_addr_info addr;
630         uint8_t store_hint;
631         uint16_t min_interval;
632         uint16_t max_interval;
633         uint16_t latency;
634         uint16_t timeout;
635 } __packed;
636
637 #define MGMT_EV_UNCONF_INDEX_ADDED      0x001d
638
639 #define MGMT_EV_UNCONF_INDEX_REMOVED    0x001e
640
641 #define MGMT_EV_NEW_CONFIG_OPTIONS      0x001f
642
643 static const char *mgmt_op[] = {
644         "<0x0000>",
645         "Read Version",
646         "Read Commands",
647         "Read Index List",
648         "Read Controller Info",
649         "Set Powered",
650         "Set Discoverable",
651         "Set Connectable",
652         "Set Fast Connectable",         /* 0x0008 */
653         "Set Bondable",
654         "Set Link Security",
655         "Set Secure Simple Pairing",
656         "Set High Speed",
657         "Set Low Energy",
658         "Set Dev Class",
659         "Set Local Name",
660         "Add UUID",                     /* 0x0010 */
661         "Remove UUID",
662         "Load Link Keys",
663         "Load Long Term Keys",
664         "Disconnect",
665         "Get Connections",
666         "PIN Code Reply",
667         "PIN Code Neg Reply",
668         "Set IO Capability",            /* 0x0018 */
669         "Pair Device",
670         "Cancel Pair Device",
671         "Unpair Device",
672         "User Confirm Reply",
673         "User Confirm Neg Reply",
674         "User Passkey Reply",
675         "User Passkey Neg Reply",
676         "Read Local OOB Data",          /* 0x0020 */
677         "Add Remote OOB Data",
678         "Remove Remove OOB Data",
679         "Start Discovery",
680         "Stop Discovery",
681         "Confirm Name",
682         "Block Device",
683         "Unblock Device",
684         "Set Device ID",
685         "Set Advertising",
686         "Set BR/EDR",
687         "Set Static Address",
688         "Set Scan Parameters",
689         "Set Secure Connections",
690         "Set Debug Keys",
691         "Set Privacy",
692         "Load Identity Resolving Keys",
693         "Get Connection Information",
694         "Get Clock Information",
695         "Add Device",
696         "Remove Device",
697         "Load Connection Parameters",
698         "Read Unconfigured Index List",
699         "Read Controller Configuration Information",
700         "Set External Configuration",
701         "Set Public Address",
702         "Start Service Discovery",
703 };
704
705 static const char *mgmt_ev[] = {
706         "<0x0000>",
707         "Command Complete",
708         "Command Status",
709         "Controller Error",
710         "Index Added",
711         "Index Removed",
712         "New Settings",
713         "Class of Device Changed",
714         "Local Name Changed",           /* 0x0008 */
715         "New Link Key",
716         "New Long Term Key",
717         "Device Connected",
718         "Device Disconnected",
719         "Connect Failed",
720         "PIN Code Request",
721         "User Confirm Request",
722         "User Passkey Request",         /* 0x0010 */
723         "Authentication Failed",
724         "Device Found",
725         "Discovering",
726         "Device Blocked",
727         "Device Unblocked",
728         "Device Unpaired",
729         "Passkey Notify",
730         "New Identity Resolving Key",
731         "New Signature Resolving Key",
732         "Device Added",
733         "Device Removed",
734         "New Connection Parameter",
735         "Unconfigured Index Added",
736         "Unconfigured Index Removed",
737         "New Configuration Options",
738 };
739
740 static const char *mgmt_status[] = {
741         "Success",
742         "Unknown Command",
743         "Not Connected",
744         "Failed",
745         "Connect Failed",
746         "Authentication Failed",
747         "Not Paired",
748         "No Resources",
749         "Timeout",
750         "Already Connected",
751         "Busy",
752         "Rejected",
753         "Not Supported",
754         "Invalid Parameters",
755         "Disconnected",
756         "Not Powered",
757         "Cancelled",
758         "Invalid Index",
759         "Blocked through rfkill",
760 };
761
762 #ifdef __TIZEN_PATCH__
763
764 #define TIZEN_OP_CODE_BASE      0xff00
765 #define TIZEN_EV_BASE           0xff00
766
767 #define MGMT_MAX_ADVERTISING_LENGTH             31
768
769 #define MGMT_MAX_MANUFACTURER_DATA_LENGTH       31
770
771 #define MGMT_IRK_SIZE                           16
772
773 #define MGMT_OP_SET_ADVERTISING_PARAMS          (TIZEN_OP_CODE_BASE + 0x01)
774 struct mgmt_cp_set_advertising_params {
775         uint16_t interval_min;
776         uint16_t interval_max;
777         uint8_t filter_policy;
778         uint8_t type;
779 } __packed;
780
781 #define MGMT_OP_SET_ADVERTISING_DATA            (TIZEN_OP_CODE_BASE + 0x02)
782 struct mgmt_cp_set_advertising_data {
783         uint8_t data[MGMT_MAX_ADVERTISING_LENGTH];
784 } __packed;
785
786 #define MGMT_OP_SET_SCAN_RSP_DATA               (TIZEN_OP_CODE_BASE + 0x03)
787 struct mgmt_cp_set_scan_rsp_data {
788         uint8_t data[MGMT_MAX_ADVERTISING_LENGTH];
789 } __packed;
790
791 #define MGMT_OP_ADD_DEV_WHITE_LIST              (TIZEN_OP_CODE_BASE + 0x04)
792 struct mgmt_cp_add_dev_white_list {
793         uint8_t bdaddr_type;
794         bdaddr_t bdaddr;
795 } __packed;
796
797 #define MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST      (TIZEN_OP_CODE_BASE + 0x05)
798 struct mgmt_cp_remove_dev_white_list {
799         uint8_t bdaddr_type;
800         bdaddr_t bdaddr;
801 } __packed;
802
803 #define MGMT_OP_CLEAR_DEV_WHITE_LIST            (TIZEN_OP_CODE_BASE + 0x06)
804
805 /* BEGIN TIZEN_Bluetooth :: RSSI monitoring   */
806 #define MGMT_OP_SET_RSSI_ENABLE                 (TIZEN_OP_CODE_BASE + 0x07)
807 struct mgmt_cp_set_enable_rssi {
808         int8_t     low_th;
809         int8_t     in_range_th;
810         int8_t     high_th;
811         bdaddr_t   bdaddr;
812         int8_t link_type;
813 } __packed;
814
815 struct mgmt_cc_rsp_enable_rssi {
816         uint8_t status;
817         uint8_t le_ext_opcode;
818         bdaddr_t bt_address;
819         int8_t link_type;
820 } __packed;
821
822 #define MGMT_OP_GET_RAW_RSSI                    (TIZEN_OP_CODE_BASE + 0x08)
823 struct mgmt_cp_get_raw_rssi {
824         bdaddr_t bt_address;
825         uint8_t  link_type;
826 } __packed;
827 struct mgmt_cc_rp_get_raw_rssi {
828         uint8_t    status;
829         int8_t     rssi_dbm;
830         uint8_t    link_type;
831         bdaddr_t   bt_address;
832 } __packed;
833
834 #define MGMT_OP_SET_RSSI_DISABLE                (TIZEN_OP_CODE_BASE + 0x09)
835 struct mgmt_cp_disable_rssi {
836         bdaddr_t   bdaddr;
837         int8_t link_type;
838 } __packed;
839 struct mgmt_cc_rp_disable_rssi {
840         uint8_t status;
841         uint8_t le_ext_opcode;
842         bdaddr_t bt_address;
843         int8_t link_type;
844 } __packed;
845 /* END TIZEN_Bluetooth :: RSSI monitoring */
846
847 #define MGMT_OP_START_LE_DISCOVERY              (TIZEN_OP_CODE_BASE + 0x0a)
848 struct mgmt_cp_start_le_discovery {
849         uint8_t type;
850 } __packed;
851
852 #define MGMT_OP_STOP_LE_DISCOVERY               (TIZEN_OP_CODE_BASE + 0x0b)
853 struct mgmt_cp_stop_le_discovery {
854         uint8_t type;
855 } __packed;
856
857 /* BEGIN TIZEN_Bluetooth :: LE auto connection */
858 #define MGMT_OP_DISABLE_LE_AUTO_CONNECT         (TIZEN_OP_CODE_BASE + 0x0c)
859 /* END TIZEN_Bluetooth */
860
861 #define MGMT_OP_LE_CONN_UPDATE                  (TIZEN_OP_CODE_BASE + 0x0d)
862 struct mgmt_cp_le_conn_update {
863         uint16_t interval_min;
864         uint16_t interval_max;
865         uint16_t latency;
866         uint16_t supervision_time_out;
867         bdaddr_t bdaddr;
868 } __packed;
869
870 #define MGMT_OP_SET_MANUFACTURER_DATA           (TIZEN_OP_CODE_BASE + 0x0e)
871 struct mgmt_cp_set_manufacturer_data {
872         uint8_t data[MGMT_MAX_MANUFACTURER_DATA_LENGTH];
873 } __packed;
874
875 #define MGMT_OP_LE_SET_SCAN_PARAMS              (TIZEN_OP_CODE_BASE + 0x0f)
876 struct mgmt_cp_le_set_scan_params {
877         uint8_t type;   /* le scan type */
878         uint16_t interval;
879         uint16_t window;
880 } __packed;
881
882 #define MGMT_SCO_ROLE_HANDSFREE                 0x00
883 #define MGMT_SCO_ROLE_AUDIO_GATEWAY             0x01
884 #define MGMT_OP_SET_VOICE_SETTING               (TIZEN_OP_CODE_BASE + 0x10)
885 struct mgmt_cp_set_voice_setting {
886         bdaddr_t bdaddr;
887         uint8_t  sco_role;
888         uint16_t voice_setting;
889 } __packed;
890
891 #define MGMT_OP_GET_ADV_TX_POWER                (TIZEN_OP_CODE_BASE + 0x11)
892 struct mgmt_rp_get_adv_tx_power {
893         int8_t adv_tx_power;
894 } __packed;
895
896 /*  Currently there is no support in kernel for below MGMT cmd opcodes. */
897 #if 0 // Not defined in kernel
898 #define MGMT_OP_READ_RSSI                       (TIZEN_OP_CODE_BASE + 0x11)
899 struct mgmt_cp_read_rssi {
900         bdaddr_t bdaddr;
901 } __packed;
902 struct mgmt_rp_read_rssi {
903         uint8_t status;
904         bdaddr_t bdaddr;
905         int8_t rssi;
906 } __packed;
907
908 #define MGMT_OP_L2CAP_CONN_PARAM_UPDATE         (TIZEN_OP_CODE_BASE + 0x12)
909 struct mgmt_cp_l2cap_conn_param_update {
910         bdaddr_t bdaddr;
911         uint16_t interval_min;
912         uint16_t interval_max;
913         uint16_t latency;
914         uint16_t supervision_time_out;
915 } __packed;
916
917 #define MGMT_OP_WRITE_SEC_CONN_HOST_SUPPORT     (TIZEN_OP_CODE_BASE + 0x13)
918 #define MGMT_WRITE_SEC_CONN_HOST_SUPPORT_SIZE 1
919 struct mgmt_cp_write_sec_conn_host_support {
920         uint8_t secure_connection_host_support;
921 } __packed;
922 struct mgmt_rp_write_sec_conn_host_support {
923         uint8_t status;
924 } __packed;
925
926 #define MGMT_OP_READ_SEC_CONN_HOST_SUPPORT      (TIZEN_OP_CODE_BASE + 0x14)
927 struct mgmt_rp_read_sec_conn_host_support {
928         uint8_t status;
929         uint8_t sec_conn_host_support;
930 } __packed;
931
932 #define MGMT_OP_WRITE_AUTH_PAYLOAD_TIMEOUT      (TIZEN_OP_CODE_BASE + 0x15)
933 struct mgmt_cp_write_auth_payload_timeout {
934         bdaddr_t bdaddr;
935         uint16_t auth_payload_timeout;
936 } __packed;
937 struct mgmt_rp_write_auth_payload_timeout {
938         uint8_t status;
939 } __packed;
940
941 #define MGMT_OP_READ_AUTH_PAYLOAD_TIMEOUT       (TIZEN_OP_CODE_BASE + 0x16)
942 struct mgmt_cp_read_auth_payload_timeout    {
943         bdaddr_t bdaddr;
944 } __packed;
945 struct mgmt_rp_read_auth_payload_timeout {
946         uint8_t status;
947         uint16_t auth_payload_timeout;
948 } __packed;
949 #endif
950
951
952 /* BEGIN TIZEN_Bluetooth :: name update changes */
953 #define MGMT_EV_DEVICE_NAME_UPDATE              (TIZEN_EV_BASE + 0x01)
954 struct mgmt_ev_device_name_update {
955         struct mgmt_addr_info addr;
956         uint16_t eir_len;
957         uint8_t eir[0];
958 } __packed;
959 /* END TIZEN_Bluetooth :: name update changes */
960
961 /* BEGIN TIZEN_Bluetooth :: Add handling of hardware error event   */
962 #define MGMT_EV_HARDWARE_ERROR                  (TIZEN_EV_BASE + 0x02)
963 struct mgmt_ev_hardware_error{
964         uint8_t error_code;
965 } __packed;
966 /* END TIZEN_Bluetooth */
967
968 /* BEGIN TIZEN_Bluetooth :: HCI TX Timeout Error   */
969 #define MGMT_EV_TX_TIMEOUT_ERROR                (TIZEN_EV_BASE + 0x03)
970 /* END TIZEN_Bluetooth */
971
972 /* BEGIN TIZEN_Bluetooth :: Add handling of RSSI Events   */
973 #define MGMT_EV_RSSI_ALERT                      (TIZEN_EV_BASE + 0x04)
974 struct mgmt_ev_vendor_specific_rssi_alert {
975         bdaddr_t bdaddr;
976         int8_t     link_type;
977         int8_t     alert_type;
978         int8_t     rssi_dbm;
979 } __packed;
980
981 #define MGMT_EV_RAW_RSSI                        (TIZEN_EV_BASE + 0x05)
982
983 #define MGMT_EV_RSSI_ENABLED                    (TIZEN_EV_BASE + 0x06)
984
985 #define MGMT_EV_RSSI_DISABLED                   (TIZEN_EV_BASE + 0x07)
986 /* END TIZEN_Bluetooth :: Handling of RSSI Events */
987
988 /* BEGIN TIZEN_Bluetooth :: Add LE connection update Events   */
989 #define MGMT_EV_CONN_UPDATED                    (TIZEN_EV_BASE + 0x08)
990 struct mgmt_ev_conn_updated {
991         struct  mgmt_addr_info addr;
992         uint16_t        conn_interval;
993         uint16_t        conn_latency;
994         uint16_t        supervision_timeout;
995 } __packed;
996
997 #define MGMT_EV_CONN_UPDATE_FAILED              (TIZEN_EV_BASE + 0x09)
998 struct mgmt_ev_conn_update_failed {
999         struct  mgmt_addr_info addr;
1000         uint8_t status;
1001 } __packed;
1002 /* END TIZEN_Bluetooth :: Add LE connection update Events */
1003
1004 #define MGMT_EV_LE_DEVICE_FOUND                 (TIZEN_EV_BASE + 0x0a)
1005 struct mgmt_ev_le_device_found {
1006         struct mgmt_addr_info addr;
1007         int8_t rssi;
1008         uint32_t flags;
1009         int8_t adv_type;
1010         uint16_t eir_len;
1011         uint8_t eir[0];
1012 } __packed;
1013
1014 #define MGMT_EV_MULTI_ADV_STATE_CHANGED                 (TIZEN_EV_BASE + 0x0b)
1015 struct mgmt_ev_vendor_specific_multi_adv_state_changed {
1016         uint8_t adv_instance;
1017         uint8_t state_change_reason;
1018         int16_t connection_handle;
1019 } __packed;
1020
1021 /*  Currently there is no support in kernel for below MGMT events. */
1022 #if 0 // Not defined in kernel
1023 #define MGMT_EV_NEW_LOCAL_IRK                   (TIZEN_EV_BASE + 0x0b)
1024 struct mgmt_ev_new_local_irk {
1025         uint8_t    irk[16];
1026 } __packed;
1027 #endif
1028
1029 static const char *mgmt_tizen_op[] = {
1030         "<0x0000>",
1031         "Set Advertising Parameters",
1032         "Set Advertising Data",
1033         "Set Scan Response Data",
1034         "Add Device White List",
1035         "Remove Device White List",
1036         "Clear Device White List",
1037         "Set RSSI Enable",
1038         "Get Raw RSSI",
1039         "Set RSSI Disable",
1040         "Start LE Discovery",
1041         "Stop LE Discovery",
1042         "Disable LE Auto Connect",
1043         "LE Connection Update",
1044         "Set Manufacturer Data",
1045         "LE Set Scan Parameters",
1046         "Set Voice Setting",
1047         "Get Adv Tx Power"
1048 };
1049
1050 static const char *mgmt_tizen_ev[] = {
1051         "<0x0000>",
1052         "Device Name Update",
1053         "Hardware Error",
1054         "Tx TimeOut Error",
1055         "RSSI Alert",
1056         "Raw RSSI",
1057         "RSSI Enabled",
1058         "RSSI Disabled",
1059         "LE Connection Updated",
1060         "LE Connection Update Failed",
1061         "LE Device Found",
1062         "Multi Adv State Change",
1063 };
1064 #endif /* End of __TIZEN_PATCH__ */
1065
1066 #ifndef NELEM
1067 #define NELEM(x) (sizeof(x) / sizeof((x)[0]))
1068 #endif
1069
1070 static inline const char *mgmt_opstr(uint16_t op)
1071 {
1072 #ifdef __TIZEN_PATCH__
1073         if (op >= NELEM(mgmt_op)) {
1074                 uint16_t tizen_op = op - TIZEN_OP_CODE_BASE;
1075
1076                 if (tizen_op > 0 &&
1077                     tizen_op < NELEM(mgmt_tizen_op))
1078                         return mgmt_tizen_op[tizen_op];
1079
1080                 return "<unknown opcode>";
1081         }
1082 #else
1083         if (op >= NELEM(mgmt_op))
1084                 return "<unknown opcode>";
1085 #endif
1086
1087         return mgmt_op[op];
1088 }
1089
1090 static inline const char *mgmt_evstr(uint16_t ev)
1091 {
1092 #ifdef __TIZEN_PATCH__
1093         if (ev >= NELEM(mgmt_ev)) {
1094                 uint16_t tizen_ev = ev - TIZEN_EV_BASE;
1095
1096                 if (tizen_ev > 0 &&
1097                     tizen_ev < NELEM(mgmt_tizen_ev))
1098                         return mgmt_tizen_ev[tizen_ev];
1099
1100                 return "<unknown event>";
1101         }
1102 #else
1103         if (ev >= NELEM(mgmt_ev))
1104                 return "<unknown event>";
1105 #endif
1106
1107         return mgmt_ev[ev];
1108 }
1109
1110 static inline const char *mgmt_errstr(uint8_t status)
1111 {
1112         if (status >= NELEM(mgmt_status))
1113                 return "<unknown status>";
1114         return mgmt_status[status];
1115 }