1 /* $OpenBSD: hci.h,v 1.9 2007/07/22 21:05:00 gwk Exp $ */ 2 /* $NetBSD: hci.h,v 1.10 2007/04/21 06:15:23 plunky Exp $ */ 3 /* $DragonFly: src/sys/netbt/hci.h,v 1.1 2007/12/30 20:02:56 hasso Exp $ */ 4 5 /*- 6 * Copyright (c) 2005 Iain Hibbert. 7 * Copyright (c) 2006 Itronix Inc. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of Itronix Inc. may not be used to endorse 19 * or promote products derived from this software without specific 20 * prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 24 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 26 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29 * ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32 * POSSIBILITY OF SUCH DAMAGE. 33 */ 34 /*- 35 * Copyright (c) 2001 Maksim Yevmenkin <m_evmenkin@yahoo.com> 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 1. Redistributions of source code must retain the above copyright 42 * notice, this list of conditions and the following disclaimer. 43 * 2. Redistributions in binary form must reproduce the above copyright 44 * notice, this list of conditions and the following disclaimer in the 45 * documentation and/or other materials provided with the distribution. 46 * 47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 48 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57 * SUCH DAMAGE. 58 * 59 * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_hci.h,v 1.6 2005/01/07 01:45:43 imp Exp $ 60 */ 61 62 /* 63 * This file contains everything that applications need to know from 64 * Host Controller Interface (HCI). Information taken from Bluetooth 65 * Core Specifications (v1.1 and v2.0) 66 * 67 * This file can be included by both kernel and userland applications. 68 * 69 * NOTE: Here and after Bluetooth device is called a "unit". Bluetooth 70 * specification refers to both devices and units. They are the 71 * same thing (I think), so to be consistent word "unit" will be 72 * used. 73 */ 74 75 #ifndef _NETBT_HCI_H_ 76 #define _NETBT_HCI_H_ 77 78 #include <netbt/bluetooth.h> 79 80 /************************************************************************** 81 ************************************************************************** 82 ** Common defines and types (HCI) 83 ************************************************************************** 84 **************************************************************************/ 85 86 #define HCI_LAP_SIZE 3 /* unit LAP */ 87 #define HCI_KEY_SIZE 16 /* link key */ 88 #define HCI_PIN_SIZE 16 /* link PIN */ 89 #define HCI_EVENT_MASK_SIZE 8 /* event mask */ 90 #define HCI_CLASS_SIZE 3 /* unit class */ 91 #define HCI_FEATURES_SIZE 8 /* LMP features */ 92 #define HCI_UNIT_NAME_SIZE 248 /* unit name size */ 93 #define HCI_DEVNAME_SIZE 16 /* same as dv_xname */ 94 95 /* HCI specification */ 96 #define HCI_SPEC_V10 0x00 /* v1.0 */ 97 #define HCI_SPEC_V11 0x01 /* v1.1 */ 98 #define HCI_SPEC_V12 0x02 /* v1.2 */ 99 #define HCI_SPEC_V20 0x03 /* v2.0 */ 100 /* 0x02 - 0xFF - reserved for future use */ 101 102 /* LMP features (and page 0 of extended features) */ 103 /* ------------------- byte 0 --------------------*/ 104 #define HCI_LMP_3SLOT 0x01 105 #define HCI_LMP_5SLOT 0x02 106 #define HCI_LMP_ENCRYPTION 0x04 107 #define HCI_LMP_SLOT_OFFSET 0x08 108 #define HCI_LMP_TIMIACCURACY 0x10 109 #define HCI_LMP_ROLE_SWITCH 0x20 110 #define HCI_LMP_HOLD_MODE 0x40 111 #define HCI_LMP_SNIFF_MODE 0x80 112 /* ------------------- byte 1 --------------------*/ 113 #define HCI_LMP_PARK_MODE 0x01 114 #define HCI_LMP_RSSI 0x02 115 #define HCI_LMP_CHANNEL_QUALITY 0x04 116 #define HCI_LMP_SCO_LINK 0x08 117 #define HCI_LMP_HV2_PKT 0x10 118 #define HCI_LMP_HV3_PKT 0x20 119 #define HCI_LMP_ULAW_LOG 0x40 120 #define HCI_LMP_ALAW_LOG 0x80 121 /* ------------------- byte 2 --------------------*/ 122 #define HCI_LMP_CVSD 0x01 123 #define HCI_LMP_PAGISCHEME 0x02 124 #define HCI_LMP_POWER_CONTROL 0x04 125 #define HCI_LMP_TRANSPARENT_SCO 0x08 126 #define HCI_LMP_FLOW_CONTROL_LAG0 0x10 127 #define HCI_LMP_FLOW_CONTROL_LAG1 0x20 128 #define HCI_LMP_FLOW_CONTROL_LAG2 0x40 129 #define HCI_LMP_BC_ENCRYPTION 0x80 130 /* ------------------- byte 3 --------------------*/ 131 /* reserved 0x01 */ 132 #define HCI_LMP_EDR_ACL_2MBPS 0x02 133 #define HCI_LMP_EDR_ACL_3MBPS 0x04 134 #define HCI_LMP_ENHANCED_ISCAN 0x08 135 #define HCI_LMP_INTERLACED_ISCAN 0x10 136 #define HCI_LMP_INTERLACED_PSCAN 0x20 137 #define HCI_LMP_RSSI_INQUIRY 0x40 138 #define HCI_LMP_EV3_PKT 0x80 139 /* ------------------- byte 4 --------------------*/ 140 #define HCI_LMP_EV4_PKT 0x01 141 #define HCI_LMP_EV5_PKT 0x02 142 /* reserved 0x04 */ 143 #define HCI_LMP_AFH_CAPABLE_SLAVE 0x08 144 #define HCI_LMP_AFH_CLASS_SLAVE 0x10 145 /* reserved 0x20 */ 146 /* reserved 0x40 */ 147 #define HCI_LMP_3SLOT_EDR_ACL 0x80 148 /* ------------------- byte 5 --------------------*/ 149 #define HCI_LMP_5SLOT_EDR_ACL 0x01 150 /* reserved 0x02 */ 151 /* reserved 0x04 */ 152 #define HCI_LMP_AFH_CAPABLE_MASTER 0x08 153 #define HCI_LMP_AFH_CLASS_MASTER 0x10 154 #define HCI_LMP_EDR_eSCO_2MBPS 0x20 155 #define HCI_LMP_EDR_eSCO_3MBPS 0x40 156 #define HCI_LMP_3SLOT_EDR_eSCO 0x80 157 /* ------------------- byte 6 --------------------*/ 158 /* reserved */ 159 /* ------------------- byte 7 --------------------*/ 160 #define HCI_LMP_EXTENDED_FEATURES 0x80 161 162 /* Link types */ 163 #define HCI_LINK_SCO 0x00 /* Voice */ 164 #define HCI_LINK_ACL 0x01 /* Data */ 165 #define HCI_LINK_eSCO 0x02 /* eSCO */ 166 /* 0x03 - 0xFF - reserved for future use */ 167 168 /* 169 * ACL/SCO packet type bits are set to enable the 170 * packet type, except for 2MBPS and 3MBPS when they 171 * are unset to enable the packet type. 172 */ 173 /* ACL Packet types for "Create Connection" */ 174 #define HCI_PKT_2MBPS_DH1 0x0002 175 #define HCI_PKT_3MBPS_DH1 0x0004 176 #define HCI_PKT_DM1 0x0008 177 #define HCI_PKT_DH1 0x0010 178 #define HCI_PKT_2MBPS_DH3 0x0100 179 #define HCI_PKT_3MBPS_DH3 0x0200 180 #define HCI_PKT_DM3 0x0400 181 #define HCI_PKT_DH3 0x0800 182 #define HCI_PKT_2MBPS_DH5 0x1000 183 #define HCI_PKT_3MBPS_DH5 0x2000 184 #define HCI_PKT_DM5 0x4000 185 #define HCI_PKT_DH5 0x8000 186 187 /* SCO Packet types for "Setup Synchronous Connection" */ 188 #define HCI_PKT_HV1 0x0001 189 #define HCI_PKT_HV2 0x0002 190 #define HCI_PKT_HV3 0x0004 191 #define HCI_PKT_EV3 0x0008 192 #define HCI_PKT_EV4 0x0010 193 #define HCI_PKT_EV5 0x0020 194 #define HCI_PKT_2MBPS_EV3 0x0040 195 #define HCI_PKT_3MBPS_EV3 0x0080 196 #define HCI_PKT_2MBPS_EV5 0x0100 197 #define HCI_PKT_3MBPS_EV5 0x0200 198 199 /* 200 * Connection modes/Unit modes 201 * 202 * This is confusing. It means that one of the units change its mode 203 * for the specific connection. For example one connection was put on 204 * hold (but i could be wrong :) 205 */ 206 207 /* Page scan modes (are deprecated) */ 208 #define HCI_MANDATORY_PAGE_SCAN_MODE 0x00 209 #define HCI_OPTIONAL_PAGE_SCAN_MODE1 0x01 210 #define HCI_OPTIONAL_PAGE_SCAN_MODE2 0x02 211 #define HCI_OPTIONAL_PAGE_SCAN_MODE3 0x03 212 /* 0x04 - 0xFF - reserved for future use */ 213 214 /* Page scan repetition modes */ 215 #define HCI_SCAN_REP_MODE0 0x00 216 #define HCI_SCAN_REP_MODE1 0x01 217 #define HCI_SCAN_REP_MODE2 0x02 218 /* 0x03 - 0xFF - reserved for future use */ 219 220 /* Page scan period modes */ 221 #define HCI_PAGE_SCAN_PERIOD_MODE0 0x00 222 #define HCI_PAGE_SCAN_PERIOD_MODE1 0x01 223 #define HCI_PAGE_SCAN_PERIOD_MODE2 0x02 224 /* 0x03 - 0xFF - reserved for future use */ 225 226 /* Scan enable */ 227 #define HCI_NO_SCAN_ENABLE 0x00 228 #define HCI_INQUIRY_SCAN_ENABLE 0x01 229 #define HCI_PAGE_SCAN_ENABLE 0x02 230 /* 0x04 - 0xFF - reserved for future use */ 231 232 /* Hold mode activities */ 233 #define HCI_HOLD_MODE_NO_CHANGE 0x00 234 #define HCI_HOLD_MODE_SUSPEND_PAGE_SCAN 0x01 235 #define HCI_HOLD_MODE_SUSPEND_INQUIRY_SCAN 0x02 236 #define HCI_HOLD_MODE_SUSPEND_PERIOD_INQUIRY 0x04 237 /* 0x08 - 0x80 - reserved for future use */ 238 239 /* Connection roles */ 240 #define HCI_ROLE_MASTER 0x00 241 #define HCI_ROLE_SLAVE 0x01 242 /* 0x02 - 0xFF - reserved for future use */ 243 244 /* Key flags */ 245 #define HCI_USE_SEMI_PERMANENT_LINK_KEYS 0x00 246 #define HCI_USE_TEMPORARY_LINK_KEY 0x01 247 /* 0x02 - 0xFF - reserved for future use */ 248 249 /* Pin types */ 250 #define HCI_PIN_TYPE_VARIABLE 0x00 251 #define HCI_PIN_TYPE_FIXED 0x01 252 253 /* Link key types */ 254 #define HCI_LINK_KEY_TYPE_COMBINATION_KEY 0x00 255 #define HCI_LINK_KEY_TYPE_LOCAL_UNIT_KEY 0x01 256 #define HCI_LINK_KEY_TYPE_REMOTE_UNIT_KEY 0x02 257 /* 0x03 - 0xFF - reserved for future use */ 258 259 /* Encryption modes */ 260 #define HCI_ENCRYPTION_MODE_NONE 0x00 261 #define HCI_ENCRYPTION_MODE_P2P 0x01 262 #define HCI_ENCRYPTION_MODE_ALL 0x02 263 /* 0x03 - 0xFF - reserved for future use */ 264 265 /* Quality of service types */ 266 #define HCI_SERVICE_TYPE_NO_TRAFFIC 0x00 267 #define HCI_SERVICE_TYPE_BEST_EFFORT 0x01 268 #define HCI_SERVICE_TYPE_GUARANTEED 0x02 269 /* 0x03 - 0xFF - reserved for future use */ 270 271 /* Link policy settings */ 272 #define HCI_LINK_POLICY_DISABLE_ALL_LM_MODES 0x0000 273 #define HCI_LINK_POLICY_ENABLE_ROLE_SWITCH 0x0001 /* Master/Slave switch */ 274 #define HCI_LINK_POLICY_ENABLE_HOLD_MODE 0x0002 275 #define HCI_LINK_POLICY_ENABLE_SNIFF_MODE 0x0004 276 #define HCI_LINK_POLICY_ENABLE_PARK_MODE 0x0008 277 /* 0x0010 - 0x8000 - reserved for future use */ 278 279 /* Event masks */ 280 #define HCI_EVMSK_ALL 0x00000000ffffffff 281 #define HCI_EVMSK_NONE 0x0000000000000000 282 #define HCI_EVMSK_INQUIRY_COMPL 0x0000000000000001 283 #define HCI_EVMSK_INQUIRY_RESULT 0x0000000000000002 284 #define HCI_EVMSK_CON_COMPL 0x0000000000000004 285 #define HCI_EVMSK_CON_REQ 0x0000000000000008 286 #define HCI_EVMSK_DISCON_COMPL 0x0000000000000010 287 #define HCI_EVMSK_AUTH_COMPL 0x0000000000000020 288 #define HCI_EVMSK_REMOTE_NAME_REQ_COMPL 0x0000000000000040 289 #define HCI_EVMSK_ENCRYPTION_CHANGE 0x0000000000000080 290 #define HCI_EVMSK_CHANGE_CON_LINK_KEY_COMPL 0x0000000000000100 291 #define HCI_EVMSK_MASTER_LINK_KEY_COMPL 0x0000000000000200 292 #define HCI_EVMSK_READ_REMOTE_FEATURES_COMPL 0x0000000000000400 293 #define HCI_EVMSK_READ_REMOTE_VER_INFO_COMPL 0x0000000000000800 294 #define HCI_EVMSK_QOS_SETUP_COMPL 0x0000000000001000 295 #define HCI_EVMSK_COMMAND_COMPL 0x0000000000002000 296 #define HCI_EVMSK_COMMAND_STATUS 0x0000000000004000 297 #define HCI_EVMSK_HARDWARE_ERROR 0x0000000000008000 298 #define HCI_EVMSK_FLUSH_OCCUR 0x0000000000010000 299 #define HCI_EVMSK_ROLE_CHANGE 0x0000000000020000 300 #define HCI_EVMSK_NUM_COMPL_PKTS 0x0000000000040000 301 #define HCI_EVMSK_MODE_CHANGE 0x0000000000080000 302 #define HCI_EVMSK_RETURN_LINK_KEYS 0x0000000000100000 303 #define HCI_EVMSK_PIN_CODE_REQ 0x0000000000200000 304 #define HCI_EVMSK_LINK_KEY_REQ 0x0000000000400000 305 #define HCI_EVMSK_LINK_KEY_NOTIFICATION 0x0000000000800000 306 #define HCI_EVMSK_LOOPBACK_COMMAND 0x0000000001000000 307 #define HCI_EVMSK_DATA_BUFFER_OVERFLOW 0x0000000002000000 308 #define HCI_EVMSK_MAX_SLOT_CHANGE 0x0000000004000000 309 #define HCI_EVMSK_READ_CLOCK_OFFSET_COMLETE 0x0000000008000000 310 #define HCI_EVMSK_CON_PKT_TYPE_CHANGED 0x0000000010000000 311 #define HCI_EVMSK_QOS_VIOLATION 0x0000000020000000 312 #define HCI_EVMSK_PAGE_SCAN_MODE_CHANGE 0x0000000040000000 313 #define HCI_EVMSK_PAGE_SCAN_REP_MODE_CHANGE 0x0000000080000000 314 /* 0x0000000100000000 - 0x8000000000000000 - reserved for future use */ 315 316 /* Filter types */ 317 #define HCI_FILTER_TYPE_NONE 0x00 318 #define HCI_FILTER_TYPE_INQUIRY_RESULT 0x01 319 #define HCI_FILTER_TYPE_CON_SETUP 0x02 320 /* 0x03 - 0xFF - reserved for future use */ 321 322 /* Filter condition types for HCI_FILTER_TYPE_INQUIRY_RESULT */ 323 #define HCI_FILTER_COND_INQUIRY_NEW_UNIT 0x00 324 #define HCI_FILTER_COND_INQUIRY_UNIT_CLASS 0x01 325 #define HCI_FILTER_COND_INQUIRY_BDADDR 0x02 326 /* 0x03 - 0xFF - reserved for future use */ 327 328 /* Filter condition types for HCI_FILTER_TYPE_CON_SETUP */ 329 #define HCI_FILTER_COND_CON_ANY_UNIT 0x00 330 #define HCI_FILTER_COND_CON_UNIT_CLASS 0x01 331 #define HCI_FILTER_COND_CON_BDADDR 0x02 332 /* 0x03 - 0xFF - reserved for future use */ 333 334 /* Xmit level types */ 335 #define HCI_XMIT_LEVEL_CURRENT 0x00 336 #define HCI_XMIT_LEVEL_MAXIMUM 0x01 337 /* 0x02 - 0xFF - reserved for future use */ 338 339 /* Host Controller to Host flow control */ 340 #define HCI_HC2H_FLOW_CONTROL_NONE 0x00 341 #define HCI_HC2H_FLOW_CONTROL_ACL 0x01 342 #define HCI_HC2H_FLOW_CONTROL_SCO 0x02 343 #define HCI_HC2H_FLOW_CONTROL_BOTH 0x03 344 /* 0x04 - 0xFF - reserved future use */ 345 346 /* Loopback modes */ 347 #define HCI_LOOPBACK_NONE 0x00 348 #define HCI_LOOPBACK_LOCAL 0x01 349 #define HCI_LOOPBACK_REMOTE 0x02 350 /* 0x03 - 0xFF - reserved future use */ 351 352 /************************************************************************** 353 ************************************************************************** 354 ** Link level defines, headers and types 355 ************************************************************************** 356 **************************************************************************/ 357 358 /* 359 * Macro(s) to combine OpCode and extract OGF (OpCode Group Field) 360 * and OCF (OpCode Command Field) from OpCode. 361 */ 362 363 #define HCI_OPCODE(gf,cf) ((((gf) & 0x3f) << 10) | ((cf) & 0x3ff)) 364 #define HCI_OCF(op) ((op) & 0x3ff) 365 #define HCI_OGF(op) (((op) >> 10) & 0x3f) 366 367 /* 368 * Macro(s) to extract/combine connection handle, BC (Broadcast) and 369 * PB (Packet boundary) flags. 370 */ 371 372 #define HCI_CON_HANDLE(h) ((h) & 0x0fff) 373 #define HCI_PB_FLAG(h) (((h) & 0x3000) >> 12) 374 #define HCI_BC_FLAG(h) (((h) & 0xc000) >> 14) 375 #define HCI_MK_CON_HANDLE(h, pb, bc) \ 376 (((h) & 0x0fff) | (((pb) & 3) << 12) | (((bc) & 3) << 14)) 377 378 /* PB flag values */ 379 /* 00 - reserved for future use */ 380 #define HCI_PACKET_FRAGMENT 0x1 381 #define HCI_PACKET_START 0x2 382 /* 11 - reserved for future use */ 383 384 /* BC flag values */ 385 #define HCI_POINT2POINT 0x0 /* only Host controller to Host */ 386 #define HCI_BROADCAST_ACTIVE 0x1 /* both directions */ 387 #define HCI_BROADCAST_PICONET 0x2 /* both directions */ 388 /* 11 - reserved for future use */ 389 390 /* HCI command packet header */ 391 typedef struct { 392 uint8_t type; /* MUST be 0x01 */ 393 uint16_t opcode; /* OpCode */ 394 uint8_t length; /* parameter(s) length in bytes */ 395 } __attribute__ ((__packed__)) hci_cmd_hdr_t; 396 397 #define HCI_CMD_PKT 0x01 398 #define HCI_CMD_PKT_SIZE (sizeof(hci_cmd_hdr_t) + 0xff) 399 400 /* ACL data packet header */ 401 typedef struct { 402 uint8_t type; /* MUST be 0x02 */ 403 uint16_t con_handle; /* connection handle + PB + BC flags */ 404 uint16_t length; /* payload length in bytes */ 405 } __attribute__ ((__packed__)) hci_acldata_hdr_t; 406 407 #define HCI_ACL_DATA_PKT 0x02 408 #define HCI_ACL_PKT_SIZE (sizeof(hci_acldata_hdr_t) + 0xffff) 409 410 /* SCO data packet header */ 411 typedef struct { 412 uint8_t type; /* MUST be 0x03 */ 413 uint16_t con_handle; /* connection handle + reserved bits */ 414 uint8_t length; /* payload length in bytes */ 415 } __attribute__ ((__packed__)) hci_scodata_hdr_t; 416 417 #define HCI_SCO_DATA_PKT 0x03 418 #define HCI_SCO_PKT_SIZE (sizeof(hci_scodata_hdr_t) + 0xff) 419 420 /* HCI event packet header */ 421 typedef struct { 422 uint8_t type; /* MUST be 0x04 */ 423 uint8_t event; /* event */ 424 uint8_t length; /* parameter(s) length in bytes */ 425 } __attribute__ ((__packed__)) hci_event_hdr_t; 426 427 #define HCI_EVENT_PKT 0x04 428 #define HCI_EVENT_PKT_SIZE (sizeof(hci_event_hdr_t) + 0xff) 429 430 /* HCI status return parameter */ 431 typedef struct { 432 uint8_t status; /* 0x00 - success */ 433 } __attribute__ ((__packed__)) hci_status_rp; 434 435 /************************************************************************** 436 ************************************************************************** 437 ** OGF 0x01 Link control commands and return parameters 438 ************************************************************************** 439 **************************************************************************/ 440 441 #define HCI_OGF_LINK_CONTROL 0x01 442 443 #define HCI_OCF_INQUIRY 0x0001 444 #define HCI_CMD_INQUIRY 0x0401 445 typedef struct { 446 uint8_t lap[HCI_LAP_SIZE]; /* LAP */ 447 uint8_t inquiry_length; /* (N x 1.28) sec */ 448 uint8_t num_responses; /* Max. # of responses */ 449 } __attribute__ ((__packed__)) hci_inquiry_cp; 450 /* No return parameter(s) */ 451 452 #define HCI_OCF_INQUIRY_CANCEL 0x0002 453 #define HCI_CMD_INQUIRY_CANCEL 0x0402 454 /* No command parameter(s) */ 455 typedef hci_status_rp hci_inquiry_cancel_rp; 456 457 #define HCI_OCF_PERIODIC_INQUIRY 0x0003 458 #define HCI_CMD_PERIODIC_INQUIRY 0x0403 459 typedef struct { 460 uint16_t max_period_length; /* Max. and min. amount of time */ 461 uint16_t min_period_length; /* between consecutive inquiries */ 462 uint8_t lap[HCI_LAP_SIZE]; /* LAP */ 463 uint8_t inquiry_length; /* (inquiry_length * 1.28) sec */ 464 uint8_t num_responses; /* Max. # of responses */ 465 } __attribute__ ((__packed__)) hci_periodic_inquiry_cp; 466 467 typedef hci_status_rp hci_periodic_inquiry_rp; 468 469 #define HCI_OCF_EXIT_PERIODIC_INQUIRY 0x0004 470 #define HCI_CMD_EXIT_PERIODIC_INQUIRY 0x0404 471 /* No command parameter(s) */ 472 typedef hci_status_rp hci_exit_periodic_inquiry_rp; 473 474 #define HCI_OCF_CREATE_CON 0x0005 475 #define HCI_CMD_CREATE_CON 0x0405 476 typedef struct { 477 bdaddr_t bdaddr; /* destination address */ 478 uint16_t pkt_type; /* packet type */ 479 uint8_t page_scan_rep_mode; /* page scan repetition mode */ 480 uint8_t page_scan_mode; /* reserved - set to 0x00 */ 481 uint16_t clock_offset; /* clock offset */ 482 uint8_t accept_role_switch; /* accept role switch? 0x00 == No */ 483 } __attribute__ ((__packed__)) hci_create_con_cp; 484 /* No return parameter(s) */ 485 486 #define HCI_OCF_DISCONNECT 0x0006 487 #define HCI_CMD_DISCONNECT 0x0406 488 typedef struct { 489 uint16_t con_handle; /* connection handle */ 490 uint8_t reason; /* reason to disconnect */ 491 } __attribute__ ((__packed__)) hci_discon_cp; 492 /* No return parameter(s) */ 493 494 /* Add SCO Connection is deprecated */ 495 #define HCI_OCF_ADD_SCO_CON 0x0007 496 #define HCI_CMD_ADD_SCO_CON 0x0407 497 typedef struct { 498 uint16_t con_handle; /* connection handle */ 499 uint16_t pkt_type; /* packet type */ 500 } __attribute__ ((__packed__)) hci_add_sco_con_cp; 501 /* No return parameter(s) */ 502 503 #define HCI_OCF_CREATE_CON_CANCEL 0x0008 504 #define HCI_CMD_CREATE_CON_CANCEL 0x0408 505 typedef struct { 506 bdaddr_t bdaddr; /* destination address */ 507 } __attribute__ ((__packed__)) hci_create_con_cancel_cp; 508 509 typedef struct { 510 uint8_t status; /* 0x00 - success */ 511 bdaddr_t bdaddr; /* destination address */ 512 } __attribute__ ((__packed__)) hci_create_con_cancel_rp; 513 514 #define HCI_OCF_ACCEPT_CON 0x0009 515 #define HCI_CMD_ACCEPT_CON 0x0409 516 typedef struct { 517 bdaddr_t bdaddr; /* address of unit to be connected */ 518 uint8_t role; /* connection role */ 519 } __attribute__ ((__packed__)) hci_accept_con_cp; 520 /* No return parameter(s) */ 521 522 #define HCI_OCF_REJECT_CON 0x000a 523 #define HCI_CMD_REJECT_CON 0x040A 524 typedef struct { 525 bdaddr_t bdaddr; /* remote address */ 526 uint8_t reason; /* reason to reject */ 527 } __attribute__ ((__packed__)) hci_reject_con_cp; 528 /* No return parameter(s) */ 529 530 #define HCI_OCF_LINK_KEY_REP 0x000b 531 #define HCI_CMD_LINK_KEY_REP 0x040B 532 typedef struct { 533 bdaddr_t bdaddr; /* remote address */ 534 uint8_t key[HCI_KEY_SIZE]; /* key */ 535 } __attribute__ ((__packed__)) hci_link_key_rep_cp; 536 537 typedef struct { 538 uint8_t status; /* 0x00 - success */ 539 bdaddr_t bdaddr; /* unit address */ 540 } __attribute__ ((__packed__)) hci_link_key_rep_rp; 541 542 #define HCI_OCF_LINK_KEY_NEG_REP 0x000c 543 #define HCI_CMD_LINK_KEY_NEG_REP 0x040C 544 typedef struct { 545 bdaddr_t bdaddr; /* remote address */ 546 } __attribute__ ((__packed__)) hci_link_key_neg_rep_cp; 547 548 typedef struct { 549 uint8_t status; /* 0x00 - success */ 550 bdaddr_t bdaddr; /* unit address */ 551 } __attribute__ ((__packed__)) hci_link_key_neg_rep_rp; 552 553 #define HCI_OCF_PIN_CODE_REP 0x000d 554 #define HCI_CMD_PIN_CODE_REP 0x040D 555 typedef struct { 556 bdaddr_t bdaddr; /* remote address */ 557 uint8_t pin_size; /* pin code length (in bytes) */ 558 uint8_t pin[HCI_PIN_SIZE]; /* pin code */ 559 } __attribute__ ((__packed__)) hci_pin_code_rep_cp; 560 561 typedef struct { 562 uint8_t status; /* 0x00 - success */ 563 bdaddr_t bdaddr; /* unit address */ 564 } __attribute__ ((__packed__)) hci_pin_code_rep_rp; 565 566 #define HCI_OCF_PIN_CODE_NEG_REP 0x000e 567 #define HCI_CMD_PIN_CODE_NEG_REP 0x040E 568 typedef struct { 569 bdaddr_t bdaddr; /* remote address */ 570 } __attribute__ ((__packed__)) hci_pin_code_neg_rep_cp; 571 572 typedef struct { 573 uint8_t status; /* 0x00 - success */ 574 bdaddr_t bdaddr; /* unit address */ 575 } __attribute__ ((__packed__)) hci_pin_code_neg_rep_rp; 576 577 #define HCI_OCF_CHANGE_CON_PACKET_TYPE 0x000f 578 #define HCI_CMD_CHANGE_CON_PACKET_TYPE 0x040F 579 typedef struct { 580 uint16_t con_handle; /* connection handle */ 581 uint16_t pkt_type; /* packet type */ 582 } __attribute__ ((__packed__)) hci_change_con_pkt_type_cp; 583 /* No return parameter(s) */ 584 585 #define HCI_OCF_AUTH_REQ 0x0011 586 #define HCI_CMD_AUTH_REQ 0x0411 587 typedef struct { 588 uint16_t con_handle; /* connection handle */ 589 } __attribute__ ((__packed__)) hci_auth_req_cp; 590 /* No return parameter(s) */ 591 592 #define HCI_OCF_SET_CON_ENCRYPTION 0x0013 593 #define HCI_CMD_SET_CON_ENCRYPTION 0x0413 594 typedef struct { 595 uint16_t con_handle; /* connection handle */ 596 uint8_t encryption_enable; /* 0x00 - disable, 0x01 - enable */ 597 } __attribute__ ((__packed__)) hci_set_con_encryption_cp; 598 /* No return parameter(s) */ 599 600 #define HCI_OCF_CHANGE_CON_LINK_KEY 0x0015 601 #define HCI_CMD_CHANGE_CON_LINK_KEY 0x0415 602 typedef struct { 603 uint16_t con_handle; /* connection handle */ 604 } __attribute__ ((__packed__)) hci_change_con_link_key_cp; 605 /* No return parameter(s) */ 606 607 #define HCI_OCF_MASTER_LINK_KEY 0x0017 608 #define HCI_CMD_MASTER_LINK_KEY 0x0417 609 typedef struct { 610 uint8_t key_flag; /* key flag */ 611 } __attribute__ ((__packed__)) hci_master_link_key_cp; 612 /* No return parameter(s) */ 613 614 #define HCI_OCF_REMOTE_NAME_REQ 0x0019 615 #define HCI_CMD_REMOTE_NAME_REQ 0x0419 616 typedef struct { 617 bdaddr_t bdaddr; /* remote address */ 618 uint8_t page_scan_rep_mode; /* page scan repetition mode */ 619 uint8_t page_scan_mode; /* page scan mode */ 620 uint16_t clock_offset; /* clock offset */ 621 } __attribute__ ((__packed__)) hci_remote_name_req_cp; 622 /* No return parameter(s) */ 623 624 #define HCI_OCF_REMOTE_NAME_REQ_CANCEL 0x001a 625 #define HCI_CMD_REMOTE_NAME_REQ_CANCEL 0x041A 626 typedef struct { 627 bdaddr_t bdaddr; /* remote address */ 628 } __attribute__ ((__packed__)) hci_remote_name_req_cancel_cp; 629 630 typedef struct { 631 uint8_t status; /* 0x00 - success */ 632 bdaddr_t bdaddr; /* remote address */ 633 } __attribute__ ((__packed__)) hci_remote_name_req_cancel_rp; 634 635 #define HCI_OCF_READ_REMOTE_FEATURES 0x001b 636 #define HCI_CMD_READ_REMOTE_FEATURES 0x041B 637 typedef struct { 638 uint16_t con_handle; /* connection handle */ 639 } __attribute__ ((__packed__)) hci_read_remote_features_cp; 640 /* No return parameter(s) */ 641 642 #define HCI_OCF_READ_REMOTE_EXTENDED_FEATURES 0x001c 643 #define HCI_CMD_READ_REMOTE_EXTENDED_FEATURES 0x041C 644 typedef struct { 645 uint16_t con_handle; /* connection handle */ 646 uint8_t page; /* page number */ 647 } __attribute__ ((__packed__)) hci_read_remote_extended_features_cp; 648 /* No return parameter(s) */ 649 650 #define HCI_OCF_READ_REMOTE_VER_INFO 0x001d 651 #define HCI_CMD_READ_REMOTE_VER_INFO 0x041D 652 typedef struct { 653 uint16_t con_handle; /* connection handle */ 654 } __attribute__ ((__packed__)) hci_read_remote_ver_info_cp; 655 /* No return parameter(s) */ 656 657 #define HCI_OCF_READ_CLOCK_OFFSET 0x001f 658 #define HCI_CMD_READ_CLOCK_OFFSET 0x041F 659 typedef struct { 660 uint16_t con_handle; /* connection handle */ 661 } __attribute__ ((__packed__)) hci_read_clock_offset_cp; 662 /* No return parameter(s) */ 663 664 #define HCI_OCF_READ_LMP_HANDLE 0x0020 665 #define HCI_CMD_READ_LMP_HANDLE 0x0420 666 typedef struct { 667 uint16_t con_handle; /* connection handle */ 668 } __attribute__ ((__packed__)) hci_read_lmp_handle_cp; 669 670 typedef struct { 671 uint8_t status; /* 0x00 - success */ 672 uint16_t con_handle; /* connection handle */ 673 uint8_t lmp_handle; /* LMP handle */ 674 uint32_t reserved; /* reserved */ 675 } __attribute__ ((__packed__)) hci_read_lmp_handle_rp; 676 677 #define HCI_OCF_SETUP_SCO_CON 0x0028 678 #define HCI_CMD_SETUP_SCO_CON 0x0428 679 typedef struct { 680 uint16_t con_handle; /* connection handle */ 681 uint32_t tx_bandwidth; /* transmit bandwidth */ 682 uint32_t rx_bandwidth; /* receive bandwidth */ 683 uint16_t latency; /* maximum latency */ 684 uint16_t voice; /* voice setting */ 685 uint8_t rt_effort; /* retransmission effort */ 686 uint16_t pkt_type; /* packet types */ 687 } __attribute__ ((__packed__)) hci_setup_sco_con_cp; 688 /* No return parameter(s) */ 689 690 #define HCI_OCF_ACCEPT_SCO_CON_REQ 0x0029 691 #define HCI_CMD_ACCEPT_SCO_CON_REQ 0x0429 692 typedef struct { 693 bdaddr_t bdaddr; /* remote address */ 694 uint32_t tx_bandwidth; /* transmit bandwidth */ 695 uint32_t rx_bandwidth; /* receive bandwidth */ 696 uint16_t latency; /* maximum latency */ 697 uint16_t content; /* voice setting */ 698 uint8_t rt_effort; /* retransmission effort */ 699 uint16_t pkt_type; /* packet types */ 700 } __attribute__ ((__packed__)) hci_accept_sco_con_req_cp; 701 /* No return parameter(s) */ 702 703 #define HCI_OCF_REJECT_SCO_CON_REQ 0x002a 704 #define HCI_CMD_REJECT_SCO_CON_REQ 0x042a 705 typedef struct { 706 bdaddr_t bdaddr; /* remote address */ 707 uint8_t reason; /* reject error code */ 708 } __attribute__ ((__packed__)) hci_reject_sco_con_req_cp; 709 /* No return parameter(s) */ 710 711 /************************************************************************** 712 ************************************************************************** 713 ** OGF 0x02 Link policy commands and return parameters 714 ************************************************************************** 715 **************************************************************************/ 716 717 #define HCI_OGF_LINK_POLICY 0x02 718 719 #define HCI_OCF_HOLD_MODE 0x0001 720 #define HCI_CMD_HOLD_MODE 0x0801 721 typedef struct { 722 uint16_t con_handle; /* connection handle */ 723 uint16_t max_interval; /* (max_interval * 0.625) msec */ 724 uint16_t min_interval; /* (max_interval * 0.625) msec */ 725 } __attribute__ ((__packed__)) hci_hold_mode_cp; 726 /* No return parameter(s) */ 727 728 #define HCI_OCF_SNIFF_MODE 0x0003 729 #define HCI_CMD_SNIFF_MODE 0x0803 730 typedef struct { 731 uint16_t con_handle; /* connection handle */ 732 uint16_t max_interval; /* (max_interval * 0.625) msec */ 733 uint16_t min_interval; /* (max_interval * 0.625) msec */ 734 uint16_t attempt; /* (2 * attempt - 1) * 0.625 msec */ 735 uint16_t timeout; /* (2 * attempt - 1) * 0.625 msec */ 736 } __attribute__ ((__packed__)) hci_sniff_mode_cp; 737 /* No return parameter(s) */ 738 739 #define HCI_OCF_EXIT_SNIFF_MODE 0x0004 740 #define HCI_CMD_EXIT_SNIFF_MODE 0x0804 741 typedef struct { 742 uint16_t con_handle; /* connection handle */ 743 } __attribute__ ((__packed__)) hci_exit_sniff_mode_cp; 744 /* No return parameter(s) */ 745 746 #define HCI_OCF_PARK_MODE 0x0005 747 #define HCI_CMD_PARK_MODE 0x0805 748 typedef struct { 749 uint16_t con_handle; /* connection handle */ 750 uint16_t max_interval; /* (max_interval * 0.625) msec */ 751 uint16_t min_interval; /* (max_interval * 0.625) msec */ 752 } __attribute__ ((__packed__)) hci_park_mode_cp; 753 /* No return parameter(s) */ 754 755 #define HCI_OCF_EXIT_PARK_MODE 0x0006 756 #define HCI_CMD_EXIT_PARK_MODE 0x0806 757 typedef struct { 758 uint16_t con_handle; /* connection handle */ 759 } __attribute__ ((__packed__)) hci_exit_park_mode_cp; 760 /* No return parameter(s) */ 761 762 #define HCI_OCF_QOS_SETUP 0x0007 763 #define HCI_CMD_QOS_SETUP 0x0807 764 typedef struct { 765 uint16_t con_handle; /* connection handle */ 766 uint8_t flags; /* reserved for future use */ 767 uint8_t service_type; /* service type */ 768 uint32_t token_rate; /* bytes per second */ 769 uint32_t peak_bandwidth; /* bytes per second */ 770 uint32_t latency; /* microseconds */ 771 uint32_t delay_variation; /* microseconds */ 772 } __attribute__ ((__packed__)) hci_qos_setup_cp; 773 /* No return parameter(s) */ 774 775 #define HCI_OCF_ROLE_DISCOVERY 0x0009 776 #define HCI_CMD_ROLE_DISCOVERY 0x0809 777 typedef struct { 778 uint16_t con_handle; /* connection handle */ 779 } __attribute__ ((__packed__)) hci_role_discovery_cp; 780 781 typedef struct { 782 uint8_t status; /* 0x00 - success */ 783 uint16_t con_handle; /* connection handle */ 784 uint8_t role; /* role for the connection handle */ 785 } __attribute__ ((__packed__)) hci_role_discovery_rp; 786 787 #define HCI_OCF_SWITCH_ROLE 0x000b 788 #define HCI_CMD_SWITCH_ROLE 0x080B 789 typedef struct { 790 bdaddr_t bdaddr; /* remote address */ 791 uint8_t role; /* new local role */ 792 } __attribute__ ((__packed__)) hci_switch_role_cp; 793 /* No return parameter(s) */ 794 795 #define HCI_OCF_READ_LINK_POLICY_SETTINGS 0x000c 796 #define HCI_CMD_READ_LINK_POLICY_SETTINGS 0x080C 797 typedef struct { 798 uint16_t con_handle; /* connection handle */ 799 } __attribute__ ((__packed__)) hci_read_link_policy_settings_cp; 800 801 typedef struct { 802 uint8_t status; /* 0x00 - success */ 803 uint16_t con_handle; /* connection handle */ 804 uint16_t settings; /* link policy settings */ 805 } __attribute__ ((__packed__)) hci_read_link_policy_settings_rp; 806 807 #define HCI_OCF_WRITE_LINK_POLICY_SETTINGS 0x000d 808 #define HCI_CMD_WRITE_LINK_POLICY_SETTINGS 0x080D 809 typedef struct { 810 uint16_t con_handle; /* connection handle */ 811 uint16_t settings; /* link policy settings */ 812 } __attribute__ ((__packed__)) hci_write_link_policy_settings_cp; 813 814 typedef struct { 815 uint8_t status; /* 0x00 - success */ 816 uint16_t con_handle; /* connection handle */ 817 } __attribute__ ((__packed__)) hci_write_link_policy_settings_rp; 818 819 #define HCI_OCF_READ_DEFAULT_LINK_POLICY_SETTINGS 0x000e 820 #define HCI_CMD_READ_DEFAULT_LINK_POLICY_SETTINGS 0x080E 821 /* No command parameter(s) */ 822 typedef struct { 823 uint8_t status; /* 0x00 - success */ 824 uint16_t settings; /* link policy settings */ 825 } __attribute__ ((__packed__)) hci_read_default_link_policy_settings_rp; 826 827 #define HCI_OCF_WRITE_DEFAULT_LINK_POLICY_SETTINGS 0x000f 828 #define HCI_CMD_WRITE_DEFAULT_LINK_POLICY_SETTINGS 0x080F 829 typedef struct { 830 uint16_t settings; /* link policy settings */ 831 } __attribute__ ((__packed__)) hci_write_default_link_policy_settings_cp; 832 833 typedef hci_status_rp hci_write_default_link_policy_settings_rp; 834 835 #define HCI_OCF_FLOW_SPECIFICATION 0x0010 836 #define HCI_CMD_FLOW_SPECIFICATION 0x0810 837 typedef struct { 838 uint16_t con_handle; /* connection handle */ 839 uint8_t flags; /* reserved */ 840 uint8_t flow_direction; 841 uint8_t service_type; 842 uint32_t token_rate; 843 uint32_t token_bucket; 844 uint32_t peak_bandwidth; 845 uint32_t latency; 846 } __attribute__ ((__packed__)) hci_flow_specification_cp; 847 /* No return parameter(s) */ 848 849 /************************************************************************** 850 ************************************************************************** 851 ** OGF 0x03 Host Controller and Baseband commands and return parameters 852 ************************************************************************** 853 **************************************************************************/ 854 855 #define HCI_OGF_HC_BASEBAND 0x03 856 857 #define HCI_OCF_SET_EVENT_MASK 0x0001 858 #define HCI_CMD_SET_EVENT_MASK 0x0C01 859 typedef struct { 860 uint8_t event_mask[HCI_EVENT_MASK_SIZE]; /* event_mask */ 861 } __attribute__ ((__packed__)) hci_set_event_mask_cp; 862 863 typedef hci_status_rp hci_set_event_mask_rp; 864 865 #define HCI_OCF_RESET 0x0003 866 #define HCI_CMD_RESET 0x0C03 867 /* No command parameter(s) */ 868 typedef hci_status_rp hci_reset_rp; 869 870 #define HCI_OCF_SET_EVENT_FILTER 0x0005 871 #define HCI_CMD_SET_EVENT_FILTER 0x0C05 872 typedef struct { 873 uint8_t filter_type; /* filter type */ 874 uint8_t filter_condition_type; /* filter condition type */ 875 /* variable size condition 876 uint8_t condition[]; -- conditions */ 877 } __attribute__ ((__packed__)) hci_set_event_filter_cp; 878 879 typedef hci_status_rp hci_set_event_filter_rp; 880 881 #define HCI_OCF_FLUSH 0x0008 882 #define HCI_CMD_FLUSH 0x0C08 883 typedef struct { 884 uint16_t con_handle; /* connection handle */ 885 } __attribute__ ((__packed__)) hci_flush_cp; 886 887 typedef struct { 888 uint8_t status; /* 0x00 - success */ 889 uint16_t con_handle; /* connection handle */ 890 } __attribute__ ((__packed__)) hci_flush_rp; 891 892 #define HCI_OCF_READ_PIN_TYPE 0x0009 893 #define HCI_CMD_READ_PIN_TYPE 0x0C09 894 /* No command parameter(s) */ 895 typedef struct { 896 uint8_t status; /* 0x00 - success */ 897 uint8_t pin_type; /* PIN type */ 898 } __attribute__ ((__packed__)) hci_read_pin_type_rp; 899 900 #define HCI_OCF_WRITE_PIN_TYPE 0x000a 901 #define HCI_CMD_WRITE_PIN_TYPE 0x0C0A 902 typedef struct { 903 uint8_t pin_type; /* PIN type */ 904 } __attribute__ ((__packed__)) hci_write_pin_type_cp; 905 906 typedef hci_status_rp hci_write_pin_type_rp; 907 908 #define HCI_OCF_CREATE_NEW_UNIT_KEY 0x000b 909 #define HCI_CMD_CREATE_NEW_UNIT_KEY 0x0C0B 910 /* No command parameter(s) */ 911 typedef hci_status_rp hci_create_new_unit_key_rp; 912 913 #define HCI_OCF_READ_STORED_LINK_KEY 0x000d 914 #define HCI_CMD_READ_STORED_LINK_KEY 0x0C0D 915 typedef struct { 916 bdaddr_t bdaddr; /* address */ 917 uint8_t read_all; /* read all keys? 0x01 - yes */ 918 } __attribute__ ((__packed__)) hci_read_stored_link_key_cp; 919 920 typedef struct { 921 uint8_t status; /* 0x00 - success */ 922 uint16_t max_num_keys; /* Max. number of keys */ 923 uint16_t num_keys_read; /* Number of stored keys */ 924 } __attribute__ ((__packed__)) hci_read_stored_link_key_rp; 925 926 #define HCI_OCF_WRITE_STORED_LINK_KEY 0x0011 927 #define HCI_CMD_WRITE_STORED_LINK_KEY 0x0C11 928 typedef struct { 929 uint8_t num_keys_write; /* # of keys to write */ 930 /* these are repeated "num_keys_write" times 931 bdaddr_t bdaddr; --- remote address(es) 932 uint8_t key[HCI_KEY_SIZE]; --- key(s) */ 933 } __attribute__ ((__packed__)) hci_write_stored_link_key_cp; 934 935 typedef struct { 936 uint8_t status; /* 0x00 - success */ 937 uint8_t num_keys_written; /* # of keys successfully written */ 938 } __attribute__ ((__packed__)) hci_write_stored_link_key_rp; 939 940 #define HCI_OCF_DELETE_STORED_LINK_KEY 0x0012 941 #define HCI_CMD_DELETE_STORED_LINK_KEY 0x0C12 942 typedef struct { 943 bdaddr_t bdaddr; /* address */ 944 uint8_t delete_all; /* delete all keys? 0x01 - yes */ 945 } __attribute__ ((__packed__)) hci_delete_stored_link_key_cp; 946 947 typedef struct { 948 uint8_t status; /* 0x00 - success */ 949 uint16_t num_keys_deleted; /* Number of keys deleted */ 950 } __attribute__ ((__packed__)) hci_delete_stored_link_key_rp; 951 952 #define HCI_OCF_WRITE_LOCAL_NAME 0x0013 953 #define HCI_CMD_WRITE_LOCAL_NAME 0x0C13 954 typedef struct { 955 char name[HCI_UNIT_NAME_SIZE]; /* new unit name */ 956 } __attribute__ ((__packed__)) hci_write_local_name_cp; 957 958 typedef hci_status_rp hci_write_local_name_rp; 959 960 #define HCI_OCF_READ_LOCAL_NAME 0x0014 961 #define HCI_CMD_READ_LOCAL_NAME 0x0C14 962 /* No command parameter(s) */ 963 typedef struct { 964 uint8_t status; /* 0x00 - success */ 965 char name[HCI_UNIT_NAME_SIZE]; /* unit name */ 966 } __attribute__ ((__packed__)) hci_read_local_name_rp; 967 968 #define HCI_OCF_READ_CON_ACCEPT_TIMEOUT 0x0015 969 #define HCI_CMD_READ_CON_ACCEPT_TIMEOUT 0x0C15 970 /* No command parameter(s) */ 971 typedef struct { 972 uint8_t status; /* 0x00 - success */ 973 uint16_t timeout; /* (timeout * 0.625) msec */ 974 } __attribute__ ((__packed__)) hci_read_con_accept_timeout_rp; 975 976 #define HCI_OCF_WRITE_CON_ACCEPT_TIMEOUT 0x0016 977 #define HCI_CMD_WRITE_CON_ACCEPT_TIMEOUT 0x0C16 978 typedef struct { 979 uint16_t timeout; /* (timeout * 0.625) msec */ 980 } __attribute__ ((__packed__)) hci_write_con_accept_timeout_cp; 981 982 typedef hci_status_rp hci_write_con_accept_timeout_rp; 983 984 #define HCI_OCF_READ_PAGE_TIMEOUT 0x0017 985 #define HCI_CMD_READ_PAGE_TIMEOUT 0x0C17 986 /* No command parameter(s) */ 987 typedef struct { 988 uint8_t status; /* 0x00 - success */ 989 uint16_t timeout; /* (timeout * 0.625) msec */ 990 } __attribute__ ((__packed__)) hci_read_page_timeout_rp; 991 992 #define HCI_OCF_WRITE_PAGE_TIMEOUT 0x0018 993 #define HCI_CMD_WRITE_PAGE_TIMEOUT 0x0C18 994 typedef struct { 995 uint16_t timeout; /* (timeout * 0.625) msec */ 996 } __attribute__ ((__packed__)) hci_write_page_timeout_cp; 997 998 typedef hci_status_rp hci_write_page_timeout_rp; 999 1000 #define HCI_OCF_READ_SCAN_ENABLE 0x0019 1001 #define HCI_CMD_READ_SCAN_ENABLE 0x0C19 1002 /* No command parameter(s) */ 1003 typedef struct { 1004 uint8_t status; /* 0x00 - success */ 1005 uint8_t scan_enable; /* Scan enable */ 1006 } __attribute__ ((__packed__)) hci_read_scan_enable_rp; 1007 1008 #define HCI_OCF_WRITE_SCAN_ENABLE 0x001a 1009 #define HCI_CMD_WRITE_SCAN_ENABLE 0x0C1A 1010 typedef struct { 1011 uint8_t scan_enable; /* Scan enable */ 1012 } __attribute__ ((__packed__)) hci_write_scan_enable_cp; 1013 1014 typedef hci_status_rp hci_write_scan_enable_rp; 1015 1016 #define HCI_OCF_READ_PAGE_SCAN_ACTIVITY 0x001b 1017 #define HCI_CMD_READ_PAGE_SCAN_ACTIVITY 0x0C1B 1018 /* No command parameter(s) */ 1019 typedef struct { 1020 uint8_t status; /* 0x00 - success */ 1021 uint16_t page_scan_interval; /* interval * 0.625 msec */ 1022 uint16_t page_scan_window; /* window * 0.625 msec */ 1023 } __attribute__ ((__packed__)) hci_read_page_scan_activity_rp; 1024 1025 #define HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY 0x001c 1026 #define HCI_CMD_WRITE_PAGE_SCAN_ACTIVITY 0x0C1C 1027 typedef struct { 1028 uint16_t page_scan_interval; /* interval * 0.625 msec */ 1029 uint16_t page_scan_window; /* window * 0.625 msec */ 1030 } __attribute__ ((__packed__)) hci_write_page_scan_activity_cp; 1031 1032 typedef hci_status_rp hci_write_page_scan_activity_rp; 1033 1034 #define HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY 0x001d 1035 #define HCI_CMD_READ_INQUIRY_SCAN_ACTIVITY 0x0C1D 1036 /* No command parameter(s) */ 1037 typedef struct { 1038 uint8_t status; /* 0x00 - success */ 1039 uint16_t inquiry_scan_interval; /* interval * 0.625 msec */ 1040 uint16_t inquiry_scan_window; /* window * 0.625 msec */ 1041 } __attribute__ ((__packed__)) hci_read_inquiry_scan_activity_rp; 1042 1043 #define HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY 0x001e 1044 #define HCI_CMD_WRITE_INQUIRY_SCAN_ACTIVITY 0x0C1E 1045 typedef struct { 1046 uint16_t inquiry_scan_interval; /* interval * 0.625 msec */ 1047 uint16_t inquiry_scan_window; /* window * 0.625 msec */ 1048 } __attribute__ ((__packed__)) hci_write_inquiry_scan_activity_cp; 1049 1050 typedef hci_status_rp hci_write_inquiry_scan_activity_rp; 1051 1052 #define HCI_OCF_READ_AUTH_ENABLE 0x001f 1053 #define HCI_CMD_READ_AUTH_ENABLE 0x0C1F 1054 /* No command parameter(s) */ 1055 typedef struct { 1056 uint8_t status; /* 0x00 - success */ 1057 uint8_t auth_enable; /* 0x01 - enabled */ 1058 } __attribute__ ((__packed__)) hci_read_auth_enable_rp; 1059 1060 #define HCI_OCF_WRITE_AUTH_ENABLE 0x0020 1061 #define HCI_CMD_WRITE_AUTH_ENABLE 0x0C20 1062 typedef struct { 1063 uint8_t auth_enable; /* 0x01 - enabled */ 1064 } __attribute__ ((__packed__)) hci_write_auth_enable_cp; 1065 1066 typedef hci_status_rp hci_write_auth_enable_rp; 1067 1068 #define HCI_OCF_READ_ENCRYPTION_MODE 0x0021 1069 #define HCI_CMD_READ_ENCRYPTION_MODE 0x0C21 1070 /* No command parameter(s) */ 1071 typedef struct { 1072 uint8_t status; /* 0x00 - success */ 1073 uint8_t encryption_mode; /* encryption mode */ 1074 } __attribute__ ((__packed__)) hci_read_encryption_mode_rp; 1075 1076 #define HCI_OCF_WRITE_ENCRYPTION_MODE 0x0022 1077 #define HCI_CMD_WRITE_ENCRYPTION_MODE 0x0C22 1078 typedef struct { 1079 uint8_t encryption_mode; /* encryption mode */ 1080 } __attribute__ ((__packed__)) hci_write_encryption_mode_cp; 1081 1082 typedef hci_status_rp hci_write_encryption_mode_rp; 1083 1084 #define HCI_OCF_READ_UNIT_CLASS 0x0023 1085 #define HCI_CMD_READ_UNIT_CLASS 0x0C23 1086 /* No command parameter(s) */ 1087 typedef struct { 1088 uint8_t status; /* 0x00 - success */ 1089 uint8_t uclass[HCI_CLASS_SIZE]; /* unit class */ 1090 } __attribute__ ((__packed__)) hci_read_unit_class_rp; 1091 1092 #define HCI_OCF_WRITE_UNIT_CLASS 0x0024 1093 #define HCI_CMD_WRITE_UNIT_CLASS 0x0C24 1094 typedef struct { 1095 uint8_t uclass[HCI_CLASS_SIZE]; /* unit class */ 1096 } __attribute__ ((__packed__)) hci_write_unit_class_cp; 1097 1098 typedef hci_status_rp hci_write_unit_class_rp; 1099 1100 #define HCI_OCF_READ_VOICE_SETTING 0x0025 1101 #define HCI_CMD_READ_VOICE_SETTING 0x0C25 1102 /* No command parameter(s) */ 1103 typedef struct { 1104 uint8_t status; /* 0x00 - success */ 1105 uint16_t settings; /* voice settings */ 1106 } __attribute__ ((__packed__)) hci_read_voice_setting_rp; 1107 1108 #define HCI_OCF_WRITE_VOICE_SETTING 0x0026 1109 #define HCI_CMD_WRITE_VOICE_SETTING 0x0C26 1110 typedef struct { 1111 uint16_t settings; /* voice settings */ 1112 } __attribute__ ((__packed__)) hci_write_voice_setting_cp; 1113 1114 typedef hci_status_rp hci_write_voice_setting_rp; 1115 1116 #define HCI_OCF_READ_AUTO_FLUSH_TIMEOUT 0x0027 1117 #define HCI_CMD_READ_AUTO_FLUSH_TIMEOUT 0x0C27 1118 typedef struct { 1119 uint16_t con_handle; /* connection handle */ 1120 } __attribute__ ((__packed__)) hci_read_auto_flush_timeout_cp; 1121 1122 typedef struct { 1123 uint8_t status; /* 0x00 - success */ 1124 uint16_t con_handle; /* connection handle */ 1125 uint16_t timeout; /* 0x00 - no flush, timeout * 0.625 msec */ 1126 } __attribute__ ((__packed__)) hci_read_auto_flush_timeout_rp; 1127 1128 #define HCI_OCF_WRITE_AUTO_FLUSH_TIMEOUT 0x0028 1129 #define HCI_CMD_WRITE_AUTO_FLUSH_TIMEOUT 0x0C28 1130 typedef struct { 1131 uint16_t con_handle; /* connection handle */ 1132 uint16_t timeout; /* 0x00 - no flush, timeout * 0.625 msec */ 1133 } __attribute__ ((__packed__)) hci_write_auto_flush_timeout_cp; 1134 1135 typedef struct { 1136 uint8_t status; /* 0x00 - success */ 1137 uint16_t con_handle; /* connection handle */ 1138 } __attribute__ ((__packed__)) hci_write_auto_flush_timeout_rp; 1139 1140 #define HCI_OCF_READ_NUM_BROADCAST_RETRANS 0x0029 1141 #define HCI_CMD_READ_NUM_BROADCAST_RETRANS 0x0C29 1142 /* No command parameter(s) */ 1143 typedef struct { 1144 uint8_t status; /* 0x00 - success */ 1145 uint8_t counter; /* number of broadcast retransmissions */ 1146 } __attribute__ ((__packed__)) hci_read_num_broadcast_retrans_rp; 1147 1148 #define HCI_OCF_WRITE_NUM_BROADCAST_RETRANS 0x002a 1149 #define HCI_CMD_WRITE_NUM_BROADCAST_RETRANS 0x0C2A 1150 typedef struct { 1151 uint8_t counter; /* number of broadcast retransmissions */ 1152 } __attribute__ ((__packed__)) hci_write_num_broadcast_retrans_cp; 1153 1154 typedef hci_status_rp hci_write_num_broadcast_retrans_rp; 1155 1156 #define HCI_OCF_READ_HOLD_MODE_ACTIVITY 0x002b 1157 #define HCI_CMD_READ_HOLD_MODE_ACTIVITY 0x0C2B 1158 /* No command parameter(s) */ 1159 typedef struct { 1160 uint8_t status; /* 0x00 - success */ 1161 uint8_t hold_mode_activity; /* Hold mode activities */ 1162 } __attribute__ ((__packed__)) hci_read_hold_mode_activity_rp; 1163 1164 #define HCI_OCF_WRITE_HOLD_MODE_ACTIVITY 0x002c 1165 #define HCI_CMD_WRITE_HOLD_MODE_ACTIVITY 0x0C2C 1166 typedef struct { 1167 uint8_t hold_mode_activity; /* Hold mode activities */ 1168 } __attribute__ ((__packed__)) hci_write_hold_mode_activity_cp; 1169 1170 typedef hci_status_rp hci_write_hold_mode_activity_rp; 1171 1172 #define HCI_OCF_READ_XMIT_LEVEL 0x002d 1173 #define HCI_CMD_READ_XMIT_LEVEL 0x0C2D 1174 typedef struct { 1175 uint16_t con_handle; /* connection handle */ 1176 uint8_t type; /* Xmit level type */ 1177 } __attribute__ ((__packed__)) hci_read_xmit_level_cp; 1178 1179 typedef struct { 1180 uint8_t status; /* 0x00 - success */ 1181 uint16_t con_handle; /* connection handle */ 1182 char level; /* -30 <= level <= 30 dBm */ 1183 } __attribute__ ((__packed__)) hci_read_xmit_level_rp; 1184 1185 #define HCI_OCF_READ_SCO_FLOW_CONTROL 0x002e 1186 #define HCI_CMD_READ_SCO_FLOW_CONTROL 0x0C2E 1187 /* No command parameter(s) */ 1188 typedef struct { 1189 uint8_t status; /* 0x00 - success */ 1190 uint8_t flow_control; /* 0x00 - disabled */ 1191 } __attribute__ ((__packed__)) hci_read_sco_flow_control_rp; 1192 1193 #define HCI_OCF_WRITE_SCO_FLOW_CONTROL 0x002f 1194 #define HCI_CMD_WRITE_SCO_FLOW_CONTROL 0x0C2F 1195 typedef struct { 1196 uint8_t flow_control; /* 0x00 - disabled */ 1197 } __attribute__ ((__packed__)) hci_write_sco_flow_control_cp; 1198 1199 typedef hci_status_rp hci_write_sco_flow_control_rp; 1200 1201 #define HCI_OCF_HC2H_FLOW_CONTROL 0x0031 1202 #define HCI_CMD_HC2H_FLOW_CONTROL 0x0C31 1203 typedef struct { 1204 uint8_t hc2h_flow; /* Host Controller to Host flow control */ 1205 } __attribute__ ((__packed__)) hci_hc2h_flow_control_cp; 1206 1207 typedef hci_status_rp hci_h2hc_flow_control_rp; 1208 1209 #define HCI_OCF_HOST_BUFFER_SIZE 0x0033 1210 #define HCI_CMD_HOST_BUFFER_SIZE 0x0C33 1211 typedef struct { 1212 uint16_t max_acl_size; /* Max. size of ACL packet (bytes) */ 1213 uint8_t max_sco_size; /* Max. size of SCO packet (bytes) */ 1214 uint16_t num_acl_pkts; /* Max. number of ACL packets */ 1215 uint16_t num_sco_pkts; /* Max. number of SCO packets */ 1216 } __attribute__ ((__packed__)) hci_host_buffer_size_cp; 1217 1218 typedef hci_status_rp hci_host_buffer_size_rp; 1219 1220 #define HCI_OCF_HOST_NUM_COMPL_PKTS 0x0035 1221 #define HCI_CMD_HOST_NUM_COMPL_PKTS 0x0C35 1222 typedef struct { 1223 uint8_t nu_con_handles; /* # of connection handles */ 1224 /* these are repeated "num_con_handles" times 1225 uint16_t con_handle; --- connection handle(s) 1226 uint16_t compl_pkts; --- # of completed packets */ 1227 } __attribute__ ((__packed__)) hci_host_num_compl_pkts_cp; 1228 /* No return parameter(s) */ 1229 1230 #define HCI_OCF_READ_LINK_SUPERVISION_TIMEOUT 0x0036 1231 #define HCI_CMD_READ_LINK_SUPERVISION_TIMEOUT 0x0C36 1232 typedef struct { 1233 uint16_t con_handle; /* connection handle */ 1234 } __attribute__ ((__packed__)) hci_read_link_supervision_timeout_cp; 1235 1236 typedef struct { 1237 uint8_t status; /* 0x00 - success */ 1238 uint16_t con_handle; /* connection handle */ 1239 uint16_t timeout; /* Link supervision timeout * 0.625 msec */ 1240 } __attribute__ ((__packed__)) hci_read_link_supervision_timeout_rp; 1241 1242 #define HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT 0x0037 1243 #define HCI_CMD_WRITE_LINK_SUPERVISION_TIMEOUT 0x0C37 1244 typedef struct { 1245 uint16_t con_handle; /* connection handle */ 1246 uint16_t timeout; /* Link supervision timeout * 0.625 msec */ 1247 } __attribute__ ((__packed__)) hci_write_link_supervision_timeout_cp; 1248 1249 typedef struct { 1250 uint8_t status; /* 0x00 - success */ 1251 uint16_t con_handle; /* connection handle */ 1252 } __attribute__ ((__packed__)) hci_write_link_supervision_timeout_rp; 1253 1254 #define HCI_OCF_READ_NUM_SUPPORTED_IAC 0x0038 1255 #define HCI_CMD_READ_NUM_SUPPORTED_IAC 0x0C38 1256 /* No command parameter(s) */ 1257 typedef struct { 1258 uint8_t status; /* 0x00 - success */ 1259 uint8_t num_iac; /* # of supported IAC during scan */ 1260 } __attribute__ ((__packed__)) hci_read_num_supported_iac_rp; 1261 1262 #define HCI_OCF_READ_IAC_LAP 0x0039 1263 #define HCI_CMD_READ_IAC_LAP 0x0C39 1264 /* No command parameter(s) */ 1265 typedef struct { 1266 uint8_t status; /* 0x00 - success */ 1267 uint8_t num_iac; /* # of IAC */ 1268 /* these are repeated "num_iac" times 1269 uint8_t laps[HCI_LAP_SIZE]; --- LAPs */ 1270 } __attribute__ ((__packed__)) hci_read_iac_lap_rp; 1271 1272 #define HCI_OCF_WRITE_IAC_LAP 0x003a 1273 #define HCI_CMD_WRITE_IAC_LAP 0x0C3A 1274 typedef struct { 1275 uint8_t num_iac; /* # of IAC */ 1276 /* these are repeated "num_iac" times 1277 uint8_t laps[HCI_LAP_SIZE]; --- LAPs */ 1278 } __attribute__ ((__packed__)) hci_write_iac_lap_cp; 1279 1280 typedef hci_status_rp hci_write_iac_lap_rp; 1281 1282 #define HCI_OCF_READ_PAGE_SCAN_PERIOD 0x003b 1283 #define HCI_CMD_READ_PAGE_SCAN_PERIOD 0x0C3B 1284 /* No command parameter(s) */ 1285 typedef struct { 1286 uint8_t status; /* 0x00 - success */ 1287 uint8_t page_scan_period_mode; /* Page scan period mode */ 1288 } __attribute__ ((__packed__)) hci_read_page_scan_period_rp; 1289 1290 #define HCI_OCF_WRITE_PAGE_SCAN_PERIOD 0x003c 1291 #define HCI_CMD_WRITE_PAGE_SCAN_PERIOD 0x0C3C 1292 typedef struct { 1293 uint8_t page_scan_period_mode; /* Page scan period mode */ 1294 } __attribute__ ((__packed__)) hci_write_page_scan_period_cp; 1295 1296 typedef hci_status_rp hci_write_page_scan_period_rp; 1297 1298 /* Read Page Scan Mode is deprecated */ 1299 #define HCI_OCF_READ_PAGE_SCAN 0x003d 1300 #define HCI_CMD_READ_PAGE_SCAN 0x0C3D 1301 /* No command parameter(s) */ 1302 typedef struct { 1303 uint8_t status; /* 0x00 - success */ 1304 uint8_t page_scan_mode; /* Page scan mode */ 1305 } __attribute__ ((__packed__)) hci_read_page_scan_rp; 1306 1307 /* Write Page Scan Mode is deprecated */ 1308 #define HCI_OCF_WRITE_PAGE_SCAN 0x003e 1309 #define HCI_CMD_WRITE_PAGE_SCAN 0x0C3E 1310 typedef struct { 1311 uint8_t page_scan_mode; /* Page scan mode */ 1312 } __attribute__ ((__packed__)) hci_write_page_scan_cp; 1313 1314 typedef hci_status_rp hci_write_page_scan_rp; 1315 1316 #define HCI_OCF_SET_AFH_CLASSIFICATION 0x003f 1317 #define HCI_CMD_SET_AFH_CLASSIFICATION 0x0C3F 1318 typedef struct { 1319 uint8_t classification[10]; 1320 } __attribute__ ((__packed__)) hci_set_afh_classification_cp; 1321 1322 typedef hci_status_rp hci_set_afh_classification_rp; 1323 1324 #define HCI_OCF_READ_INQUIRY_SCAN_TYPE 0x0042 1325 #define HCI_CMD_READ_INQUIRY_SCAN_TYPE 0x0C42 1326 /* No command parameter(s) */ 1327 1328 typedef struct { 1329 uint8_t status; /* 0x00 - success */ 1330 uint8_t type; /* inquiry scan type */ 1331 } __attribute__ ((__packed__)) hci_read_inquiry_scan_type_rp; 1332 1333 #define HCI_OCF_WRITE_INQUIRY_SCAN_TYPE 0x0043 1334 #define HCI_CMD_WRITE_INQUIRY_SCAN_TYPE 0x0C43 1335 typedef struct { 1336 uint8_t type; /* inquiry scan type */ 1337 } __attribute__ ((__packed__)) hci_write_inquiry_scan_type_cp; 1338 1339 typedef hci_status_rp hci_write_inquiry_scan_type_rp; 1340 1341 #define HCI_OCF_READ_INQUIRY_MODE 0x0044 1342 #define HCI_CMD_READ_INQUIRY_MODE 0x0C44 1343 /* No command parameter(s) */ 1344 1345 typedef struct { 1346 uint8_t status; /* 0x00 - success */ 1347 uint8_t mode; /* inquiry mode */ 1348 } __attribute__ ((__packed__)) hci_read_inquiry_mode_rp; 1349 1350 #define HCI_OCF_WRITE_INQUIRY_MODE 0x0045 1351 #define HCI_CMD_WRITE_INQUIRY_MODE 0x0C45 1352 typedef struct { 1353 uint8_t mode; /* inquiry mode */ 1354 } __attribute__ ((__packed__)) hci_write_inquiry_mode_cp; 1355 1356 typedef hci_status_rp hci_write_inquiry_mode_rp; 1357 1358 #define HCI_OCF_READ_PAGE_SCAN_TYPE 0x0046 1359 #define HCI_CMD_READ_PAGE_SCAN_TYPE 0x0C46 1360 /* No command parameter(s) */ 1361 1362 typedef struct { 1363 uint8_t status; /* 0x00 - success */ 1364 uint8_t type; /* page scan type */ 1365 } __attribute__ ((__packed__)) hci_read_page_scan_type_rp; 1366 1367 #define HCI_OCF_WRITE_PAGE_SCAN_TYPE 0x0047 1368 #define HCI_CMD_WRITE_PAGE_SCAN_TYPE 0x0C47 1369 typedef struct { 1370 uint8_t type; /* page scan type */ 1371 } __attribute__ ((__packed__)) hci_write_page_scan_type_cp; 1372 1373 typedef hci_status_rp hci_write_page_scan_type_rp; 1374 1375 #define HCI_OCF_READ_AFH_ASSESSMENT 0x0048 1376 #define HCI_CMD_READ_AFH_ASSESSMENT 0x0C48 1377 /* No command parameter(s) */ 1378 1379 typedef struct { 1380 uint8_t status; /* 0x00 - success */ 1381 uint8_t mode; /* assessment mode */ 1382 } __attribute__ ((__packed__)) hci_read_afh_assessment_rp; 1383 1384 #define HCI_OCF_WRITE_AFH_ASSESSMENT 0x0049 1385 #define HCI_CMD_WRITE_AFH_ASSESSMENT 0x0C49 1386 typedef struct { 1387 uint8_t mode; /* assessment mode */ 1388 } __attribute__ ((__packed__)) hci_write_afh_assessment_cp; 1389 1390 typedef hci_status_rp hci_write_afh_assessment_rp; 1391 1392 /************************************************************************** 1393 ************************************************************************** 1394 ** OGF 0x04 Informational commands and return parameters 1395 ************************************************************************** 1396 **************************************************************************/ 1397 1398 #define HCI_OGF_INFO 0x04 1399 1400 #define HCI_OCF_READ_LOCAL_VER 0x0001 1401 #define HCI_CMD_READ_LOCAL_VER 0x1001 1402 /* No command parameter(s) */ 1403 typedef struct { 1404 uint8_t status; /* 0x00 - success */ 1405 uint8_t hci_version; /* HCI version */ 1406 uint16_t hci_revision; /* HCI revision */ 1407 uint8_t lmp_version; /* LMP version */ 1408 uint16_t manufacturer; /* Hardware manufacturer name */ 1409 uint16_t lmp_subversion; /* LMP sub-version */ 1410 } __attribute__ ((__packed__)) hci_read_local_ver_rp; 1411 1412 #define HCI_OCF_READ_LOCAL_COMMANDS 0x0002 1413 #define HCI_CMD_READ_LOCAL_COMMANDS 0x1002 1414 /* No command parameter(s) */ 1415 typedef struct { 1416 uint8_t status; /* 0x00 - success */ 1417 uint8_t commands[64]; /* opcode bitmask */ 1418 } __attribute__ ((__packed__)) hci_read_local_commands_rp; 1419 1420 #define HCI_OCF_READ_LOCAL_FEATURES 0x0003 1421 #define HCI_CMD_READ_LOCAL_FEATURES 0x1003 1422 /* No command parameter(s) */ 1423 typedef struct { 1424 uint8_t status; /* 0x00 - success */ 1425 uint8_t features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/ 1426 } __attribute__ ((__packed__)) hci_read_local_features_rp; 1427 1428 #define HCI_OCF_READ_LOCAL_EXTENDED_FEATURES 0x0004 1429 #define HCI_CMD_READ_LOCAL_EXTENDED_FEATURES 0x1004 1430 typedef struct { 1431 uint8_t page; /* page number */ 1432 } __attribute__ ((__packed__)) hci_read_local_extended_features_cp; 1433 1434 typedef struct { 1435 uint8_t status; /* 0x00 - success */ 1436 uint8_t page; /* page number */ 1437 uint8_t max_page; /* maximum page number */ 1438 uint8_t features[HCI_FEATURES_SIZE]; /* LMP features */ 1439 } __attribute__ ((__packed__)) hci_read_local_extended_features_rp; 1440 1441 #define HCI_OCF_READ_BUFFER_SIZE 0x0005 1442 #define HCI_CMD_READ_BUFFER_SIZE 0x1005 1443 /* No command parameter(s) */ 1444 typedef struct { 1445 uint8_t status; /* 0x00 - success */ 1446 uint16_t max_acl_size; /* Max. size of ACL packet (bytes) */ 1447 uint8_t max_sco_size; /* Max. size of SCO packet (bytes) */ 1448 uint16_t num_acl_pkts; /* Max. number of ACL packets */ 1449 uint16_t num_sco_pkts; /* Max. number of SCO packets */ 1450 } __attribute__ ((__packed__)) hci_read_buffer_size_rp; 1451 1452 /* Read Country Code is deprecated */ 1453 #define HCI_OCF_READ_COUNTRY_CODE 0x0007 1454 #define HCI_CMD_READ_COUNTRY_CODE 0x1007 1455 /* No command parameter(s) */ 1456 typedef struct { 1457 uint8_t status; /* 0x00 - success */ 1458 uint8_t country_code; /* 0x00 - NAM, EUR, JP; 0x01 - France */ 1459 } __attribute__ ((__packed__)) hci_read_country_code_rp; 1460 1461 #define HCI_OCF_READ_BDADDR 0x0009 1462 #define HCI_CMD_READ_BDADDR 0x1009 1463 /* No command parameter(s) */ 1464 typedef struct { 1465 uint8_t status; /* 0x00 - success */ 1466 bdaddr_t bdaddr; /* unit address */ 1467 } __attribute__ ((__packed__)) hci_read_bdaddr_rp; 1468 1469 /************************************************************************** 1470 ************************************************************************** 1471 ** OGF 0x05 Status commands and return parameters 1472 ************************************************************************** 1473 **************************************************************************/ 1474 1475 #define HCI_OGF_STATUS 0x05 1476 1477 #define HCI_OCF_READ_FAILED_CONTACT_CNTR 0x0001 1478 #define HCI_CMD_READ_FAILED_CONTACT_CNTR 0x1401 1479 typedef struct { 1480 uint16_t con_handle; /* connection handle */ 1481 } __attribute__ ((__packed__)) hci_read_failed_contact_cntr_cp; 1482 1483 typedef struct { 1484 uint8_t status; /* 0x00 - success */ 1485 uint16_t con_handle; /* connection handle */ 1486 uint16_t counter; /* number of consecutive failed contacts */ 1487 } __attribute__ ((__packed__)) hci_read_failed_contact_cntr_rp; 1488 1489 #define HCI_OCF_RESET_FAILED_CONTACT_CNTR 0x0002 1490 #define HCI_CMD_RESET_FAILED_CONTACT_CNTR 0x1402 1491 typedef struct { 1492 uint16_t con_handle; /* connection handle */ 1493 } __attribute__ ((__packed__)) hci_reset_failed_contact_cntr_cp; 1494 1495 typedef struct { 1496 uint8_t status; /* 0x00 - success */ 1497 uint16_t con_handle; /* connection handle */ 1498 } __attribute__ ((__packed__)) hci_reset_failed_contact_cntr_rp; 1499 1500 #define HCI_OCF_READ_LINK_QUALITY 0x0003 1501 #define HCI_CMD_READ_LINK_QUALITY 0x1403 1502 typedef struct { 1503 uint16_t con_handle; /* connection handle */ 1504 } __attribute__ ((__packed__)) hci_read_link_quality_cp; 1505 1506 typedef struct { 1507 uint8_t status; /* 0x00 - success */ 1508 uint16_t con_handle; /* connection handle */ 1509 uint8_t quality; /* higher value means better quality */ 1510 } __attribute__ ((__packed__)) hci_read_link_quality_rp; 1511 1512 #define HCI_OCF_READ_RSSI 0x0005 1513 #define HCI_CMD_READ_RSSI 0x1405 1514 typedef struct { 1515 uint16_t con_handle; /* connection handle */ 1516 } __attribute__ ((__packed__)) hci_read_rssi_cp; 1517 1518 typedef struct { 1519 uint8_t status; /* 0x00 - success */ 1520 uint16_t con_handle; /* connection handle */ 1521 char rssi; /* -127 <= rssi <= 127 dB */ 1522 } __attribute__ ((__packed__)) hci_read_rssi_rp; 1523 1524 #define HCI_OCF_READ_AFH_CHANNEL_MAP 0x0006 1525 #define HCI_CMD_READ_AFH_CHANNEL_MAP 0x1406 1526 typedef struct { 1527 uint16_t con_handle; /* connection handle */ 1528 } __attribute__ ((__packed__)) hci_read_afh_channel_map_cp; 1529 1530 typedef struct { 1531 uint8_t status; /* 0x00 - success */ 1532 uint16_t con_handle; /* connection handle */ 1533 uint8_t mode; /* AFH mode */ 1534 uint8_t map[10]; /* AFH Channel Map */ 1535 } __attribute__ ((__packed__)) hci_read_afh_channel_map_rp; 1536 1537 #define HCI_OCF_READ_CLOCK 0x0007 1538 #define HCI_CMD_READ_CLOCK 0x1407 1539 typedef struct { 1540 uint16_t con_handle; /* connection handle */ 1541 uint8_t clock; /* which clock */ 1542 } __attribute__ ((__packed__)) hci_read_clock_cp; 1543 1544 typedef struct { 1545 uint8_t status; /* 0x00 - success */ 1546 uint16_t con_handle; /* connection handle */ 1547 uint32_t clock; /* clock value */ 1548 uint16_t accuracy; /* clock accuracy */ 1549 } __attribute__ ((__packed__)) hci_read_clock_rp; 1550 1551 1552 /************************************************************************** 1553 ************************************************************************** 1554 ** OGF 0x06 Testing commands and return parameters 1555 ************************************************************************** 1556 **************************************************************************/ 1557 1558 #define HCI_OGF_TESTING 0x06 1559 1560 #define HCI_OCF_READ_LOOPBACK_MODE 0x0001 1561 #define HCI_CMD_READ_LOOPBACK_MODE 0x1801 1562 /* No command parameter(s) */ 1563 typedef struct { 1564 uint8_t status; /* 0x00 - success */ 1565 uint8_t lbmode; /* loopback mode */ 1566 } __attribute__ ((__packed__)) hci_read_loopback_mode_rp; 1567 1568 #define HCI_OCF_WRITE_LOOPBACK_MODE 0x0002 1569 #define HCI_CMD_WRITE_LOOPBACK_MODE 0x1802 1570 typedef struct { 1571 uint8_t lbmode; /* loopback mode */ 1572 } __attribute__ ((__packed__)) hci_write_loopback_mode_cp; 1573 1574 typedef hci_status_rp hci_write_loopback_mode_rp; 1575 1576 #define HCI_OCF_ENABLE_UNIT_UNDER_TEST 0x0003 1577 #define HCI_CMD_ENABLE_UNIT_UNDER_TEST 0x1803 1578 /* No command parameter(s) */ 1579 typedef hci_status_rp hci_enable_unit_under_test_rp; 1580 1581 /************************************************************************** 1582 ************************************************************************** 1583 ** OGF 0x3e Bluetooth Logo Testing 1584 ** OGF 0x3f Vendor Specific 1585 ************************************************************************** 1586 **************************************************************************/ 1587 1588 #define HCI_OGF_BT_LOGO 0x3e 1589 #define HCI_OGF_VENDOR 0x3f 1590 1591 /* Ericsson specific FC */ 1592 #define HCI_CMD_ERICSSON_WRITE_PCM_SETTINGS 0xFC07 1593 #define HCI_CMD_ERICSSON_SET_UART_BAUD_RATE 0xFC09 1594 #define HCI_CMD_ERICSSON_SET_SCO_DATA_PATH 0xFC1D 1595 1596 /* Cambridge Silicon Radio specific FC */ 1597 #define HCI_CMD_CSR_EXTN 0xFC00 1598 1599 1600 /************************************************************************** 1601 ************************************************************************** 1602 ** Events and event parameters 1603 ************************************************************************** 1604 **************************************************************************/ 1605 1606 #define HCI_EVENT_INQUIRY_COMPL 0x01 1607 typedef struct { 1608 uint8_t status; /* 0x00 - success */ 1609 } __attribute__ ((__packed__)) hci_inquiry_compl_ep; 1610 1611 #define HCI_EVENT_INQUIRY_RESULT 0x02 1612 typedef struct { 1613 uint8_t num_responses; /* number of responses */ 1614 /* hci_inquiry_response[num_responses] -- see below */ 1615 } __attribute__ ((__packed__)) hci_inquiry_result_ep; 1616 1617 typedef struct { 1618 bdaddr_t bdaddr; /* unit address */ 1619 uint8_t page_scan_rep_mode; /* page scan rep. mode */ 1620 uint8_t page_scan_period_mode; /* page scan period mode */ 1621 uint8_t page_scan_mode; /* page scan mode */ 1622 uint8_t uclass[HCI_CLASS_SIZE]; /* unit class */ 1623 uint16_t clock_offset; /* clock offset */ 1624 } __attribute__ ((__packed__)) hci_inquiry_response; 1625 1626 #define HCI_EVENT_CON_COMPL 0x03 1627 typedef struct { 1628 uint8_t status; /* 0x00 - success */ 1629 uint16_t con_handle; /* Connection handle */ 1630 bdaddr_t bdaddr; /* remote unit address */ 1631 uint8_t link_type; /* Link type */ 1632 uint8_t encryption_mode; /* Encryption mode */ 1633 } __attribute__ ((__packed__)) hci_con_compl_ep; 1634 1635 #define HCI_EVENT_CON_REQ 0x04 1636 typedef struct { 1637 bdaddr_t bdaddr; /* remote unit address */ 1638 uint8_t uclass[HCI_CLASS_SIZE]; /* remote unit class */ 1639 uint8_t link_type; /* link type */ 1640 } __attribute__ ((__packed__)) hci_con_req_ep; 1641 1642 #define HCI_EVENT_DISCON_COMPL 0x05 1643 typedef struct { 1644 uint8_t status; /* 0x00 - success */ 1645 uint16_t con_handle; /* connection handle */ 1646 uint8_t reason; /* reason to disconnect */ 1647 } __attribute__ ((__packed__)) hci_discon_compl_ep; 1648 1649 #define HCI_EVENT_AUTH_COMPL 0x06 1650 typedef struct { 1651 uint8_t status; /* 0x00 - success */ 1652 uint16_t con_handle; /* connection handle */ 1653 } __attribute__ ((__packed__)) hci_auth_compl_ep; 1654 1655 #define HCI_EVENT_REMOTE_NAME_REQ_COMPL 0x07 1656 typedef struct { 1657 uint8_t status; /* 0x00 - success */ 1658 bdaddr_t bdaddr; /* remote unit address */ 1659 char name[HCI_UNIT_NAME_SIZE]; /* remote unit name */ 1660 } __attribute__ ((__packed__)) hci_remote_name_req_compl_ep; 1661 1662 #define HCI_EVENT_ENCRYPTION_CHANGE 0x08 1663 typedef struct { 1664 uint8_t status; /* 0x00 - success */ 1665 uint16_t con_handle; /* Connection handle */ 1666 uint8_t encryption_enable; /* 0x00 - disable */ 1667 } __attribute__ ((__packed__)) hci_encryption_change_ep; 1668 1669 #define HCI_EVENT_CHANGE_CON_LINK_KEY_COMPL 0x09 1670 typedef struct { 1671 uint8_t status; /* 0x00 - success */ 1672 uint16_t con_handle; /* Connection handle */ 1673 } __attribute__ ((__packed__)) hci_change_con_link_key_compl_ep; 1674 1675 #define HCI_EVENT_MASTER_LINK_KEY_COMPL 0x0a 1676 typedef struct { 1677 uint8_t status; /* 0x00 - success */ 1678 uint16_t con_handle; /* Connection handle */ 1679 uint8_t key_flag; /* Key flag */ 1680 } __attribute__ ((__packed__)) hci_master_link_key_compl_ep; 1681 1682 #define HCI_EVENT_READ_REMOTE_FEATURES_COMPL 0x0b 1683 typedef struct { 1684 uint8_t status; /* 0x00 - success */ 1685 uint16_t con_handle; /* Connection handle */ 1686 uint8_t features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/ 1687 } __attribute__ ((__packed__)) hci_read_remote_features_compl_ep; 1688 1689 #define HCI_EVENT_READ_REMOTE_VER_INFO_COMPL 0x0c 1690 typedef struct { 1691 uint8_t status; /* 0x00 - success */ 1692 uint16_t con_handle; /* Connection handle */ 1693 uint8_t lmp_version; /* LMP version */ 1694 uint16_t manufacturer; /* Hardware manufacturer name */ 1695 uint16_t lmp_subversion; /* LMP sub-version */ 1696 } __attribute__ ((__packed__)) hci_read_remote_ver_info_compl_ep; 1697 1698 #define HCI_EVENT_QOS_SETUP_COMPL 0x0d 1699 typedef struct { 1700 uint8_t status; /* 0x00 - success */ 1701 uint16_t con_handle; /* connection handle */ 1702 uint8_t flags; /* reserved for future use */ 1703 uint8_t service_type; /* service type */ 1704 uint32_t token_rate; /* bytes per second */ 1705 uint32_t peak_bandwidth; /* bytes per second */ 1706 uint32_t latency; /* microseconds */ 1707 uint32_t delay_variation; /* microseconds */ 1708 } __attribute__ ((__packed__)) hci_qos_setup_compl_ep; 1709 1710 #define HCI_EVENT_COMMAND_COMPL 0x0e 1711 typedef struct { 1712 uint8_t num_cmd_pkts; /* # of HCI command packets */ 1713 uint16_t opcode; /* command OpCode */ 1714 /* command return parameters (if any) */ 1715 } __attribute__ ((__packed__)) hci_command_compl_ep; 1716 1717 #define HCI_EVENT_COMMAND_STATUS 0x0f 1718 typedef struct { 1719 uint8_t status; /* 0x00 - pending */ 1720 uint8_t num_cmd_pkts; /* # of HCI command packets */ 1721 uint16_t opcode; /* command OpCode */ 1722 } __attribute__ ((__packed__)) hci_command_status_ep; 1723 1724 #define HCI_EVENT_HARDWARE_ERROR 0x10 1725 typedef struct { 1726 uint8_t hardware_code; /* hardware error code */ 1727 } __attribute__ ((__packed__)) hci_hardware_error_ep; 1728 1729 #define HCI_EVENT_FLUSH_OCCUR 0x11 1730 typedef struct { 1731 uint16_t con_handle; /* connection handle */ 1732 } __attribute__ ((__packed__)) hci_flush_occur_ep; 1733 1734 #define HCI_EVENT_ROLE_CHANGE 0x12 1735 typedef struct { 1736 uint8_t status; /* 0x00 - success */ 1737 bdaddr_t bdaddr; /* address of remote unit */ 1738 uint8_t role; /* new connection role */ 1739 } __attribute__ ((__packed__)) hci_role_change_ep; 1740 1741 #define HCI_EVENT_NUM_COMPL_PKTS 0x13 1742 typedef struct { 1743 uint8_t num_con_handles; /* # of connection handles */ 1744 /* these are repeated "num_con_handles" times 1745 uint16_t con_handle; --- connection handle(s) 1746 uint16_t compl_pkts; --- # of completed packets */ 1747 } __attribute__ ((__packed__)) hci_num_compl_pkts_ep; 1748 1749 #define HCI_EVENT_MODE_CHANGE 0x14 1750 typedef struct { 1751 uint8_t status; /* 0x00 - success */ 1752 uint16_t con_handle; /* connection handle */ 1753 uint8_t unit_mode; /* remote unit mode */ 1754 uint16_t interval; /* interval * 0.625 msec */ 1755 } __attribute__ ((__packed__)) hci_mode_change_ep; 1756 1757 #define HCI_EVENT_RETURN_LINK_KEYS 0x15 1758 typedef struct { 1759 uint8_t num_keys; /* # of keys */ 1760 /* these are repeated "num_keys" times 1761 bdaddr_t bdaddr; --- remote address(es) 1762 uint8_t key[HCI_KEY_SIZE]; --- key(s) */ 1763 } __attribute__ ((__packed__)) hci_return_link_keys_ep; 1764 1765 #define HCI_EVENT_PIN_CODE_REQ 0x16 1766 typedef struct { 1767 bdaddr_t bdaddr; /* remote unit address */ 1768 } __attribute__ ((__packed__)) hci_pin_code_req_ep; 1769 1770 #define HCI_EVENT_LINK_KEY_REQ 0x17 1771 typedef struct { 1772 bdaddr_t bdaddr; /* remote unit address */ 1773 } __attribute__ ((__packed__)) hci_link_key_req_ep; 1774 1775 #define HCI_EVENT_LINK_KEY_NOTIFICATION 0x18 1776 typedef struct { 1777 bdaddr_t bdaddr; /* remote unit address */ 1778 uint8_t key[HCI_KEY_SIZE]; /* link key */ 1779 uint8_t key_type; /* type of the key */ 1780 } __attribute__ ((__packed__)) hci_link_key_notification_ep; 1781 1782 #define HCI_EVENT_LOOPBACK_COMMAND 0x19 1783 typedef hci_cmd_hdr_t hci_loopback_command_ep; 1784 1785 #define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1a 1786 typedef struct { 1787 uint8_t link_type; /* Link type */ 1788 } __attribute__ ((__packed__)) hci_data_buffer_overflow_ep; 1789 1790 #define HCI_EVENT_MAX_SLOT_CHANGE 0x1b 1791 typedef struct { 1792 uint16_t con_handle; /* connection handle */ 1793 uint8_t lmp_max_slots; /* Max. # of slots allowed */ 1794 } __attribute__ ((__packed__)) hci_max_slot_change_ep; 1795 1796 #define HCI_EVENT_READ_CLOCK_OFFSET_COMPL 0x1c 1797 typedef struct { 1798 uint8_t status; /* 0x00 - success */ 1799 uint16_t con_handle; /* Connection handle */ 1800 uint16_t clock_offset; /* Clock offset */ 1801 } __attribute__ ((__packed__)) hci_read_clock_offset_compl_ep; 1802 1803 #define HCI_EVENT_CON_PKT_TYPE_CHANGED 0x1d 1804 typedef struct { 1805 uint8_t status; /* 0x00 - success */ 1806 uint16_t con_handle; /* connection handle */ 1807 uint16_t pkt_type; /* packet type */ 1808 } __attribute__ ((__packed__)) hci_con_pkt_type_changed_ep; 1809 1810 #define HCI_EVENT_QOS_VIOLATION 0x1e 1811 typedef struct { 1812 uint16_t con_handle; /* connection handle */ 1813 } __attribute__ ((__packed__)) hci_qos_violation_ep; 1814 1815 /* Page Scan Mode Change Event is deprecated */ 1816 #define HCI_EVENT_PAGE_SCAN_MODE_CHANGE 0x1f 1817 typedef struct { 1818 bdaddr_t bdaddr; /* destination address */ 1819 uint8_t page_scan_mode; /* page scan mode */ 1820 } __attribute__ ((__packed__)) hci_page_scan_mode_change_ep; 1821 1822 #define HCI_EVENT_PAGE_SCAN_REP_MODE_CHANGE 0x20 1823 typedef struct { 1824 bdaddr_t bdaddr; /* destination address */ 1825 uint8_t page_scan_rep_mode; /* page scan repetition mode */ 1826 } __attribute__ ((__packed__)) hci_page_scan_rep_mode_change_ep; 1827 1828 #define HCI_EVENT_FLOW_SPECIFICATION_COMPL 0x21 1829 typedef struct { 1830 uint8_t status; /* 0x00 - success */ 1831 uint16_t con_handle; /* connection handle */ 1832 uint8_t flags; /* reserved */ 1833 uint8_t direction; /* flow direction */ 1834 uint8_t type; /* service type */ 1835 uint32_t token_rate; /* token rate */ 1836 uint32_t bucket_size; /* token bucket size */ 1837 uint32_t peak_bandwidth; /* peak bandwidth */ 1838 uint32_t latency; /* access latency */ 1839 } __attribute__ ((__packed__)) hci_flow_specification_compl_ep; 1840 1841 #define HCI_EVENT_RSSI_RESULT 0x22 1842 typedef struct { 1843 uint8_t num_responses; /* number of responses */ 1844 /* hci_rssi_response[num_responses] -- see below */ 1845 } __attribute__ ((__packed__)) hci_rssi_result_ep; 1846 1847 typedef struct { 1848 bdaddr_t bdaddr; /* unit address */ 1849 uint8_t page_scan_rep_mode; /* page scan rep. mode */ 1850 uint8_t blank; /* reserved */ 1851 uint8_t uclass[HCI_CLASS_SIZE]; /* unit class */ 1852 uint16_t clock_offset; /* clock offset */ 1853 int8_t rssi; /* rssi */ 1854 } __attribute__ ((__packed__)) hci_rssi_response_ep; 1855 1856 #define HCI_EVENT_READ_REMOTE_EXTENDED_FEATURES 0x23 1857 typedef struct { 1858 uint8_t status; /* 0x00 - success */ 1859 uint16_t con_handle; /* connection handle */ 1860 uint8_t page; /* page number */ 1861 uint8_t max; /* max page number */ 1862 uint8_t features[HCI_FEATURES_SIZE]; /* LMP features bitmsk*/ 1863 } __attribute__ ((__packed__)) hci_read_remote_extended_features_ep; 1864 1865 #define HCI_EVENT_SCO_CON_COMPL 0x2c 1866 typedef struct { 1867 uint8_t status; /* 0x00 - success */ 1868 uint16_t con_handle; /* connection handle */ 1869 bdaddr_t bdaddr; /* unit address */ 1870 uint8_t link_type; /* link type */ 1871 uint8_t interval; /* transmission interval */ 1872 uint8_t window; /* retransmission window */ 1873 uint16_t rxlen; /* rx packet length */ 1874 uint16_t txlen; /* tx packet length */ 1875 uint8_t mode; /* air mode */ 1876 } __attribute__ ((__packed__)) hci_sco_con_compl_ep; 1877 1878 #define HCI_EVENT_SCO_CON_CHANGED 0x2d 1879 typedef struct { 1880 uint8_t status; /* 0x00 - success */ 1881 uint16_t con_handle; /* connection handle */ 1882 uint8_t interval; /* transmission interval */ 1883 uint8_t window; /* retransmission window */ 1884 uint16_t rxlen; /* rx packet length */ 1885 uint16_t txlen; /* tx packet length */ 1886 } __attribute__ ((__packed__)) hci_sco_con_changed_ep; 1887 1888 #define HCI_EVENT_BT_LOGO 0xfe 1889 1890 #define HCI_EVENT_VENDOR 0xff 1891 1892 /************************************************************************** 1893 ************************************************************************** 1894 ** HCI Socket Definitions 1895 ************************************************************************** 1896 **************************************************************************/ 1897 1898 /* HCI socket options */ 1899 #define SO_HCI_EVT_FILTER 1 /* get/set event filter */ 1900 #define SO_HCI_PKT_FILTER 2 /* get/set packet filter */ 1901 #define SO_HCI_DIRECTION 3 /* packet direction indicator */ 1902 1903 /* Control Messages */ 1904 #define SCM_HCI_DIRECTION SO_HCI_DIRECTION 1905 1906 /* 1907 * HCI socket filter and get/set routines 1908 * 1909 * for ease of use, we filter 256 possible events/packets 1910 */ 1911 struct hci_filter { 1912 uint32_t mask[8]; /* 256 bits */ 1913 }; 1914 1915 static __inline void 1916 hci_filter_set(uint8_t bit, struct hci_filter *filter) 1917 { 1918 uint8_t off = bit - 1; 1919 1920 off >>= 5; 1921 filter->mask[off] |= (1 << ((bit - 1) & 0x1f)); 1922 } 1923 1924 static __inline void 1925 hci_filter_clr(uint8_t bit, struct hci_filter *filter) 1926 { 1927 uint8_t off = bit - 1; 1928 1929 off >>= 5; 1930 filter->mask[off] &= ~(1 << ((bit - 1) & 0x1f)); 1931 } 1932 1933 static __inline int 1934 hci_filter_test(uint8_t bit, struct hci_filter *filter) 1935 { 1936 uint8_t off = bit - 1; 1937 1938 off >>= 5; 1939 return (filter->mask[off] & (1 << ((bit - 1) & 0x1f))); 1940 } 1941 1942 /* 1943 * HCI socket ioctl's 1944 * 1945 * Apart from GBTINFOA, these are all indexed on the unit name 1946 */ 1947 1948 #define SIOCGBTINFO _IOWR('b', 5, struct btreq) /* get unit info */ 1949 #define SIOCGBTINFOA _IOWR('b', 6, struct btreq) /* get info by address */ 1950 #define SIOCNBTINFO _IOWR('b', 7, struct btreq) /* next unit info */ 1951 1952 #define SIOCSBTFLAGS _IOWR('b', 8, struct btreq) /* set unit flags */ 1953 #define SIOCSBTPOLICY _IOWR('b', 9, struct btreq) /* set unit link policy */ 1954 #define SIOCSBTPTYPE _IOWR('b', 10, struct btreq) /* set unit packet type */ 1955 1956 #define SIOCGBTSTATS _IOWR('b', 11, struct btreq) /* get unit statistics */ 1957 #define SIOCZBTSTATS _IOWR('b', 12, struct btreq) /* zero unit statistics */ 1958 1959 #define SIOCBTDUMP _IOW('b', 13, struct btreq) /* print debug info */ 1960 #define SIOCSBTSCOMTU _IOWR('b', 17, struct btreq) /* set sco_mtu value */ 1961 1962 struct bt_stats { 1963 uint32_t err_tx; 1964 uint32_t err_rx; 1965 uint32_t cmd_tx; 1966 uint32_t evt_rx; 1967 uint32_t acl_tx; 1968 uint32_t acl_rx; 1969 uint32_t sco_tx; 1970 uint32_t sco_rx; 1971 uint32_t byte_tx; 1972 uint32_t byte_rx; 1973 }; 1974 1975 struct btreq { 1976 char btr_name[HCI_DEVNAME_SIZE]; /* device name */ 1977 1978 union { 1979 struct { 1980 bdaddr_t btri_bdaddr; /* device bdaddr */ 1981 uint16_t btri_flags; /* flags */ 1982 uint16_t btri_num_cmd; /* # of free cmd buffers */ 1983 uint16_t btri_num_acl; /* # of free ACL buffers */ 1984 uint16_t btri_num_sco; /* # of free SCO buffers */ 1985 uint16_t btri_acl_mtu; /* ACL mtu */ 1986 uint16_t btri_sco_mtu; /* SCO mtu */ 1987 uint16_t btri_link_policy; /* Link Policy */ 1988 uint16_t btri_packet_type; /* Packet Type */ 1989 } btri; 1990 struct bt_stats btrs; /* unit stats */ 1991 } btru; 1992 }; 1993 1994 #define btr_flags btru.btri.btri_flags 1995 #define btr_bdaddr btru.btri.btri_bdaddr 1996 #define btr_num_cmd btru.btri.btri_num_cmd 1997 #define btr_num_acl btru.btri.btri_num_acl 1998 #define btr_num_sco btru.btri.btri_num_sco 1999 #define btr_acl_mtu btru.btri.btri_acl_mtu 2000 #define btr_sco_mtu btru.btri.btri_sco_mtu 2001 #define btr_link_policy btru.btri.btri_link_policy 2002 #define btr_packet_type btru.btri.btri_packet_type 2003 #define btr_uclass btru.btri.btri_uclass 2004 #define btr_stats btru.btrs 2005 2006 /* hci_unit & btr_flags */ 2007 #define BTF_UP (1<<0) /* unit is up */ 2008 #define BTF_RUNNING (1<<1) /* unit is running */ 2009 #define BTF_XMIT_CMD (1<<2) /* unit is transmitting CMD packets */ 2010 #define BTF_XMIT_ACL (1<<3) /* unit is transmitting ACL packets */ 2011 #define BTF_XMIT_SCO (1<<4) /* unit is transmitting SCO packets */ 2012 #define BTF_XMIT (BTF_XMIT_CMD | BTF_XMIT_ACL | BTF_XMIT_SCO) 2013 #define BTF_INIT_BDADDR (1<<5) /* waiting for bdaddr */ 2014 #define BTF_INIT_BUFFER_SIZE (1<<6) /* waiting for buffer size */ 2015 #define BTF_INIT_FEATURES (1<<7) /* waiting for features */ 2016 #define BTF_INIT (BTF_INIT_BDADDR | BTF_INIT_BUFFER_SIZE | BTF_INIT_FEATURES) 2017 2018 /************************************************************************** 2019 ************************************************************************** 2020 ** HCI Kernel Definitions 2021 ************************************************************************** 2022 **************************************************************************/ 2023 2024 #ifdef _KERNEL 2025 2026 #include <net/if.h> /* for struct ifqueue */ 2027 2028 struct l2cap_channel; 2029 struct mbuf; 2030 struct sco_pcb; 2031 struct socket; 2032 2033 /* global HCI kernel variables */ 2034 2035 /* sysctl variables */ 2036 extern int hci_memo_expiry; 2037 extern int hci_acl_expiry; 2038 extern int hci_sendspace, hci_recvspace; 2039 extern int hci_eventq_max, hci_aclrxq_max, hci_scorxq_max; 2040 2041 /* 2042 * HCI Connection Information 2043 */ 2044 struct hci_link { 2045 struct hci_unit *hl_unit; /* our unit */ 2046 TAILQ_ENTRY(hci_link) hl_next; /* next link on unit */ 2047 2048 /* common info */ 2049 uint16_t hl_state; /* connection state */ 2050 uint16_t hl_flags; /* link flags */ 2051 bdaddr_t hl_bdaddr; /* dest address */ 2052 uint16_t hl_handle; /* connection handle */ 2053 uint8_t hl_type; /* link type */ 2054 2055 /* ACL link info */ 2056 uint8_t hl_lastid; /* last id used */ 2057 uint16_t hl_refcnt; /* reference count */ 2058 uint16_t hl_mtu; /* signalling mtu for link */ 2059 uint16_t hl_flush; /* flush timeout */ 2060 2061 TAILQ_HEAD(,l2cap_pdu) hl_txq; /* queue of outgoing PDUs */ 2062 int hl_txqlen; /* number of fragments */ 2063 struct mbuf *hl_rxp; /* incoming PDU (accumulating)*/ 2064 struct callout hl_expire; /* connection expiry timer */ 2065 TAILQ_HEAD(,l2cap_req) hl_reqs; /* pending requests */ 2066 2067 /* SCO link info */ 2068 struct hci_link *hl_link; /* SCO ACL link */ 2069 struct sco_pcb *hl_sco; /* SCO pcb */ 2070 struct ifqueue hl_data; /* SCO outgoing data */ 2071 }; 2072 2073 /* hci_link state */ 2074 #define HCI_LINK_CLOSED 0 /* closed */ 2075 #define HCI_LINK_WAIT_CONNECT 1 /* waiting to connect */ 2076 #define HCI_LINK_WAIT_AUTH 2 /* waiting for auth */ 2077 #define HCI_LINK_WAIT_ENCRYPT 3 /* waiting for encrypt */ 2078 #define HCI_LINK_WAIT_SECURE 4 /* waiting for secure */ 2079 #define HCI_LINK_OPEN 5 /* ready and willing */ 2080 #define HCI_LINK_BLOCK 6 /* open but blocking (see hci_acl_start) */ 2081 2082 /* hci_link flags */ 2083 #define HCI_LINK_AUTH_REQ (1<<0) /* authentication requested */ 2084 #define HCI_LINK_ENCRYPT_REQ (1<<1) /* encryption requested */ 2085 #define HCI_LINK_SECURE_REQ (1<<2) /* secure link requested */ 2086 #define HCI_LINK_AUTH (1<<3) /* link is authenticated */ 2087 #define HCI_LINK_ENCRYPT (1<<4) /* link is encrypted */ 2088 #define HCI_LINK_SECURE (1<<5) /* link is secured */ 2089 2090 /* 2091 * Bluetooth Memo 2092 * cached device information for remote devices that this unit has seen 2093 */ 2094 struct hci_memo { 2095 struct timeval time; /* time of last response */ 2096 hci_inquiry_response response; /* inquiry response */ 2097 LIST_ENTRY(hci_memo) next; 2098 }; 2099 2100 /* 2101 * The Bluetooth HCI device unit structure 2102 */ 2103 struct hci_unit { 2104 device_t hci_softc; /* ptr to device softc */ 2105 #if 0 /* not yet */ 2106 device_t hci_bthub; /* bthub(4) handle */ 2107 #endif 2108 2109 /* device info */ 2110 char *hci_devname; /* device name */ 2111 bdaddr_t hci_bdaddr; /* device address */ 2112 uint16_t hci_flags; /* see BTF_ above */ 2113 2114 uint16_t hci_packet_type; /* packet types */ 2115 uint16_t hci_acl_mask; /* ACL packet capabilities */ 2116 uint16_t hci_sco_mask; /* SCO packet capabilities */ 2117 2118 uint16_t hci_link_policy; /* link policy */ 2119 uint16_t hci_lmp_mask; /* link policy capabilities */ 2120 2121 /* flow control */ 2122 uint16_t hci_max_acl_size; /* ACL payload mtu */ 2123 uint16_t hci_num_acl_pkts; /* free ACL packet buffers */ 2124 uint8_t hci_num_cmd_pkts; /* free CMD packet buffers */ 2125 uint8_t hci_max_sco_size; /* SCO payload mtu */ 2126 uint16_t hci_num_sco_pkts; /* free SCO packet buffers */ 2127 2128 TAILQ_HEAD(,hci_link) hci_links; /* list of ACL/SCO links */ 2129 LIST_HEAD(,hci_memo) hci_memos; /* cached memo list */ 2130 2131 /* 2132 * h/w driver callbacks 2133 * 2134 * the device driver must supply these. 2135 */ 2136 int (*hci_enable) /* enable device */ 2137 (struct hci_unit *); 2138 void (*hci_disable) /* disable device */ 2139 (struct hci_unit *); 2140 void (*hci_start_cmd) /* initiate cmd output routine */ 2141 (struct hci_unit *); 2142 void (*hci_start_acl) /* initiate acl output routine */ 2143 (struct hci_unit *); 2144 void (*hci_start_sco) /* initiate sco output routine */ 2145 (struct hci_unit *); 2146 int hci_ipl; /* to block queue operations */ 2147 2148 /* input queues */ 2149 struct ifqueue hci_eventq; /* Event queue */ 2150 struct ifqueue hci_aclrxq; /* ACL rx queue */ 2151 struct ifqueue hci_scorxq; /* SCO rx queue */ 2152 uint16_t hci_eventqlen; /* Event queue length */ 2153 uint16_t hci_aclrxqlen; /* ACL rx queue length */ 2154 uint16_t hci_scorxqlen; /* SCO rx queue length */ 2155 2156 /* output queues */ 2157 struct ifqueue hci_cmdwait; /* pending commands */ 2158 struct ifqueue hci_cmdq; /* Command queue */ 2159 struct ifqueue hci_acltxq; /* ACL tx queue */ 2160 struct ifqueue hci_scotxq; /* SCO tx queue */ 2161 struct ifqueue hci_scodone; /* SCO done queue */ 2162 2163 struct bt_stats hci_stats; /* unit statistics */ 2164 2165 TAILQ_ENTRY(hci_unit) hci_next; 2166 }; 2167 2168 extern TAILQ_HEAD(hci_unit_list, hci_unit) hci_unit_list; 2169 2170 /* 2171 * HCI layer function prototypes 2172 */ 2173 2174 /* hci_event.c */ 2175 void hci_event(struct mbuf *, struct hci_unit *); 2176 2177 /* hci_ioctl.c */ 2178 int hci_ioctl(unsigned long, void *, struct proc *); 2179 2180 /* hci_link.c */ 2181 struct hci_link *hci_acl_open(struct hci_unit *, bdaddr_t *); 2182 struct hci_link *hci_acl_newconn(struct hci_unit *, bdaddr_t *); 2183 void hci_acl_close(struct hci_link *, int); 2184 void hci_acl_timeout(void *); 2185 int hci_acl_setmode(struct hci_link *); 2186 void hci_acl_linkmode(struct hci_link *); 2187 void hci_acl_recv(struct mbuf *, struct hci_unit *); 2188 int hci_acl_send(struct mbuf *, struct hci_link *, struct l2cap_channel *); 2189 void hci_acl_start(struct hci_link *); 2190 void hci_acl_complete(struct hci_link *, int); 2191 struct hci_link *hci_sco_newconn(struct hci_unit *, bdaddr_t *); 2192 void hci_sco_recv(struct mbuf *, struct hci_unit *); 2193 void hci_sco_start(struct hci_link *); 2194 void hci_sco_complete(struct hci_link *, int); 2195 struct hci_link *hci_link_alloc(struct hci_unit *); 2196 void hci_link_free(struct hci_link *, int); 2197 struct hci_link *hci_link_lookup_state(struct hci_unit *, uint16_t, uint16_t); 2198 struct hci_link *hci_link_lookup_bdaddr(struct hci_unit *, bdaddr_t *, uint16_t); 2199 struct hci_link *hci_link_lookup_handle(struct hci_unit *, uint16_t); 2200 2201 /* hci_misc.c */ 2202 int hci_route_lookup(bdaddr_t *, bdaddr_t *); 2203 struct hci_memo *hci_memo_find(struct hci_unit *, bdaddr_t *); 2204 void hci_memo_free(struct hci_memo *); 2205 2206 /* hci_socket.c */ 2207 void hci_drop(void *); 2208 int hci_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *); 2209 int hci_ctloutput(struct socket *so, struct sockopt *sopt); 2210 void hci_mtap(struct mbuf *, struct hci_unit *); 2211 2212 /* hci_unit.c */ 2213 void hci_attach(struct hci_unit *); 2214 void hci_detach(struct hci_unit *); 2215 int hci_enable(struct hci_unit *); 2216 void hci_disable(struct hci_unit *); 2217 struct hci_unit *hci_unit_lookup(bdaddr_t *); 2218 int hci_send_cmd(struct hci_unit *, uint16_t, void *, uint8_t); 2219 void hci_input_event(struct hci_unit *, struct mbuf *); 2220 void hci_input_acl(struct hci_unit *, struct mbuf *); 2221 void hci_input_sco(struct hci_unit *, struct mbuf *); 2222 void hci_complete_sco(struct hci_unit *, struct mbuf *); 2223 void hci_output_cmd(struct hci_unit *, struct mbuf *); 2224 void hci_output_acl(struct hci_unit *, struct mbuf *); 2225 void hci_output_sco(struct hci_unit *, struct mbuf *); 2226 void hci_intr(void *); 2227 void btintr(struct netmsg *msg); 2228 2229 /* XXX mimic NetBSD for now, although we don't have these interfaces */ 2230 #define M_GETCTX(m, t) ((t)(m)->m_pkthdr.rcvif) 2231 #define M_SETCTX(m, c) ((m)->m_pkthdr.rcvif = (void *)(c)) 2232 #define EPASSTHROUGH ENOTTY /* XXX */ 2233 2234 #endif /* _KERNEL */ 2235 2236 #endif /* _NETBT_HCI_H_ */ 2237