Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  *  BlueZ - Bluetooth protocol stack for Linux
      3  *
      4  *  Copyright (C) 2010  Nokia Corporation
      5  *  Copyright (C) 2010  Marcel Holtmann <marcel (at) 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 struct 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
     38 struct mgmt_rp_read_version {
     39 	uint8_t version;
     40 	uint16_t revision;
     41 } __packed;
     42 
     43 #define MGMT_OP_READ_FEATURES		0x0002
     44 struct mgmt_rp_read_features {
     45 	uint8_t features[8];
     46 } __packed;
     47 
     48 #define MGMT_OP_READ_INDEX_LIST		0x0003
     49 struct 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
     59 struct 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 
     75 struct 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
     88 struct mgmt_cp_add_uuid {
     89 	uint8_t uuid[16];
     90 	uint8_t svc_hint;
     91 } __packed;
     92 
     93 #define MGMT_OP_REMOVE_UUID		0x000A
     94 struct mgmt_cp_remove_uuid {
     95 	uint8_t uuid[16];
     96 } __packed;
     97 
     98 #define MGMT_OP_SET_DEV_CLASS		0x000B
     99 struct mgmt_cp_set_dev_class {
    100 	uint8_t major;
    101 	uint8_t minor;
    102 } __packed;
    103 
    104 #define MGMT_OP_SET_SERVICE_CACHE	0x000C
    105 struct mgmt_cp_set_service_cache {
    106 	uint8_t enable;
    107 } __packed;
    108 
    109 struct 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
    117 struct 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
    124 struct mgmt_cp_remove_key {
    125 	bdaddr_t bdaddr;
    126 	uint8_t disconnect;
    127 } __packed;
    128 
    129 #define MGMT_OP_DISCONNECT		0x000F
    130 struct mgmt_cp_disconnect {
    131 	bdaddr_t bdaddr;
    132 } __packed;
    133 struct mgmt_rp_disconnect {
    134 	bdaddr_t bdaddr;
    135 } __packed;
    136 
    137 #define MGMT_OP_GET_CONNECTIONS		0x0010
    138 struct 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
    144 struct 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
    151 struct mgmt_cp_pin_code_neg_reply {
    152 	bdaddr_t bdaddr;
    153 } __packed;
    154 
    155 #define MGMT_OP_SET_IO_CAPABILITY	0x0013
    156 struct mgmt_cp_set_io_capability {
    157 	uint8_t io_capability;
    158 } __packed;
    159 
    160 #define MGMT_OP_PAIR_DEVICE		0x0014
    161 struct mgmt_cp_pair_device {
    162 	bdaddr_t bdaddr;
    163 	uint8_t io_cap;
    164 } __packed;
    165 struct mgmt_rp_pair_device {
    166 	bdaddr_t bdaddr;
    167 	uint8_t status;
    168 } __packed;
    169 
    170 #define MGMT_OP_USER_CONFIRM_REPLY	0x0015
    171 struct mgmt_cp_user_confirm_reply {
    172 	bdaddr_t bdaddr;
    173 } __packed;
    174 struct 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
    182 struct 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
    187 struct 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
    193 struct 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
    200 struct 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
    209 struct mgmt_ev_cmd_complete {
    210 	uint16_t opcode;
    211 	uint8_t data[0];
    212 } __packed;
    213 
    214 #define MGMT_EV_CMD_STATUS		0x0002
    215 struct mgmt_ev_cmd_status {
    216 	uint8_t status;
    217 	uint16_t opcode;
    218 } __packed;
    219 
    220 #define MGMT_EV_CONTROLLER_ERROR	0x0003
    221 struct 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
    238 struct 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
    244 struct mgmt_ev_device_connected {
    245 	bdaddr_t bdaddr;
    246 } __packed;
    247 
    248 #define MGMT_EV_DEVICE_DISCONNECTED	0x000C
    249 struct mgmt_ev_device_disconnected {
    250 	bdaddr_t bdaddr;
    251 } __packed;
    252 
    253 #define MGMT_EV_CONNECT_FAILED		0x000D
    254 struct mgmt_ev_connect_failed {
    255 	bdaddr_t bdaddr;
    256 	uint8_t status;
    257 } __packed;
    258 
    259 #define MGMT_EV_PIN_CODE_REQUEST	0x000E
    260 struct mgmt_ev_pin_code_request {
    261 	bdaddr_t bdaddr;
    262 	uint8_t secure;
    263 } __packed;
    264 
    265 #define MGMT_EV_USER_CONFIRM_REQUEST	0x000F
    266 struct 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
    273 struct mgmt_ev_auth_failed {
    274 	bdaddr_t bdaddr;
    275 	uint8_t status;
    276 } __packed;
    277 
    278 #define MGMT_EV_LOCAL_NAME_CHANGED	0x0011
    279 struct mgmt_ev_local_name_changed {
    280 	uint8_t name[MGMT_MAX_NAME_LENGTH];
    281 } __packed;
    282 
    283 #define MGMT_EV_DEVICE_FOUND		0x0012
    284 struct 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
    292 struct 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