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