[BACK]Return to hci.h CVS log [TXT][DIR] Up to [local] / sys / netbt

Annotation of sys/netbt/hci.h, Revision 1.1

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

CVSweb