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