aboutsummaryrefslogtreecommitdiff
path: root/nimbluez/bluez
diff options
context:
space:
mode:
Diffstat (limited to 'nimbluez/bluez')
-rw-r--r--nimbluez/bluez/bz_bluetooth.nim296
-rw-r--r--nimbluez/bluez/bz_hci.nim2594
-rw-r--r--nimbluez/bluez/bz_hci_lib.nim298
-rw-r--r--nimbluez/bluez/bz_l2cap.nim344
-rw-r--r--nimbluez/bluez/bz_rfcomm.nim100
-rw-r--r--nimbluez/bluez/ioctl.nim110
6 files changed, 3742 insertions, 0 deletions
diff --git a/nimbluez/bluez/bz_bluetooth.nim b/nimbluez/bluez/bz_bluetooth.nim
new file mode 100644
index 0000000..8efe7d3
--- /dev/null
+++ b/nimbluez/bluez/bz_bluetooth.nim
@@ -0,0 +1,296 @@
+#
+#
+# BlueZ - Bluetooth protocol stack for Linux
+#
+# Copyright (C) 2000-2001 Qualcomm Incorporated
+# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+
+{.deadCodeElim: on.}
+
+import endians
+
+const
+ AF_BLUETOOTH* = 31
+ PF_BLUETOOTH* = AF_BLUETOOTH
+
+const
+ BTPROTO_L2CAP* = 0
+ BTPROTO_HCI* = 1
+ BTPROTO_SCO* = 2
+ BTPROTO_RFCOMM* = 3
+ BTPROTO_BNEP* = 4
+ BTPROTO_CMTP* = 5
+ BTPROTO_HIDP* = 6
+ BTPROTO_AVDTP* = 7
+ SOL_HCI* = 0
+ SOL_L2CAP* = 6
+ SOL_SCO* = 17
+ SOL_RFCOMM* = 18
+
+const
+ BT_SECURITY* = 4
+
+const
+ BLUETOOTH_MAX_NAME_SIZE* = (248)
+
+type
+ bt_security* = object
+ level*: uint8
+ key_size*: uint8
+
+
+const
+ BT_SECURITY_SDP* = 0
+ BT_SECURITY_LOW* = 1
+ BT_SECURITY_MEDIUM* = 2
+ BT_SECURITY_HIGH* = 3
+ BT_DEFER_SETUP* = 7
+ BT_FLUSHABLE* = 8
+ BT_FLUSHABLE_OFF* = 0
+ BT_FLUSHABLE_ON* = 1
+ BT_CHANNEL_POLICY* = 10
+
+# BR/EDR only (default policy)
+# AMP controllers cannot be used.
+# Channel move requests from the remote device are denied.
+# If the L2CAP channel is currently using AMP, move the channel to BR/EDR.
+#
+
+const
+ BT_CHANNEL_POLICY_BREDR_ONLY* = 0
+
+# BR/EDR Preferred
+# Allow use of AMP controllers.
+# If the L2CAP channel is currently on AMP, move it to BR/EDR.
+# Channel move requests from the remote device are allowed.
+#
+
+const
+ BT_CHANNEL_POLICY_BREDR_PREFERRED* = 1
+
+# AMP Preferred
+# Allow use of AMP controllers
+# If the L2CAP channel is currently on BR/EDR and AMP controller
+# resources are available, initiate a channel move to AMP.
+# Channel move requests from the remote device are allowed.
+# If the L2CAP socket has not been connected yet, try to create
+# and configure the channel directly on an AMP controller rather
+# than BR/EDR.
+#
+
+const
+ BT_CHANNEL_POLICY_AMP_PREFERRED* = 2
+
+# Connection and socket states
+
+const
+ BT_CONNECTED* = 1 # Equal to TCP_ESTABLISHED to make net code happy
+ BT_OPEN* = 2
+ BT_BOUND* = 3
+ BT_LISTEN* = 4
+ BT_CONNECT* = 5
+ BT_CONNECT2* = 6
+ BT_CONFIG* = 7
+ BT_DISCONN* = 8
+ BT_CLOSED* = 9
+
+# Byte order conversions
+
+proc htobs*(d: uint16): uint16 =
+ when cpuEndian == bigEndian:
+ swapEndian16(result, d)
+ else:
+ result = d
+
+proc htobl*(d: uint32): uint32 =
+ when cpuEndian == bigEndian:
+ swapEndian32(result, d)
+ else:
+ result = d
+
+proc htobll*(d: uint64): uint64 =
+ when cpuEndian == bigEndian:
+ swapEndian64(result, d)
+ else:
+ result = d
+
+template btohs*(d: expr): expr =
+ htobs(d)
+
+template btohl*(d: expr): expr =
+ htobl(d)
+
+template btohll*(d: expr): expr =
+ htobll(d)
+
+type
+ uint128* = object
+ data*: array[16, uint8]
+
+proc btoh128*(src: ptr uint128; dst: ptr uint128) {.inline, cdecl.} =
+ when cpuEndian == bigEndian:
+ var i: cint
+ for i in countup(0, 15):
+ dst.data[15 - i] = src.data[i]
+ else:
+ copyMem(dst, src, sizeof((uint128)))
+
+template htob128*(x, y: expr): expr =
+ btoh128(x, y)
+
+# Bluetooth unaligned access
+##def bt_get_unaligned(ptr) \
+#({ \
+# struct __attribute__((packed)) { \
+# __typeof__(*(ptr)) __v; \
+# } *__p = (__typeof__(__p)) (ptr); \
+# __p->__v; \
+#})
+#
+##def bt_put_unaligned(val, ptr) \
+#do { \
+# struct __attribute__((packed)) { \
+# __typeof__(*(ptr)) __v; \
+# } *__p = (__typeof__(__p)) (ptr); \
+# __p->__v = (val); \
+#} while(0)
+#
+##if __BYTE_ORDER == __LITTLE_ENDIAN
+#static inline uint64_t bt_get_le64(const void *ptr)
+#{
+# return bt_get_unaligned((const uint64_t *) ptr);
+#}
+#
+#static inline uint64_t bt_get_be64(const void *ptr)
+#{
+# return bswap_64(bt_get_unaligned((const uint64_t *) ptr));
+#}
+#
+#static inline uint32_t bt_get_le32(const void *ptr)
+#{
+# return bt_get_unaligned((const uint32_t *) ptr);
+#}
+#
+#static inline uint32_t bt_get_be32(const void *ptr)
+#{
+# return bswap_32(bt_get_unaligned((const uint32_t *) ptr));
+#}
+#
+#static inline uint16_t bt_get_le16(const void *ptr)
+#{
+# return bt_get_unaligned((const uint16_t *) ptr);
+#}
+#
+#static inline uint16_t bt_get_be16(const void *ptr)
+#{
+# return bswap_16(bt_get_unaligned((const uint16_t *) ptr));
+#}
+##elif __BYTE_ORDER == __BIG_ENDIAN
+#static inline uint64_t bt_get_le64(const void *ptr)
+#{
+# return bswap_64(bt_get_unaligned((const uint64_t *) ptr));
+#}
+#
+#static inline uint64_t bt_get_be64(const void *ptr)
+#{
+# return bt_get_unaligned((const uint64_t *) ptr);
+#}
+#
+#static inline uint32_t bt_get_le32(const void *ptr)
+#{
+# return bswap_32(bt_get_unaligned((const uint32_t *) ptr));
+#}
+#
+#static inline uint32_t bt_get_be32(const void *ptr)
+#{
+# return bt_get_unaligned((const uint32_t *) ptr);
+#}
+#
+#static inline uint16_t bt_get_le16(const void *ptr)
+#{
+# return bswap_16(bt_get_unaligned((const uint16_t *) ptr));
+#}
+#
+#static inline uint16_t bt_get_be16(const void *ptr)
+#{
+# return bt_get_unaligned((const uint16_t *) ptr);
+#}
+##else
+##error "Unknown byte order"
+##endif
+
+# BD Address
+
+type
+ bdaddr_t* = object {.packed.}
+ b*: array[6, uint8]
+
+
+# BD Address type
+
+const
+ BDADDR_BREDR* = 0x00000000
+ BDADDR_LE_PUBLIC* = 0x00000001
+ BDADDR_LE_RANDOM* = 0x00000002
+
+let
+ BDADDR_ANY* = bdaddr_t(b: [0'u8, 0'u8, 0'u8, 0'u8, 0'u8, 0'u8])
+ BDADDR_ALL* = bdaddr_t(b: [0xff'u8, 0xff'u8, 0xff'u8, 0xff'u8, 0xff'u8, 0xff'u8])
+ BDADDR_LOCAL* = bdaddr_t(b: [0'u8, 0'u8, 0'u8, 0xff'u8, 0xff'u8, 0xff'u8])
+
+# Copy, swap, convert BD Address
+
+proc bacmp*(ba1: ptr bdaddr_t; ba2: ptr bdaddr_t): cint {.inline, cdecl.} =
+ return cint(equalMem(ba1, ba2, sizeof(bdaddr_t)))
+
+proc bacpy*(dst: ptr bdaddr_t; src: ptr bdaddr_t) {.inline, cdecl.} =
+ copyMem(dst, src, sizeof(bdaddr_t))
+
+proc baswap*(dst: ptr bdaddr_t; src: ptr bdaddr_t) {.cdecl, importc: "baswap",
+ dynlib: "libbluetooth.so".}
+proc strtoba*(str: cstring): ptr bdaddr_t {.cdecl, importc: "strtoba",
+ dynlib: "libbluetooth.so".}
+proc batostr*(ba: ptr bdaddr_t): cstring {.cdecl, importc: "batostr",
+ dynlib: "libbluetooth.so".}
+proc ba2str*(ba: ptr bdaddr_t; str: cstring): cint {.cdecl, importc: "ba2str",
+ dynlib: "libbluetooth.so".}
+proc str2ba*(str: cstring; ba: ptr bdaddr_t): cint {.cdecl, importc: "str2ba",
+ dynlib: "libbluetooth.so".}
+proc ba2oui*(ba: ptr bdaddr_t; oui: cstring): cint {.cdecl, importc: "ba2oui",
+ dynlib: "libbluetooth.so".}
+proc bachk*(str: cstring): cint {.cdecl, importc: "bachk",
+ dynlib: "libbluetooth.so".}
+proc baprintf*(format: cstring): cint {.varargs, cdecl, importc: "baprintf",
+ dynlib: "libbluetooth.so".}
+proc bafprintf*(stream: ptr FILE; format: cstring): cint {.varargs, cdecl,
+ importc: "bafprintf", dynlib: "libbluetooth.so".}
+proc basprintf*(str: cstring; format: cstring): cint {.varargs, cdecl,
+ importc: "basprintf", dynlib: "libbluetooth.so".}
+proc basnprintf*(str: cstring; size: csize; format: cstring): cint {.varargs,
+ cdecl, importc: "basnprintf", dynlib: "libbluetooth.so".}
+proc bt_malloc*(size: csize): pointer {.cdecl, importc: "bt_malloc",
+ dynlib: "libbluetooth.so".}
+proc bt_free*(`ptr`: pointer) {.cdecl, importc: "bt_free",
+ dynlib: "libbluetooth.so".}
+proc bt_error*(code: uint16): cint {.cdecl, importc: "bt_error",
+ dynlib: "libbluetooth.so".}
+proc bt_compidtostr*(id: cint): cstring {.cdecl, importc: "bt_compidtostr",
+ dynlib: "libbluetooth.so".}
diff --git a/nimbluez/bluez/bz_hci.nim b/nimbluez/bluez/bz_hci.nim
new file mode 100644
index 0000000..3b2d925
--- /dev/null
+++ b/nimbluez/bluez/bz_hci.nim
@@ -0,0 +1,2594 @@
+#
+#
+# BlueZ - Bluetooth protocol stack for Linux
+#
+# Copyright (C) 2000-2001 Qualcomm Incorporated
+# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+
+{.deadCodeElim: on.}
+
+import ioctl
+import bz_bluetooth
+
+const
+ HCI_MAX_DEV* = 16
+ HCI_MAX_ACL_SIZE* = 1024
+ HCI_MAX_SCO_SIZE* = 255
+ HCI_MAX_EVENT_SIZE* = 260
+ HCI_MAX_FRAME_SIZE* = (HCI_MAX_ACL_SIZE + 4)
+
+# HCI dev events
+
+const
+ HCI_DEV_REG_EV* = 1
+ HCI_DEV_UNREG_EV* = 2
+ HCI_DEV_UP_EV* = 3
+ HCI_DEV_DOWN_EV* = 4
+ HCI_DEV_SUSPEND_EV* = 5
+ HCI_DEV_RESUME_EV* = 6
+
+# HCI bus types
+
+const
+ HCI_VIRTUAL* = 0
+ HCI_USB* = 1
+ HCI_PCCARD* = 2
+ HCI_UART* = 3
+ HCI_RS232* = 4
+ HCI_PCI* = 5
+ HCI_SDIO* = 6
+
+# HCI controller types
+
+const
+ HCI_BREDR* = 0x00000000
+ HCI_AMP* = 0x00000001
+
+# HCI device flags
+
+const
+ HCI_UP_FLAG* = 0
+ HCI_INIT_FLAG* = 1
+ HCI_RUNNING_FLAG* = 2
+ HCI_PSCAN_FLAG* = 3
+ HCI_ISCAN_FLAG* = 4
+ HCI_AUTH_FLAG* = 5
+ HCI_ENCRYPT_FLAG* = 6
+ HCI_INQUIRY_FLAG* = 7
+ HCI_RAW_FLAG* = 8
+
+# LE address type
+
+const
+ LE_PUBLIC_ADDRESS* = 0x00000000
+ LE_RANDOM_ADDRESS* = 0x00000001
+
+# HCI ioctl defines
+
+const
+ HCIDEVUP* = IOW(ord('H'), 201, int)
+ HCIDEVDOWN* = IOW(ord('H'), 202, int)
+ HCIDEVRESET* = IOW(ord('H'), 203, int)
+ HCIDEVRESTAT* = IOW(ord('H'), 204, int)
+ HCIGETDEVLIST* = IOR(ord('H'), 210, int)
+ HCIGETDEVINFO* = IOR(ord('H'), 211, int)
+ HCIGETCONNLIST* = IOR(ord('H'), 212, int)
+ HCIGETCONNINFO* = IOR(ord('H'), 213, int)
+ HCIGETAUTHINFO* = IOR(ord('H'), 215, int)
+ HCISETRAW* = IOW(ord('H'), 220, int)
+ HCISETSCAN* = IOW(ord('H'), 221, int)
+ HCISETAUTH* = IOW(ord('H'), 222, int)
+ HCISETENCRYPT* = IOW(ord('H'), 223, int)
+ HCISETPTYPE* = IOW(ord('H'), 224, int)
+ HCISETLINKPOL* = IOW(ord('H'), 225, int)
+ HCISETLINKMODE* = IOW(ord('H'), 226, int)
+ HCISETACLMTU* = IOW(ord('H'), 227, int)
+ HCISETSCOMTU* = IOW(ord('H'), 228, int)
+ HCIBLOCKADDR* = IOW(ord('H'), 230, int)
+ HCIUNBLOCKADDR* = IOW(ord('H'), 231, int)
+ HCIINQUIRY* = IOR(ord('H'), 240, int)
+
+when not defined(NO_HCI_DEFS):
+ # HCI Packet types
+ const
+ HCI_COMMAND_PKT* = 0x00000001
+ HCI_ACLDATA_PKT* = 0x00000002
+ HCI_SCODATA_PKT* = 0x00000003
+ HCI_EVENT_PKT* = 0x00000004
+ HCI_VENDOR_PKT* = 0x000000FF
+ # HCI Packet types
+ const
+ HCI_2DH1* = 0x00000002
+ HCI_3DH1* = 0x00000004
+ HCI_DM1* = 0x00000008
+ HCI_DH1* = 0x00000010
+ HCI_2DH3* = 0x00000100
+ HCI_3DH3* = 0x00000200
+ HCI_DM3* = 0x00000400
+ HCI_DH3* = 0x00000800
+ HCI_2DH5* = 0x00001000
+ HCI_3DH5* = 0x00002000
+ HCI_DM5* = 0x00004000
+ HCI_DH5* = 0x00008000
+ HCI_HV1* = 0x00000020
+ HCI_HV2* = 0x00000040
+ HCI_HV3* = 0x00000080
+ HCI_EV3* = 0x00000008
+ HCI_EV4* = 0x00000010
+ HCI_EV5* = 0x00000020
+ HCI_2EV3* = 0x00000040
+ HCI_3EV3* = 0x00000080
+ HCI_2EV5* = 0x00000100
+ HCI_3EV5* = 0x00000200
+ SCO_PTYPE_MASK* = (HCI_HV1 or HCI_HV2 or HCI_HV3)
+ ACL_PTYPE_MASK* = (
+ HCI_DM1 or HCI_DH1 or HCI_DM3 or HCI_DH3 or HCI_DM5 or HCI_DH5)
+ # HCI Error codes
+ const
+ HCI_UNKNOWN_COMMAND* = 0x00000001
+ HCI_NO_CONNECTION* = 0x00000002
+ HCI_HARDWARE_FAILURE* = 0x00000003
+ HCI_PAGE_TIMEOUT* = 0x00000004
+ HCI_AUTHENTICATION_FAILURE* = 0x00000005
+ HCI_PIN_OR_KEY_MISSING* = 0x00000006
+ HCI_MEMORY_FULL* = 0x00000007
+ HCI_CONNECTION_TIMEOUT* = 0x00000008
+ HCI_MAX_NUMBER_OF_CONNECTIONS* = 0x00000009
+ HCI_MAX_NUMBER_OF_SCO_CONNECTIONS* = 0x0000000A
+ HCI_ACL_CONNECTION_EXISTS* = 0x0000000B
+ HCI_COMMAND_DISALLOWED* = 0x0000000C
+ HCI_REJECTED_LIMITED_RESOURCES* = 0x0000000D
+ HCI_REJECTED_SECURITY* = 0x0000000E
+ HCI_REJECTED_PERSONAL* = 0x0000000F
+ HCI_HOST_TIMEOUT* = 0x00000010
+ HCI_UNSUPPORTED_FEATURE* = 0x00000011
+ HCI_INVALID_PARAMETERS* = 0x00000012
+ HCI_OE_USER_ENDED_CONNECTION* = 0x00000013
+ HCI_OE_LOW_RESOURCES* = 0x00000014
+ HCI_OE_POWER_OFF* = 0x00000015
+ HCI_CONNECTION_TERMINATED* = 0x00000016
+ HCI_REPEATED_ATTEMPTS* = 0x00000017
+ HCI_PAIRING_NOT_ALLOWED* = 0x00000018
+ HCI_UNKNOWN_LMP_PDU* = 0x00000019
+ HCI_UNSUPPORTED_REMOTE_FEATURE* = 0x0000001A
+ HCI_SCO_OFFSET_REJECTED* = 0x0000001B
+ HCI_SCO_INTERVAL_REJECTED* = 0x0000001C
+ HCI_AIR_MODE_REJECTED* = 0x0000001D
+ HCI_INVALID_LMP_PARAMETERS* = 0x0000001E
+ HCI_UNSPECIFIED_ERROR* = 0x0000001F
+ HCI_UNSUPPORTED_LMP_PARAMETER_VALUE* = 0x00000020
+ HCI_ROLE_CHANGE_NOT_ALLOWED* = 0x00000021
+ HCI_LMP_RESPONSE_TIMEOUT* = 0x00000022
+ HCI_LMP_ERROR_TRANSACTION_COLLISION* = 0x00000023
+ HCI_LMP_PDU_NOT_ALLOWED* = 0x00000024
+ HCI_ENCRYPTION_MODE_NOT_ACCEPTED* = 0x00000025
+ HCI_UNIT_LINK_KEY_USED* = 0x00000026
+ HCI_QOS_NOT_SUPPORTED* = 0x00000027
+ HCI_INSTANT_PASSED* = 0x00000028
+ HCI_PAIRING_NOT_SUPPORTED* = 0x00000029
+ HCI_TRANSACTION_COLLISION* = 0x0000002A
+ HCI_QOS_UNACCEPTABLE_PARAMETER* = 0x0000002C
+ HCI_QOS_REJECTED* = 0x0000002D
+ HCI_CLASSIFICATION_NOT_SUPPORTED* = 0x0000002E
+ HCI_INSUFFICIENT_SECURITY* = 0x0000002F
+ HCI_PARAMETER_OUT_OF_RANGE* = 0x00000030
+ HCI_ROLE_SWITCH_PENDING* = 0x00000032
+ HCI_SLOT_VIOLATION* = 0x00000034
+ HCI_ROLE_SWITCH_FAILED* = 0x00000035
+ HCI_EIR_TOO_LARGE* = 0x00000036
+ HCI_SIMPLE_PAIRING_NOT_SUPPORTED* = 0x00000037
+ HCI_HOST_BUSY_PAIRING* = 0x00000038
+ # ACL flags
+ const
+ ACL_START_NO_FLUSH* = 0x00000000
+ ACL_CONT* = 0x00000001
+ ACL_START* = 0x00000002
+ ACL_ACTIVE_BCAST* = 0x00000004
+ ACL_PICO_BCAST* = 0x00000008
+ # Baseband links
+ const
+ SCO_LINK* = 0x00000000
+ ACL_LINK* = 0x00000001
+ ESCO_LINK* = 0x00000002
+ # LMP features
+ const
+ LMP_3SLOT* = 0x00000001
+ LMP_5SLOT* = 0x00000002
+ LMP_ENCRYPT* = 0x00000004
+ LMP_SOFFSET* = 0x00000008
+ LMP_TACCURACY* = 0x00000010
+ LMP_RSWITCH* = 0x00000020
+ LMP_HOLD* = 0x00000040
+ LMP_SNIFF* = 0x00000080
+ LMP_PARK* = 0x00000001
+ LMP_RSSI* = 0x00000002
+ LMP_QUALITY* = 0x00000004
+ LMP_SCO* = 0x00000008
+ LMP_HV2* = 0x00000010
+ LMP_HV3* = 0x00000020
+ LMP_ULAW* = 0x00000040
+ LMP_ALAW* = 0x00000080
+ LMP_CVSD* = 0x00000001
+ LMP_PSCHEME* = 0x00000002
+ LMP_PCONTROL* = 0x00000004
+ LMP_TRSP_SCO* = 0x00000008
+ LMP_BCAST_ENC* = 0x00000080
+ LMP_EDR_ACL_2M* = 0x00000002
+ LMP_EDR_ACL_3M* = 0x00000004
+ LMP_ENH_ISCAN* = 0x00000008
+ LMP_ILACE_ISCAN* = 0x00000010
+ LMP_ILACE_PSCAN* = 0x00000020
+ LMP_RSSI_INQ* = 0x00000040
+ LMP_ESCO* = 0x00000080
+ LMP_EV4* = 0x00000001
+ LMP_EV5* = 0x00000002
+ LMP_AFH_CAP_SLV* = 0x00000008
+ LMP_AFH_CLS_SLV* = 0x00000010
+ LMP_NO_BREDR* = 0x00000020
+ LMP_LE* = 0x00000040
+ LMP_EDR_3SLOT* = 0x00000080
+ LMP_EDR_5SLOT* = 0x00000001
+ LMP_SNIFF_SUBR* = 0x00000002
+ LMP_PAUSE_ENC* = 0x00000004
+ LMP_AFH_CAP_MST* = 0x00000008
+ LMP_AFH_CLS_MST* = 0x00000010
+ LMP_EDR_ESCO_2M* = 0x00000020
+ LMP_EDR_ESCO_3M* = 0x00000040
+ LMP_EDR_3S_ESCO* = 0x00000080
+ LMP_EXT_INQ* = 0x00000001
+ LMP_LE_BREDR* = 0x00000002
+ LMP_SIMPLE_PAIR* = 0x00000008
+ LMP_ENCAPS_PDU* = 0x00000010
+ LMP_ERR_DAT_REP* = 0x00000020
+ LMP_NFLUSH_PKTS* = 0x00000040
+ LMP_LSTO* = 0x00000001
+ LMP_INQ_TX_PWR* = 0x00000002
+ LMP_EPC* = 0x00000004
+ LMP_EXT_FEAT* = 0x00000080
+ # Extended LMP features
+ const
+ LMP_HOST_SSP* = 0x00000001
+ LMP_HOST_LE* = 0x00000002
+ LMP_HOST_LE_BREDR* = 0x00000004
+ # Link policies
+ const
+ HCI_LP_RSWITCH* = 0x00000001
+ HCI_LP_HOLD* = 0x00000002
+ HCI_LP_SNIFF* = 0x00000004
+ HCI_LP_PARK* = 0x00000008
+ # Link mode
+ const
+ HCI_LM_ACCEPT* = 0x00008000
+ HCI_LM_MASTER* = 0x00000001
+ HCI_LM_AUTH* = 0x00000002
+ HCI_LM_ENCRYPT* = 0x00000004
+ HCI_LM_TRUSTED* = 0x00000008
+ HCI_LM_RELIABLE* = 0x00000010
+ HCI_LM_SECURE* = 0x00000020
+ # Link Key types
+ const
+ HCI_LK_COMBINATION* = 0x00000000
+ HCI_LK_LOCAL_UNIT* = 0x00000001
+ HCI_LK_REMOTE_UNIT* = 0x00000002
+ HCI_LK_DEBUG_COMBINATION* = 0x00000003
+ HCI_LK_UNAUTH_COMBINATION* = 0x00000004
+ HCI_LK_AUTH_COMBINATION* = 0x00000005
+ HCI_LK_CHANGED_COMBINATION* = 0x00000006
+ HCI_LK_INVALID* = 0x000000FF
+ # ----- HCI Commands -----
+ # Link Control
+ const
+ OGF_LINK_CTL* = 0x00000001
+ OCF_INQUIRY* = 0x00000001
+ type
+ inquiry_cp* = object {.packed.}
+ lap*: array[3, uint8]
+ length*: uint8 # 1.28s units
+ num_rsp*: uint8
+
+ const
+ INQUIRY_CP_SIZE* = 5
+ type
+ status_bdaddr_rp* = object {.packed.}
+ status*: uint8
+ bdaddr*: bdaddr_t
+
+ const
+ STATUS_BDADDR_RP_SIZE* = 7
+ OCF_INQUIRY_CANCEL* = 0x00000002
+ OCF_PERIODIC_INQUIRY* = 0x00000003
+ type
+ periodic_inquiry_cp* = object {.packed.}
+ max_period*: uint16 # 1.28s units
+ min_period*: uint16 # 1.28s units
+ lap*: array[3, uint8]
+ length*: uint8 # 1.28s units
+ num_rsp*: uint8
+
+ const
+ PERIODIC_INQUIRY_CP_SIZE* = 9
+ OCF_EXIT_PERIODIC_INQUIRY* = 0x00000004
+ OCF_CREATE_CONN* = 0x00000005
+ type
+ create_conn_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pkt_type*: uint16
+ pscan_rep_mode*: uint8
+ pscan_mode*: uint8
+ clock_offset*: uint16
+ role_switch*: uint8
+
+ const
+ CREATE_CONN_CP_SIZE* = 13
+ OCF_DISCONNECT* = 0x00000006
+ type
+ disconnect_cp* = object {.packed.}
+ handle*: uint16
+ reason*: uint8
+
+ const
+ DISCONNECT_CP_SIZE* = 3
+ OCF_ADD_SCO* = 0x00000007
+ type
+ add_sco_cp* = object {.packed.}
+ handle*: uint16
+ pkt_type*: uint16
+
+ const
+ ADD_SCO_CP_SIZE* = 4
+ OCF_CREATE_CONN_CANCEL* = 0x00000008
+ type
+ create_conn_cancel_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ CREATE_CONN_CANCEL_CP_SIZE* = 6
+ OCF_ACCEPT_CONN_REQ* = 0x00000009
+ type
+ accept_conn_req_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ role*: uint8
+
+ const
+ ACCEPT_CONN_REQ_CP_SIZE* = 7
+ OCF_REJECT_CONN_REQ* = 0x0000000A
+ type
+ reject_conn_req_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ reason*: uint8
+
+ const
+ REJECT_CONN_REQ_CP_SIZE* = 7
+ OCF_LINK_KEY_REPLY* = 0x0000000B
+ type
+ link_key_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ link_key*: array[16, uint8]
+
+ const
+ LINK_KEY_REPLY_CP_SIZE* = 22
+ OCF_LINK_KEY_NEG_REPLY* = 0x0000000C
+ OCF_PIN_CODE_REPLY* = 0x0000000D
+ type
+ pin_code_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pin_len*: uint8
+ pin_code*: array[16, uint8]
+
+ const
+ PIN_CODE_REPLY_CP_SIZE* = 23
+ OCF_PIN_CODE_NEG_REPLY* = 0x0000000E
+ OCF_SET_CONN_PTYPE* = 0x0000000F
+ type
+ set_conn_ptype_cp* = object {.packed.}
+ handle*: uint16
+ pkt_type*: uint16
+
+ const
+ SET_CONN_PTYPE_CP_SIZE* = 4
+ OCF_AUTH_REQUESTED* = 0x00000011
+ type
+ auth_requested_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ AUTH_REQUESTED_CP_SIZE* = 2
+ OCF_SET_CONN_ENCRYPT* = 0x00000013
+ type
+ set_conn_encrypt_cp* = object {.packed.}
+ handle*: uint16
+ encrypt*: uint8
+
+ const
+ SET_CONN_ENCRYPT_CP_SIZE* = 3
+ OCF_CHANGE_CONN_LINK_KEY* = 0x00000015
+ type
+ change_conn_link_key_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ CHANGE_CONN_LINK_KEY_CP_SIZE* = 2
+ OCF_MASTER_LINK_KEY* = 0x00000017
+ type
+ master_link_key_cp* = object {.packed.}
+ key_flag*: uint8
+
+ const
+ MASTER_LINK_KEY_CP_SIZE* = 1
+ OCF_REMOTE_NAME_REQ* = 0x00000019
+ type
+ remote_name_req_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+ pscan_mode*: uint8
+ clock_offset*: uint16
+
+ const
+ REMOTE_NAME_REQ_CP_SIZE* = 10
+ OCF_REMOTE_NAME_REQ_CANCEL* = 0x0000001A
+ type
+ remote_name_req_cancel_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ REMOTE_NAME_REQ_CANCEL_CP_SIZE* = 6
+ OCF_READ_REMOTE_FEATURES* = 0x0000001B
+ type
+ read_remote_features_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ READ_REMOTE_FEATURES_CP_SIZE* = 2
+ OCF_READ_REMOTE_EXT_FEATURES* = 0x0000001C
+ type
+ read_remote_ext_features_cp* = object {.packed.}
+ handle*: uint16
+ page_num*: uint8
+
+ const
+ READ_REMOTE_EXT_FEATURES_CP_SIZE* = 3
+ OCF_READ_REMOTE_VERSION* = 0x0000001D
+ type
+ read_remote_version_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ READ_REMOTE_VERSION_CP_SIZE* = 2
+ OCF_READ_CLOCK_OFFSET* = 0x0000001F
+ type
+ read_clock_offset_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ READ_CLOCK_OFFSET_CP_SIZE* = 2
+ OCF_READ_LMP_HANDLE* = 0x00000020
+ OCF_SETUP_SYNC_CONN* = 0x00000028
+ type
+ setup_sync_conn_cp* = object {.packed.}
+ handle*: uint16
+ tx_bandwith*: uint32
+ rx_bandwith*: uint32
+ max_latency*: uint16
+ voice_setting*: uint16
+ retrans_effort*: uint8
+ pkt_type*: uint16
+
+ const
+ SETUP_SYNC_CONN_CP_SIZE* = 17
+ OCF_ACCEPT_SYNC_CONN_REQ* = 0x00000029
+ type
+ accept_sync_conn_req_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ tx_bandwith*: uint32
+ rx_bandwith*: uint32
+ max_latency*: uint16
+ voice_setting*: uint16
+ retrans_effort*: uint8
+ pkt_type*: uint16
+
+ const
+ ACCEPT_SYNC_CONN_REQ_CP_SIZE* = 21
+ OCF_REJECT_SYNC_CONN_REQ* = 0x0000002A
+ type
+ reject_sync_conn_req_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ reason*: uint8
+
+ const
+ REJECT_SYNC_CONN_REQ_CP_SIZE* = 7
+ OCF_IO_CAPABILITY_REPLY* = 0x0000002B
+ type
+ io_capability_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ capability*: uint8
+ oob_data*: uint8
+ authentication*: uint8
+
+ const
+ IO_CAPABILITY_REPLY_CP_SIZE* = 9
+ OCF_USER_CONFIRM_REPLY* = 0x0000002C
+ type
+ user_confirm_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ USER_CONFIRM_REPLY_CP_SIZE* = 6
+ OCF_USER_CONFIRM_NEG_REPLY* = 0x0000002D
+ OCF_USER_PASSKEY_REPLY* = 0x0000002E
+ type
+ user_passkey_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ passkey*: uint32
+
+ const
+ USER_PASSKEY_REPLY_CP_SIZE* = 10
+ OCF_USER_PASSKEY_NEG_REPLY* = 0x0000002F
+ OCF_REMOTE_OOB_DATA_REPLY* = 0x00000030
+ type
+ remote_oob_data_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ hash*: array[16, uint8]
+ randomizer*: array[16, uint8]
+
+ const
+ REMOTE_OOB_DATA_REPLY_CP_SIZE* = 38
+ OCF_REMOTE_OOB_DATA_NEG_REPLY* = 0x00000033
+ OCF_IO_CAPABILITY_NEG_REPLY* = 0x00000034
+ type
+ io_capability_neg_reply_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ reason*: uint8
+
+ const
+ IO_CAPABILITY_NEG_REPLY_CP_SIZE* = 7
+ OCF_CREATE_PHYSICAL_LINK* = 0x00000035
+ type
+ create_physical_link_cp* = object {.packed.}
+ handle*: uint8
+ key_length*: uint8
+ key_type*: uint8
+ key*: array[32, uint8]
+
+ const
+ CREATE_PHYSICAL_LINK_CP_SIZE* = 35
+ OCF_ACCEPT_PHYSICAL_LINK* = 0x00000036
+ OCF_DISCONNECT_PHYSICAL_LINK* = 0x00000037
+ type
+ disconnect_physical_link_cp* = object {.packed.}
+ handle*: uint8
+ reason*: uint8
+
+ const
+ DISCONNECT_PHYSICAL_LINK_CP_SIZE* = 2
+ OCF_CREATE_LOGICAL_LINK* = 0x00000038
+ type
+ create_logical_link_cp* = object {.packed.}
+ handle*: uint8
+ tx_flow*: array[16, uint8]
+ rx_flow*: array[16, uint8]
+
+ const
+ CREATE_LOGICAL_LINK_CP_SIZE* = 33
+ OCF_ACCEPT_LOGICAL_LINK* = 0x00000039
+ OCF_DISCONNECT_LOGICAL_LINK* = 0x0000003A
+ type
+ disconnect_logical_link_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ DISCONNECT_LOGICAL_LINK_CP_SIZE* = 2
+ OCF_LOGICAL_LINK_CANCEL* = 0x0000003B
+ type
+ cancel_logical_link_cp* = object {.packed.}
+ handle*: uint8
+ tx_flow_id*: uint8
+
+ const
+ LOGICAL_LINK_CANCEL_CP_SIZE* = 2
+ type
+ cancel_logical_link_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint8
+ tx_flow_id*: uint8
+
+ const
+ LOGICAL_LINK_CANCEL_RP_SIZE* = 3
+ OCF_FLOW_SPEC_MODIFY* = 0x0000003C
+ # Link Policy
+ const
+ OGF_LINK_POLICY* = 0x00000002
+ OCF_HOLD_MODE* = 0x00000001
+ type
+ hold_mode_cp* = object {.packed.}
+ handle*: uint16
+ max_interval*: uint16
+ min_interval*: uint16
+
+ const
+ HOLD_MODE_CP_SIZE* = 6
+ OCF_SNIFF_MODE* = 0x00000003
+ type
+ sniff_mode_cp* = object {.packed.}
+ handle*: uint16
+ max_interval*: uint16
+ min_interval*: uint16
+ attempt*: uint16
+ timeout*: uint16
+
+ const
+ SNIFF_MODE_CP_SIZE* = 10
+ OCF_EXIT_SNIFF_MODE* = 0x00000004
+ type
+ exit_sniff_mode_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ EXIT_SNIFF_MODE_CP_SIZE* = 2
+ OCF_PARK_MODE* = 0x00000005
+ type
+ park_mode_cp* = object {.packed.}
+ handle*: uint16
+ max_interval*: uint16
+ min_interval*: uint16
+
+ const
+ PARK_MODE_CP_SIZE* = 6
+ OCF_EXIT_PARK_MODE* = 0x00000006
+ type
+ exit_park_mode_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ EXIT_PARK_MODE_CP_SIZE* = 2
+ OCF_QOS_SETUP* = 0x00000007
+ type
+ hci_qos* = object {.packed.}
+ service_type*: uint8 # 1 = best effort
+ token_rate*: uint32 # Byte per seconds
+ peak_bandwidth*: uint32 # Byte per seconds
+ latency*: uint32 # Microseconds
+ delay_variation*: uint32 # Microseconds
+
+ const
+ HCI_QOS_CP_SIZE* = 17
+ type
+ qos_setup_cp* = object {.packed.}
+ handle*: uint16
+ flags*: uint8 # Reserved
+ qos*: hci_qos
+
+ const
+ QOS_SETUP_CP_SIZE* = (3 + HCI_QOS_CP_SIZE)
+ OCF_ROLE_DISCOVERY* = 0x00000009
+ type
+ role_discovery_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ ROLE_DISCOVERY_CP_SIZE* = 2
+ type
+ role_discovery_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ role*: uint8
+
+ const
+ ROLE_DISCOVERY_RP_SIZE* = 4
+ OCF_SWITCH_ROLE* = 0x0000000B
+ type
+ switch_role_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ role*: uint8
+
+ const
+ SWITCH_ROLE_CP_SIZE* = 7
+ OCF_READ_LINK_POLICY* = 0x0000000C
+ type
+ read_link_policy_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ READ_LINK_POLICY_CP_SIZE* = 2
+ type
+ read_link_policy_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ policy*: uint16
+
+ const
+ READ_LINK_POLICY_RP_SIZE* = 5
+ OCF_WRITE_LINK_POLICY* = 0x0000000D
+ type
+ write_link_policy_cp* = object {.packed.}
+ handle*: uint16
+ policy*: uint16
+
+ const
+ WRITE_LINK_POLICY_CP_SIZE* = 4
+ type
+ write_link_policy_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ WRITE_LINK_POLICY_RP_SIZE* = 3
+ OCF_READ_DEFAULT_LINK_POLICY* = 0x0000000E
+ OCF_WRITE_DEFAULT_LINK_POLICY* = 0x0000000F
+ OCF_FLOW_SPECIFICATION* = 0x00000010
+ OCF_SNIFF_SUBRATING* = 0x00000011
+ type
+ sniff_subrating_cp* = object {.packed.}
+ handle*: uint16
+ max_latency*: uint16
+ min_remote_timeout*: uint16
+ min_local_timeout*: uint16
+
+ const
+ SNIFF_SUBRATING_CP_SIZE* = 8
+ # Host Controller and Baseband
+ const
+ OGF_HOST_CTL* = 0x00000003
+ OCF_SET_EVENT_MASK* = 0x00000001
+ type
+ set_event_mask_cp* = object {.packed.}
+ mask*: array[8, uint8]
+
+ const
+ SET_EVENT_MASK_CP_SIZE* = 8
+ OCF_RESET* = 0x00000003
+ OCF_SET_EVENT_FLT* = 0x00000005
+ type
+ set_event_flt_cp* = object {.packed.}
+ flt_type*: uint8
+ cond_type*: uint8
+ condition*: array[0, uint8]
+
+ const
+ SET_EVENT_FLT_CP_SIZE* = 2
+ # Filter types
+ const
+ FLT_CLEAR_ALL* = 0x00000000
+ FLT_INQ_RESULT* = 0x00000001
+ FLT_CONN_SETUP* = 0x00000002
+ # INQ_RESULT Condition types
+ const
+ INQ_RESULT_RETURN_ALL* = 0x00000000
+ INQ_RESULT_RETURN_CLASS* = 0x00000001
+ INQ_RESULT_RETURN_BDADDR* = 0x00000002
+ # CONN_SETUP Condition types
+ const
+ CONN_SETUP_ALLOW_ALL* = 0x00000000
+ CONN_SETUP_ALLOW_CLASS* = 0x00000001
+ CONN_SETUP_ALLOW_BDADDR* = 0x00000002
+ # CONN_SETUP Conditions
+ const
+ CONN_SETUP_AUTO_OFF* = 0x00000001
+ CONN_SETUP_AUTO_ON* = 0x00000002
+ OCF_FLUSH* = 0x00000008
+ OCF_READ_PIN_TYPE* = 0x00000009
+ type
+ read_pin_type_rp* = object {.packed.}
+ status*: uint8
+ pin_type*: uint8
+
+ const
+ READ_PIN_TYPE_RP_SIZE* = 2
+ OCF_WRITE_PIN_TYPE* = 0x0000000A
+ type
+ write_pin_type_cp* = object {.packed.}
+ pin_type*: uint8
+
+ const
+ WRITE_PIN_TYPE_CP_SIZE* = 1
+ OCF_CREATE_NEW_UNIT_KEY* = 0x0000000B
+ OCF_READ_STORED_LINK_KEY* = 0x0000000D
+ type
+ read_stored_link_key_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ read_all*: uint8
+
+ const
+ READ_STORED_LINK_KEY_CP_SIZE* = 7
+ type
+ read_stored_link_key_rp* = object {.packed.}
+ status*: uint8
+ max_keys*: uint16
+ num_keys*: uint16
+
+ const
+ READ_STORED_LINK_KEY_RP_SIZE* = 5
+ OCF_WRITE_STORED_LINK_KEY* = 0x00000011
+ type
+ write_stored_link_key_cp* = object {.packed.}
+ num_keys*: uint8 # variable length part
+
+ const
+ WRITE_STORED_LINK_KEY_CP_SIZE* = 1
+ type
+ write_stored_link_key_rp* = object {.packed.}
+ status*: uint8
+ num_keys*: uint8
+
+ const
+ READ_WRITE_LINK_KEY_RP_SIZE* = 2
+ OCF_DELETE_STORED_LINK_KEY* = 0x00000012
+ type
+ delete_stored_link_key_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ delete_all*: uint8
+
+ const
+ DELETE_STORED_LINK_KEY_CP_SIZE* = 7
+ type
+ delete_stored_link_key_rp* = object {.packed.}
+ status*: uint8
+ num_keys*: uint16
+
+ const
+ DELETE_STORED_LINK_KEY_RP_SIZE* = 3
+ HCI_MAX_NAME_LENGTH* = 248
+ OCF_CHANGE_LOCAL_NAME* = 0x00000013
+ type
+ change_local_name_cp* = object {.packed.}
+ name*: array[HCI_MAX_NAME_LENGTH, uint8]
+
+ const
+ CHANGE_LOCAL_NAME_CP_SIZE* = 248
+ OCF_READ_LOCAL_NAME* = 0x00000014
+ type
+ read_local_name_rp* = object {.packed.}
+ status*: uint8
+ name*: array[HCI_MAX_NAME_LENGTH, uint8]
+
+ const
+ READ_LOCAL_NAME_RP_SIZE* = 249
+ OCF_READ_CONN_ACCEPT_TIMEOUT* = 0x00000015
+ type
+ read_conn_accept_timeout_rp* = object {.packed.}
+ status*: uint8
+ timeout*: uint16
+
+ const
+ READ_CONN_ACCEPT_TIMEOUT_RP_SIZE* = 3
+ OCF_WRITE_CONN_ACCEPT_TIMEOUT* = 0x00000016
+ type
+ write_conn_accept_timeout_cp* = object {.packed.}
+ timeout*: uint16
+
+ const
+ WRITE_CONN_ACCEPT_TIMEOUT_CP_SIZE* = 2
+ OCF_READ_PAGE_TIMEOUT* = 0x00000017
+ type
+ read_page_timeout_rp* = object {.packed.}
+ status*: uint8
+ timeout*: uint16
+
+ const
+ READ_PAGE_TIMEOUT_RP_SIZE* = 3
+ OCF_WRITE_PAGE_TIMEOUT* = 0x00000018
+ type
+ write_page_timeout_cp* = object {.packed.}
+ timeout*: uint16
+
+ const
+ WRITE_PAGE_TIMEOUT_CP_SIZE* = 2
+ OCF_READ_SCAN_ENABLE* = 0x00000019
+ type
+ read_scan_enable_rp* = object {.packed.}
+ status*: uint8
+ enable*: uint8
+
+ const
+ READ_SCAN_ENABLE_RP_SIZE* = 2
+ OCF_WRITE_SCAN_ENABLE* = 0x0000001A
+ SCAN_DISABLED* = 0x00000000
+ SCAN_INQUIRY* = 0x00000001
+ SCAN_PAGE* = 0x00000002
+ OCF_READ_PAGE_ACTIVITY* = 0x0000001B
+ type
+ read_page_activity_rp* = object {.packed.}
+ status*: uint8
+ interval*: uint16
+ window*: uint16
+
+ const
+ READ_PAGE_ACTIVITY_RP_SIZE* = 5
+ OCF_WRITE_PAGE_ACTIVITY* = 0x0000001C
+ type
+ write_page_activity_cp* = object {.packed.}
+ interval*: uint16
+ window*: uint16
+
+ const
+ WRITE_PAGE_ACTIVITY_CP_SIZE* = 4
+ OCF_READ_INQ_ACTIVITY* = 0x0000001D
+ type
+ read_inq_activity_rp* = object {.packed.}
+ status*: uint8
+ interval*: uint16
+ window*: uint16
+
+ const
+ READ_INQ_ACTIVITY_RP_SIZE* = 5
+ OCF_WRITE_INQ_ACTIVITY* = 0x0000001E
+ type
+ write_inq_activity_cp* = object {.packed.}
+ interval*: uint16
+ window*: uint16
+
+ const
+ WRITE_INQ_ACTIVITY_CP_SIZE* = 4
+ OCF_READ_AUTH_ENABLE* = 0x0000001F
+ OCF_WRITE_AUTH_ENABLE* = 0x00000020
+ AUTH_DISABLED* = 0x00000000
+ AUTH_ENABLED* = 0x00000001
+ OCF_READ_ENCRYPT_MODE* = 0x00000021
+ OCF_WRITE_ENCRYPT_MODE* = 0x00000022
+ ENCRYPT_DISABLED* = 0x00000000
+ ENCRYPT_P2P* = 0x00000001
+ ENCRYPT_BOTH* = 0x00000002
+ OCF_READ_CLASS_OF_DEV* = 0x00000023
+ type
+ read_class_of_dev_rp* = object {.packed.}
+ status*: uint8
+ dev_class*: array[3, uint8]
+
+ const
+ READ_CLASS_OF_DEV_RP_SIZE* = 4
+ OCF_WRITE_CLASS_OF_DEV* = 0x00000024
+ type
+ write_class_of_dev_cp* = object {.packed.}
+ dev_class*: array[3, uint8]
+
+ const
+ WRITE_CLASS_OF_DEV_CP_SIZE* = 3
+ OCF_READ_VOICE_SETTING* = 0x00000025
+ type
+ read_voice_setting_rp* = object {.packed.}
+ status*: uint8
+ voice_setting*: uint16
+
+ const
+ READ_VOICE_SETTING_RP_SIZE* = 3
+ OCF_WRITE_VOICE_SETTING* = 0x00000026
+ type
+ write_voice_setting_cp* = object {.packed.}
+ voice_setting*: uint16
+
+ const
+ WRITE_VOICE_SETTING_CP_SIZE* = 2
+ OCF_READ_AUTOMATIC_FLUSH_TIMEOUT* = 0x00000027
+ OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT* = 0x00000028
+ OCF_READ_NUM_BROADCAST_RETRANS* = 0x00000029
+ OCF_WRITE_NUM_BROADCAST_RETRANS* = 0x0000002A
+ OCF_READ_HOLD_MODE_ACTIVITY* = 0x0000002B
+ OCF_WRITE_HOLD_MODE_ACTIVITY* = 0x0000002C
+ OCF_READ_TRANSMIT_POWER_LEVEL* = 0x0000002D
+ type
+ read_transmit_power_level_cp* = object {.packed.}
+ handle*: uint16
+ `type`*: uint8
+
+ const
+ READ_TRANSMIT_POWER_LEVEL_CP_SIZE* = 3
+ type
+ read_transmit_power_level_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ level*: int8
+
+ const
+ READ_TRANSMIT_POWER_LEVEL_RP_SIZE* = 4
+ OCF_READ_SYNC_FLOW_ENABLE* = 0x0000002E
+ OCF_WRITE_SYNC_FLOW_ENABLE* = 0x0000002F
+ OCF_SET_CONTROLLER_TO_HOST_FC* = 0x00000031
+ OCF_HOST_BUFFER_SIZE* = 0x00000033
+ type
+ host_buffer_size_cp* = object {.packed.}
+ acl_mtu*: uint16
+ sco_mtu*: uint8
+ acl_max_pkt*: uint16
+ sco_max_pkt*: uint16
+
+ const
+ HOST_BUFFER_SIZE_CP_SIZE* = 7
+ OCF_HOST_NUM_COMP_PKTS* = 0x00000035
+ type
+ host_num_comp_pkts_cp* = object {.packed.}
+ num_hndl*: uint8 # variable length part
+
+ const
+ HOST_NUM_COMP_PKTS_CP_SIZE* = 1
+ OCF_READ_LINK_SUPERVISION_TIMEOUT* = 0x00000036
+ type
+ read_link_supervision_timeout_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ timeout*: uint16
+
+ const
+ READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE* = 5
+ OCF_WRITE_LINK_SUPERVISION_TIMEOUT* = 0x00000037
+ type
+ write_link_supervision_timeout_cp* = object {.packed.}
+ handle*: uint16
+ timeout*: uint16
+
+ const
+ WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE* = 4
+ type
+ write_link_supervision_timeout_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE* = 3
+ OCF_READ_NUM_SUPPORTED_IAC* = 0x00000038
+ MAX_IAC_LAP* = 0x00000040
+ OCF_READ_CURRENT_IAC_LAP* = 0x00000039
+ type
+ read_current_iac_lap_rp* = object {.packed.}
+ status*: uint8
+ num_current_iac*: uint8
+ lap*: array[MAX_IAC_LAP, array[3, uint8]]
+
+ const
+ READ_CURRENT_IAC_LAP_RP_SIZE* = 2 + 3 * MAX_IAC_LAP
+ OCF_WRITE_CURRENT_IAC_LAP* = 0x0000003A
+ type
+ write_current_iac_lap_cp* = object {.packed.}
+ num_current_iac*: uint8
+ lap*: array[MAX_IAC_LAP, array[3, uint8]]
+
+ const
+ WRITE_CURRENT_IAC_LAP_CP_SIZE* = 1 + 3 * MAX_IAC_LAP
+ OCF_READ_PAGE_SCAN_PERIOD_MODE* = 0x0000003B
+ OCF_WRITE_PAGE_SCAN_PERIOD_MODE* = 0x0000003C
+ OCF_READ_PAGE_SCAN_MODE* = 0x0000003D
+ OCF_WRITE_PAGE_SCAN_MODE* = 0x0000003E
+ OCF_SET_AFH_CLASSIFICATION* = 0x0000003F
+ type
+ set_afh_classification_cp* = object {.packed.}
+ map*: array[10, uint8]
+
+ const
+ SET_AFH_CLASSIFICATION_CP_SIZE* = 10
+ type
+ set_afh_classification_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ SET_AFH_CLASSIFICATION_RP_SIZE* = 1
+ OCF_READ_INQUIRY_SCAN_TYPE* = 0x00000042
+ type
+ read_inquiry_scan_type_rp* = object {.packed.}
+ status*: uint8
+ `type`*: uint8
+
+ const
+ READ_INQUIRY_SCAN_TYPE_RP_SIZE* = 2
+ OCF_WRITE_INQUIRY_SCAN_TYPE* = 0x00000043
+ type
+ write_inquiry_scan_type_cp* = object {.packed.}
+ `type`*: uint8
+
+ const
+ WRITE_INQUIRY_SCAN_TYPE_CP_SIZE* = 1
+ type
+ write_inquiry_scan_type_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_INQUIRY_SCAN_TYPE_RP_SIZE* = 1
+ OCF_READ_INQUIRY_MODE* = 0x00000044
+ type
+ read_inquiry_mode_rp* = object {.packed.}
+ status*: uint8
+ mode*: uint8
+
+ const
+ READ_INQUIRY_MODE_RP_SIZE* = 2
+ OCF_WRITE_INQUIRY_MODE* = 0x00000045
+ type
+ write_inquiry_mode_cp* = object {.packed.}
+ mode*: uint8
+
+ const
+ WRITE_INQUIRY_MODE_CP_SIZE* = 1
+ type
+ write_inquiry_mode_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_INQUIRY_MODE_RP_SIZE* = 1
+ OCF_READ_PAGE_SCAN_TYPE* = 0x00000046
+ OCF_WRITE_PAGE_SCAN_TYPE* = 0x00000047
+ PAGE_SCAN_TYPE_STANDARD* = 0x00000000
+ PAGE_SCAN_TYPE_INTERLACED* = 0x00000001
+ OCF_READ_AFH_MODE* = 0x00000048
+ type
+ read_afh_mode_rp* = object {.packed.}
+ status*: uint8
+ mode*: uint8
+
+ const
+ READ_AFH_MODE_RP_SIZE* = 2
+ OCF_WRITE_AFH_MODE* = 0x00000049
+ type
+ write_afh_mode_cp* = object {.packed.}
+ mode*: uint8
+
+ const
+ WRITE_AFH_MODE_CP_SIZE* = 1
+ type
+ write_afh_mode_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_AFH_MODE_RP_SIZE* = 1
+ HCI_MAX_EIR_LENGTH* = 240
+ OCF_READ_EXT_INQUIRY_RESPONSE* = 0x00000051
+ type
+ read_ext_inquiry_response_rp* = object {.packed.}
+ status*: uint8
+ fec*: uint8
+ data*: array[HCI_MAX_EIR_LENGTH, uint8]
+
+ const
+ READ_EXT_INQUIRY_RESPONSE_RP_SIZE* = 242
+ OCF_WRITE_EXT_INQUIRY_RESPONSE* = 0x00000052
+ type
+ write_ext_inquiry_response_cp* = object {.packed.}
+ fec*: uint8
+ data*: array[HCI_MAX_EIR_LENGTH, uint8]
+
+ const
+ WRITE_EXT_INQUIRY_RESPONSE_CP_SIZE* = 241
+ type
+ write_ext_inquiry_response_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_EXT_INQUIRY_RESPONSE_RP_SIZE* = 1
+ OCF_REFRESH_ENCRYPTION_KEY* = 0x00000053
+ type
+ refresh_encryption_key_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ REFRESH_ENCRYPTION_KEY_CP_SIZE* = 2
+ type
+ refresh_encryption_key_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ REFRESH_ENCRYPTION_KEY_RP_SIZE* = 1
+ OCF_READ_SIMPLE_PAIRING_MODE* = 0x00000055
+ type
+ read_simple_pairing_mode_rp* = object {.packed.}
+ status*: uint8
+ mode*: uint8
+
+ const
+ READ_SIMPLE_PAIRING_MODE_RP_SIZE* = 2
+ OCF_WRITE_SIMPLE_PAIRING_MODE* = 0x00000056
+ type
+ write_simple_pairing_mode_cp* = object {.packed.}
+ mode*: uint8
+
+ const
+ WRITE_SIMPLE_PAIRING_MODE_CP_SIZE* = 1
+ type
+ write_simple_pairing_mode_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_SIMPLE_PAIRING_MODE_RP_SIZE* = 1
+ OCF_READ_LOCAL_OOB_DATA* = 0x00000057
+ type
+ read_local_oob_data_rp* = object {.packed.}
+ status*: uint8
+ hash*: array[16, uint8]
+ randomizer*: array[16, uint8]
+
+ const
+ READ_LOCAL_OOB_DATA_RP_SIZE* = 33
+ OCF_READ_INQ_RESPONSE_TX_POWER_LEVEL* = 0x00000058
+ type
+ read_inq_response_tx_power_level_rp* = object {.packed.}
+ status*: uint8
+ level*: int8
+
+ const
+ READ_INQ_RESPONSE_TX_POWER_LEVEL_RP_SIZE* = 2
+ OCF_READ_INQUIRY_TRANSMIT_POWER_LEVEL* = 0x00000058
+ type
+ read_inquiry_transmit_power_level_rp* = object {.packed.}
+ status*: uint8
+ level*: int8
+
+ const
+ READ_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE* = 2
+ OCF_WRITE_INQUIRY_TRANSMIT_POWER_LEVEL* = 0x00000059
+ type
+ write_inquiry_transmit_power_level_cp* = object {.packed.}
+ level*: int8
+
+ const
+ WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_CP_SIZE* = 1
+ type
+ write_inquiry_transmit_power_level_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_INQUIRY_TRANSMIT_POWER_LEVEL_RP_SIZE* = 1
+ OCF_READ_DEFAULT_ERROR_DATA_REPORTING* = 0x0000005A
+ type
+ read_default_error_data_reporting_rp* = object {.packed.}
+ status*: uint8
+ reporting*: uint8
+
+ const
+ READ_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE* = 2
+ OCF_WRITE_DEFAULT_ERROR_DATA_REPORTING* = 0x0000005B
+ type
+ write_default_error_data_reporting_cp* = object {.packed.}
+ reporting*: uint8
+
+ const
+ WRITE_DEFAULT_ERROR_DATA_REPORTING_CP_SIZE* = 1
+ type
+ write_default_error_data_reporting_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_DEFAULT_ERROR_DATA_REPORTING_RP_SIZE* = 1
+ OCF_ENHANCED_FLUSH* = 0x0000005F
+ type
+ enhanced_flush_cp* = object {.packed.}
+ handle*: uint16
+ `type`*: uint8
+
+ const
+ ENHANCED_FLUSH_CP_SIZE* = 3
+ OCF_SEND_KEYPRESS_NOTIFY* = 0x00000060
+ type
+ send_keypress_notify_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+ `type`*: uint8
+
+ const
+ SEND_KEYPRESS_NOTIFY_CP_SIZE* = 7
+ type
+ send_keypress_notify_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ SEND_KEYPRESS_NOTIFY_RP_SIZE* = 1
+ OCF_READ_LOGICAL_LINK_ACCEPT_TIMEOUT* = 0x00000061
+ type
+ read_log_link_accept_timeout_rp* = object {.packed.}
+ status*: uint8
+ timeout*: uint16
+
+ const
+ READ_LOGICAL_LINK_ACCEPT_TIMEOUT_RP_SIZE* = 3
+ OCF_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT* = 0x00000062
+ type
+ write_log_link_accept_timeout_cp* = object {.packed.}
+ timeout*: uint16
+
+ const
+ WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT_CP_SIZE* = 2
+ OCF_SET_EVENT_MASK_PAGE_2* = 0x00000063
+ OCF_READ_LOCATION_DATA* = 0x00000064
+ OCF_WRITE_LOCATION_DATA* = 0x00000065
+ OCF_READ_FLOW_CONTROL_MODE* = 0x00000066
+ OCF_WRITE_FLOW_CONTROL_MODE* = 0x00000067
+ OCF_READ_ENHANCED_TRANSMIT_POWER_LEVEL* = 0x00000068
+ type
+ read_enhanced_transmit_power_level_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ level_gfsk*: int8
+ level_dqpsk*: int8
+ level_8dpsk*: int8
+
+ const
+ READ_ENHANCED_TRANSMIT_POWER_LEVEL_RP_SIZE* = 6
+ OCF_READ_BEST_EFFORT_FLUSH_TIMEOUT* = 0x00000069
+ type
+ read_best_effort_flush_timeout_rp* = object {.packed.}
+ status*: uint8
+ timeout*: uint32
+
+ const
+ READ_BEST_EFFORT_FLUSH_TIMEOUT_RP_SIZE* = 5
+ OCF_WRITE_BEST_EFFORT_FLUSH_TIMEOUT* = 0x0000006A
+ type
+ write_best_effort_flush_timeout_cp* = object {.packed.}
+ handle*: uint16
+ timeout*: uint32
+
+ const
+ WRITE_BEST_EFFORT_FLUSH_TIMEOUT_CP_SIZE* = 6
+ type
+ write_best_effort_flush_timeout_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_BEST_EFFORT_FLUSH_TIMEOUT_RP_SIZE* = 1
+ OCF_READ_LE_HOST_SUPPORTED* = 0x0000006C
+ type
+ read_le_host_supported_rp* = object {.packed.}
+ status*: uint8
+ le*: uint8
+ simul*: uint8
+
+ const
+ READ_LE_HOST_SUPPORTED_RP_SIZE* = 3
+ OCF_WRITE_LE_HOST_SUPPORTED* = 0x0000006D
+ type
+ write_le_host_supported_cp* = object {.packed.}
+ le*: uint8
+ simul*: uint8
+
+ const
+ WRITE_LE_HOST_SUPPORTED_CP_SIZE* = 2
+ # Informational Parameters
+ const
+ OGF_INFO_PARAM* = 0x00000004
+ OCF_READ_LOCAL_VERSION* = 0x00000001
+ type
+ read_local_version_rp* = object {.packed.}
+ status*: uint8
+ hci_ver*: uint8
+ hci_rev*: uint16
+ lmp_ver*: uint8
+ manufacturer*: uint16
+ lmp_subver*: uint16
+
+ const
+ READ_LOCAL_VERSION_RP_SIZE* = 9
+ OCF_READ_LOCAL_COMMANDS* = 0x00000002
+ type
+ read_local_commands_rp* = object {.packed.}
+ status*: uint8
+ commands*: array[64, uint8]
+
+ const
+ READ_LOCAL_COMMANDS_RP_SIZE* = 65
+ OCF_READ_LOCAL_FEATURES* = 0x00000003
+ type
+ read_local_features_rp* = object {.packed.}
+ status*: uint8
+ features*: array[8, uint8]
+
+ const
+ READ_LOCAL_FEATURES_RP_SIZE* = 9
+ OCF_READ_LOCAL_EXT_FEATURES* = 0x00000004
+ type
+ read_local_ext_features_cp* = object {.packed.}
+ page_num*: uint8
+
+ const
+ READ_LOCAL_EXT_FEATURES_CP_SIZE* = 1
+ type
+ read_local_ext_features_rp* = object {.packed.}
+ status*: uint8
+ page_num*: uint8
+ max_page_num*: uint8
+ features*: array[8, uint8]
+
+ const
+ READ_LOCAL_EXT_FEATURES_RP_SIZE* = 11
+ OCF_READ_BUFFER_SIZE* = 0x00000005
+ type
+ read_buffer_size_rp* = object {.packed.}
+ status*: uint8
+ acl_mtu*: uint16
+ sco_mtu*: uint8
+ acl_max_pkt*: uint16
+ sco_max_pkt*: uint16
+
+ const
+ READ_BUFFER_SIZE_RP_SIZE* = 8
+ OCF_READ_COUNTRY_CODE* = 0x00000007
+ OCF_READ_BD_ADDR* = 0x00000009
+ type
+ read_bd_addr_rp* = object {.packed.}
+ status*: uint8
+ bdaddr*: bdaddr_t
+
+ const
+ READ_BD_ADDR_RP_SIZE* = 7
+ # Status params
+ const
+ OGF_STATUS_PARAM* = 0x00000005
+ OCF_READ_FAILED_CONTACT_COUNTER* = 0x00000001
+ type
+ read_failed_contact_counter_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ counter*: uint8
+
+ const
+ READ_FAILED_CONTACT_COUNTER_RP_SIZE* = 4
+ OCF_RESET_FAILED_CONTACT_COUNTER* = 0x00000002
+ type
+ reset_failed_contact_counter_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ RESET_FAILED_CONTACT_COUNTER_RP_SIZE* = 4
+ OCF_READ_LINK_QUALITY* = 0x00000003
+ type
+ read_link_quality_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ link_quality*: uint8
+
+ const
+ READ_LINK_QUALITY_RP_SIZE* = 4
+ OCF_READ_RSSI* = 0x00000005
+ type
+ read_rssi_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ rssi*: int8
+
+ const
+ READ_RSSI_RP_SIZE* = 4
+ OCF_READ_AFH_MAP* = 0x00000006
+ type
+ read_afh_map_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ mode*: uint8
+ map*: array[10, uint8]
+
+ const
+ READ_AFH_MAP_RP_SIZE* = 14
+ OCF_READ_CLOCK* = 0x00000007
+ type
+ read_clock_cp* = object {.packed.}
+ handle*: uint16
+ which_clock*: uint8
+
+ const
+ READ_CLOCK_CP_SIZE* = 3
+ type
+ read_clock_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ clock*: uint32
+ accuracy*: uint16
+
+ const
+ READ_CLOCK_RP_SIZE* = 9
+ OCF_READ_LOCAL_AMP_INFO* = 0x00000009
+ type
+ read_local_amp_info_rp* = object {.packed.}
+ status*: uint8
+ amp_status*: uint8
+ total_bandwidth*: uint32
+ max_guaranteed_bandwidth*: uint32
+ min_latency*: uint32
+ max_pdu_size*: uint32
+ controller_type*: uint8
+ pal_caps*: uint16
+ max_amp_assoc_length*: uint16
+ max_flush_timeout*: uint32
+ best_effort_flush_timeout*: uint32
+
+ const
+ READ_LOCAL_AMP_INFO_RP_SIZE* = 31
+ OCF_READ_LOCAL_AMP_ASSOC* = 0x0000000A
+ type
+ read_local_amp_assoc_cp* = object {.packed.}
+ handle*: uint8
+ len_so_far*: uint16
+ max_len*: uint16
+
+ read_local_amp_assoc_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint8
+ rem_len*: uint16
+ frag*: array[0, uint8]
+
+ const
+ OCF_WRITE_REMOTE_AMP_ASSOC* = 0x0000000B
+ type
+ write_remote_amp_assoc_cp* = object {.packed.}
+ handle*: uint8
+ length_so_far*: uint16
+ assoc_length*: uint16
+ fragment*: array[HCI_MAX_NAME_LENGTH, uint8]
+
+ const
+ WRITE_REMOTE_AMP_ASSOC_CP_SIZE* = 253
+ type
+ write_remote_amp_assoc_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint8
+
+ const
+ WRITE_REMOTE_AMP_ASSOC_RP_SIZE* = 2
+ # Testing commands
+ const
+ OGF_TESTING_CMD* = 0x0000003E
+ OCF_READ_LOOPBACK_MODE* = 0x00000001
+ OCF_WRITE_LOOPBACK_MODE* = 0x00000002
+ OCF_ENABLE_DEVICE_UNDER_TEST_MODE* = 0x00000003
+ OCF_WRITE_SIMPLE_PAIRING_DEBUG_MODE* = 0x00000004
+ type
+ write_simple_pairing_debug_mode_cp* = object {.packed.}
+ mode*: uint8
+
+ const
+ WRITE_SIMPLE_PAIRING_DEBUG_MODE_CP_SIZE* = 1
+ type
+ write_simple_pairing_debug_mode_rp* = object {.packed.}
+ status*: uint8
+
+ const
+ WRITE_SIMPLE_PAIRING_DEBUG_MODE_RP_SIZE* = 1
+ # LE commands
+ const
+ OGF_LE_CTL* = 0x00000008
+ OCF_LE_SET_EVENT_MASK* = 0x00000001
+ type
+ le_set_event_mask_cp* = object {.packed.}
+ mask*: array[8, uint8]
+
+ const
+ LE_SET_EVENT_MASK_CP_SIZE* = 8
+ OCF_LE_READ_BUFFER_SIZE* = 0x00000002
+ type
+ le_read_buffer_size_rp* = object {.packed.}
+ status*: uint8
+ pkt_len*: uint16
+ max_pkt*: uint8
+
+ const
+ LE_READ_BUFFER_SIZE_RP_SIZE* = 4
+ OCF_LE_READ_LOCAL_SUPPORTED_FEATURES* = 0x00000003
+ type
+ le_read_local_supported_features_rp* = object {.packed.}
+ status*: uint8
+ features*: array[8, uint8]
+
+ const
+ LE_READ_LOCAL_SUPPORTED_FEATURES_RP_SIZE* = 9
+ OCF_LE_SET_RANDOM_ADDRESS* = 0x00000005
+ type
+ le_set_random_address_cp* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ LE_SET_RANDOM_ADDRESS_CP_SIZE* = 6
+ OCF_LE_SET_ADVERTISING_PARAMETERS* = 0x00000006
+ type
+ le_set_advertising_parameters_cp* = object {.packed.}
+ min_interval*: uint16
+ max_interval*: uint16
+ advtype*: uint8
+ own_bdaddr_type*: uint8
+ direct_bdaddr_type*: uint8
+ direct_bdaddr*: bdaddr_t
+ chan_map*: uint8
+ filter*: uint8
+
+ const
+ LE_SET_ADVERTISING_PARAMETERS_CP_SIZE* = 15
+ OCF_LE_READ_ADVERTISING_CHANNEL_TX_POWER* = 0x00000007
+ type
+ le_read_advertising_channel_tx_power_rp* = object {.packed.}
+ status*: uint8
+ level*: uint8
+
+ const
+ LE_READ_ADVERTISING_CHANNEL_TX_POWER_RP_SIZE* = 2
+ OCF_LE_SET_ADVERTISING_DATA* = 0x00000008
+ type
+ le_set_advertising_data_cp* = object {.packed.}
+ length*: uint8
+ data*: array[31, uint8]
+
+ const
+ LE_SET_ADVERTISING_DATA_CP_SIZE* = 32
+ OCF_LE_SET_SCAN_RESPONSE_DATA* = 0x00000009
+ type
+ le_set_scan_response_data_cp* = object {.packed.}
+ length*: uint8
+ data*: array[31, uint8]
+
+ const
+ LE_SET_SCAN_RESPONSE_DATA_CP_SIZE* = 32
+ OCF_LE_SET_ADVERTISE_ENABLE* = 0x0000000A
+ type
+ le_set_advertise_enable_cp* = object {.packed.}
+ enable*: uint8
+
+ const
+ LE_SET_ADVERTISE_ENABLE_CP_SIZE* = 1
+ OCF_LE_SET_SCAN_PARAMETERS* = 0x0000000B
+ type
+ le_set_scan_parameters_cp* = object {.packed.}
+ `type`*: uint8
+ interval*: uint16
+ window*: uint16
+ own_bdaddr_type*: uint8
+ filter*: uint8
+
+ const
+ LE_SET_SCAN_PARAMETERS_CP_SIZE* = 7
+ OCF_LE_SET_SCAN_ENABLE* = 0x0000000C
+ type
+ le_set_scan_enable_cp* = object {.packed.}
+ enable*: uint8
+ filter_dup*: uint8
+
+ const
+ LE_SET_SCAN_ENABLE_CP_SIZE* = 2
+ OCF_LE_CREATE_CONN* = 0x0000000D
+ type
+ le_create_connection_cp* = object {.packed.}
+ interval*: uint16
+ window*: uint16
+ initiator_filter*: uint8
+ peer_bdaddr_type*: uint8
+ peer_bdaddr*: bdaddr_t
+ own_bdaddr_type*: uint8
+ min_interval*: uint16
+ max_interval*: uint16
+ latency*: uint16
+ supervision_timeout*: uint16
+ min_ce_length*: uint16
+ max_ce_length*: uint16
+
+ const
+ LE_CREATE_CONN_CP_SIZE* = 25
+ OCF_LE_CREATE_CONN_CANCEL* = 0x0000000E
+ OCF_LE_READ_WHITE_LIST_SIZE* = 0x0000000F
+ type
+ le_read_white_list_size_rp* = object {.packed.}
+ status*: uint8
+ size*: uint8
+
+ const
+ LE_READ_WHITE_LIST_SIZE_RP_SIZE* = 2
+ OCF_LE_CLEAR_WHITE_LIST* = 0x00000010
+ OCF_LE_ADD_DEVICE_TO_WHITE_LIST* = 0x00000011
+ type
+ le_add_device_to_white_list_cp* = object {.packed.}
+ bdaddr_type*: uint8
+ bdaddr*: bdaddr_t
+
+ const
+ LE_ADD_DEVICE_TO_WHITE_LIST_CP_SIZE* = 7
+ OCF_LE_REMOVE_DEVICE_FROM_WHITE_LIST* = 0x00000012
+ type
+ le_remove_device_from_white_list_cp* = object {.packed.}
+ bdaddr_type*: uint8
+ bdaddr*: bdaddr_t
+
+ const
+ LE_REMOVE_DEVICE_FROM_WHITE_LIST_CP_SIZE* = 7
+ OCF_LE_CONN_UPDATE* = 0x00000013
+ type
+ le_connection_update_cp* = object {.packed.}
+ handle*: uint16
+ min_interval*: uint16
+ max_interval*: uint16
+ latency*: uint16
+ supervision_timeout*: uint16
+ min_ce_length*: uint16
+ max_ce_length*: uint16
+
+ const
+ LE_CONN_UPDATE_CP_SIZE* = 14
+ OCF_LE_SET_HOST_CHANNEL_CLASSIFICATION* = 0x00000014
+ type
+ le_set_host_channel_classification_cp* = object {.packed.}
+ map*: array[5, uint8]
+
+ const
+ LE_SET_HOST_CHANNEL_CLASSIFICATION_CP_SIZE* = 5
+ OCF_LE_READ_CHANNEL_MAP* = 0x00000015
+ type
+ le_read_channel_map_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ LE_READ_CHANNEL_MAP_CP_SIZE* = 2
+ type
+ le_read_channel_map_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ map*: array[5, uint8]
+
+ const
+ LE_READ_CHANNEL_MAP_RP_SIZE* = 8
+ OCF_LE_READ_REMOTE_USED_FEATURES* = 0x00000016
+ type
+ le_read_remote_used_features_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ LE_READ_REMOTE_USED_FEATURES_CP_SIZE* = 2
+ OCF_LE_ENCRYPT* = 0x00000017
+ type
+ le_encrypt_cp* = object {.packed.}
+ key*: array[16, uint8]
+ plaintext*: array[16, uint8]
+
+ const
+ LE_ENCRYPT_CP_SIZE* = 32
+ type
+ le_encrypt_rp* = object {.packed.}
+ status*: uint8
+ data*: array[16, uint8]
+
+ const
+ LE_ENCRYPT_RP_SIZE* = 17
+ OCF_LE_RAND* = 0x00000018
+ type
+ le_rand_rp* = object {.packed.}
+ status*: uint8
+ random*: uint64
+
+ const
+ LE_RAND_RP_SIZE* = 9
+ OCF_LE_START_ENCRYPTION* = 0x00000019
+ type
+ le_start_encryption_cp* = object {.packed.}
+ handle*: uint16
+ random*: uint64
+ diversifier*: uint16
+ key*: array[16, uint8]
+
+ const
+ LE_START_ENCRYPTION_CP_SIZE* = 28
+ OCF_LE_LTK_REPLY* = 0x0000001A
+ type
+ le_ltk_reply_cp* = object {.packed.}
+ handle*: uint16
+ key*: array[16, uint8]
+
+ const
+ LE_LTK_REPLY_CP_SIZE* = 18
+ type
+ le_ltk_reply_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ LE_LTK_REPLY_RP_SIZE* = 3
+ OCF_LE_LTK_NEG_REPLY* = 0x0000001B
+ type
+ le_ltk_neg_reply_cp* = object {.packed.}
+ handle*: uint16
+
+ const
+ LE_LTK_NEG_REPLY_CP_SIZE* = 2
+ type
+ le_ltk_neg_reply_rp* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ LE_LTK_NEG_REPLY_RP_SIZE* = 3
+ OCF_LE_READ_SUPPORTED_STATES* = 0x0000001C
+ type
+ le_read_supported_states_rp* = object {.packed.}
+ status*: uint8
+ states*: uint64
+
+ const
+ LE_READ_SUPPORTED_STATES_RP_SIZE* = 9
+ OCF_LE_RECEIVER_TEST* = 0x0000001D
+ type
+ le_receiver_test_cp* = object {.packed.}
+ frequency*: uint8
+
+ const
+ LE_RECEIVER_TEST_CP_SIZE* = 1
+ OCF_LE_TRANSMITTER_TEST* = 0x0000001E
+ type
+ le_transmitter_test_cp* = object {.packed.}
+ frequency*: uint8
+ length*: uint8
+ payload*: uint8
+
+ const
+ LE_TRANSMITTER_TEST_CP_SIZE* = 3
+ OCF_LE_TEST_END* = 0x0000001F
+ type
+ le_test_end_rp* = object {.packed.}
+ status*: uint8
+ num_pkts*: uint16
+
+ const
+ LE_TEST_END_RP_SIZE* = 3
+ # Vendor specific commands
+ const
+ OGF_VENDOR_CMD* = 0x0000003F
+ # ---- HCI Events ----
+ const
+ EVT_INQUIRY_COMPLETE* = 0x00000001
+ EVT_INQUIRY_RESULT* = 0x00000002
+ type
+ inquiry_info* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+ pscan_period_mode*: uint8
+ pscan_mode*: uint8
+ dev_class*: array[3, uint8]
+ clock_offset*: uint16
+
+ const
+ INQUIRY_INFO_SIZE* = 14
+ EVT_CONN_COMPLETE* = 0x00000003
+ type
+ evt_conn_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ bdaddr*: bdaddr_t
+ link_type*: uint8
+ encr_mode*: uint8
+
+ const
+ EVT_CONN_COMPLETE_SIZE* = 13
+ EVT_CONN_REQUEST* = 0x00000004
+ type
+ evt_conn_request* = object {.packed.}
+ bdaddr*: bdaddr_t
+ dev_class*: array[3, uint8]
+ link_type*: uint8
+
+ const
+ EVT_CONN_REQUEST_SIZE* = 10
+ EVT_DISCONN_COMPLETE* = 0x00000005
+ type
+ evt_disconn_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ reason*: uint8
+
+ const
+ EVT_DISCONN_COMPLETE_SIZE* = 4
+ EVT_AUTH_COMPLETE* = 0x00000006
+ type
+ evt_auth_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ EVT_AUTH_COMPLETE_SIZE* = 3
+ EVT_REMOTE_NAME_REQ_COMPLETE* = 0x00000007
+ type
+ evt_remote_name_req_complete* = object {.packed.}
+ status*: uint8
+ bdaddr*: bdaddr_t
+ name*: array[HCI_MAX_NAME_LENGTH, uint8]
+
+ const
+ EVT_REMOTE_NAME_REQ_COMPLETE_SIZE* = 255
+ EVT_ENCRYPT_CHANGE* = 0x00000008
+ type
+ evt_encrypt_change* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ encrypt*: uint8
+
+ const
+ EVT_ENCRYPT_CHANGE_SIZE* = 5
+ EVT_CHANGE_CONN_LINK_KEY_COMPLETE* = 0x00000009
+ type
+ evt_change_conn_link_key_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE* = 3
+ EVT_MASTER_LINK_KEY_COMPLETE* = 0x0000000A
+ type
+ evt_master_link_key_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ key_flag*: uint8
+
+ const
+ EVT_MASTER_LINK_KEY_COMPLETE_SIZE* = 4
+ EVT_READ_REMOTE_FEATURES_COMPLETE* = 0x0000000B
+ type
+ evt_read_remote_features_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ features*: array[8, uint8]
+
+ const
+ EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE* = 11
+ EVT_READ_REMOTE_VERSION_COMPLETE* = 0x0000000C
+ type
+ evt_read_remote_version_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ lmp_ver*: uint8
+ manufacturer*: uint16
+ lmp_subver*: uint16
+
+ const
+ EVT_READ_REMOTE_VERSION_COMPLETE_SIZE* = 8
+ EVT_QOS_SETUP_COMPLETE* = 0x0000000D
+ type
+ evt_qos_setup_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ flags*: uint8 # Reserved
+ qos*: hci_qos
+
+ const
+ EVT_QOS_SETUP_COMPLETE_SIZE* = (4 + HCI_QOS_CP_SIZE)
+ EVT_CMD_COMPLETE* = 0x0000000E
+ type
+ evt_cmd_complete* = object {.packed.}
+ ncmd*: uint8
+ opcode*: uint16
+
+ const
+ EVT_CMD_COMPLETE_SIZE* = 3
+ EVT_CMD_STATUS* = 0x0000000F
+ type
+ evt_cmd_status* = object {.packed.}
+ status*: uint8
+ ncmd*: uint8
+ opcode*: uint16
+
+ const
+ EVT_CMD_STATUS_SIZE* = 4
+ EVT_HARDWARE_ERROR* = 0x00000010
+ type
+ evt_hardware_error* = object {.packed.}
+ code*: uint8
+
+ const
+ EVT_HARDWARE_ERROR_SIZE* = 1
+ EVT_FLUSH_OCCURRED* = 0x00000011
+ type
+ evt_flush_occured* = object {.packed.}
+ handle*: uint16
+
+ const
+ EVT_FLUSH_OCCURRED_SIZE* = 2
+ EVT_ROLE_CHANGE* = 0x00000012
+ type
+ evt_role_change* = object {.packed.}
+ status*: uint8
+ bdaddr*: bdaddr_t
+ role*: uint8
+
+ const
+ EVT_ROLE_CHANGE_SIZE* = 8
+ EVT_NUM_COMP_PKTS* = 0x00000013
+ type
+ evt_num_comp_pkts* = object {.packed.}
+ num_hndl*: uint8 # variable length part
+
+ const
+ EVT_NUM_COMP_PKTS_SIZE* = 1
+ EVT_MODE_CHANGE* = 0x00000014
+ type
+ evt_mode_change* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ mode*: uint8
+ interval*: uint16
+
+ const
+ EVT_MODE_CHANGE_SIZE* = 6
+ EVT_RETURN_LINK_KEYS* = 0x00000015
+ type
+ evt_return_link_keys* = object {.packed.}
+ num_keys*: uint8 # variable length part
+
+ const
+ EVT_RETURN_LINK_KEYS_SIZE* = 1
+ EVT_PIN_CODE_REQ* = 0x00000016
+ type
+ evt_pin_code_req* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_PIN_CODE_REQ_SIZE* = 6
+ EVT_LINK_KEY_REQ* = 0x00000017
+ type
+ evt_link_key_req* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_LINK_KEY_REQ_SIZE* = 6
+ EVT_LINK_KEY_NOTIFY* = 0x00000018
+ type
+ evt_link_key_notify* = object {.packed.}
+ bdaddr*: bdaddr_t
+ link_key*: array[16, uint8]
+ key_type*: uint8
+
+ const
+ EVT_LINK_KEY_NOTIFY_SIZE* = 23
+ EVT_LOOPBACK_COMMAND* = 0x00000019
+ EVT_DATA_BUFFER_OVERFLOW* = 0x0000001A
+ type
+ evt_data_buffer_overflow* = object {.packed.}
+ link_type*: uint8
+
+ const
+ EVT_DATA_BUFFER_OVERFLOW_SIZE* = 1
+ EVT_MAX_SLOTS_CHANGE* = 0x0000001B
+ type
+ evt_max_slots_change* = object {.packed.}
+ handle*: uint16
+ max_slots*: uint8
+
+ const
+ EVT_MAX_SLOTS_CHANGE_SIZE* = 3
+ EVT_READ_CLOCK_OFFSET_COMPLETE* = 0x0000001C
+ type
+ evt_read_clock_offset_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ clock_offset*: uint16
+
+ const
+ EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE* = 5
+ EVT_CONN_PTYPE_CHANGED* = 0x0000001D
+ type
+ evt_conn_ptype_changed* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ ptype*: uint16
+
+ const
+ EVT_CONN_PTYPE_CHANGED_SIZE* = 5
+ EVT_QOS_VIOLATION* = 0x0000001E
+ type
+ evt_qos_violation* = object {.packed.}
+ handle*: uint16
+
+ const
+ EVT_QOS_VIOLATION_SIZE* = 2
+ EVT_PSCAN_REP_MODE_CHANGE* = 0x00000020
+ type
+ evt_pscan_rep_mode_change* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+
+ const
+ EVT_PSCAN_REP_MODE_CHANGE_SIZE* = 7
+ EVT_FLOW_SPEC_COMPLETE* = 0x00000021
+ type
+ evt_flow_spec_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ flags*: uint8
+ direction*: uint8
+ qos*: hci_qos
+
+ const
+ EVT_FLOW_SPEC_COMPLETE_SIZE* = (5 + HCI_QOS_CP_SIZE)
+ EVT_INQUIRY_RESULT_WITH_RSSI* = 0x00000022
+ type
+ inquiry_info_with_rssi* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+ pscan_period_mode*: uint8
+ dev_class*: array[3, uint8]
+ clock_offset*: uint16
+ rssi*: int8
+
+ const
+ INQUIRY_INFO_WITH_RSSI_SIZE* = 14
+ type
+ inquiry_info_with_rssi_and_pscan_mode* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+ pscan_period_mode*: uint8
+ pscan_mode*: uint8
+ dev_class*: array[3, uint8]
+ clock_offset*: uint16
+ rssi*: int8
+
+ const
+ INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE* = 15
+ EVT_READ_REMOTE_EXT_FEATURES_COMPLETE* = 0x00000023
+ type
+ evt_read_remote_ext_features_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ page_num*: uint8
+ max_page_num*: uint8
+ features*: array[8, uint8]
+
+ const
+ EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE* = 13
+ EVT_SYNC_CONN_COMPLETE* = 0x0000002C
+ type
+ evt_sync_conn_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ bdaddr*: bdaddr_t
+ link_type*: uint8
+ trans_interval*: uint8
+ retrans_window*: uint8
+ rx_pkt_len*: uint16
+ tx_pkt_len*: uint16
+ air_mode*: uint8
+
+ const
+ EVT_SYNC_CONN_COMPLETE_SIZE* = 17
+ EVT_SYNC_CONN_CHANGED* = 0x0000002D
+ type
+ evt_sync_conn_changed* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ trans_interval*: uint8
+ retrans_window*: uint8
+ rx_pkt_len*: uint16
+ tx_pkt_len*: uint16
+
+ const
+ EVT_SYNC_CONN_CHANGED_SIZE* = 9
+ EVT_SNIFF_SUBRATING* = 0x0000002E
+ type
+ evt_sniff_subrating* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ max_tx_latency*: uint16
+ max_rx_latency*: uint16
+ min_remote_timeout*: uint16
+ min_local_timeout*: uint16
+
+ const
+ EVT_SNIFF_SUBRATING_SIZE* = 11
+ EVT_EXTENDED_INQUIRY_RESULT* = 0x0000002F
+ type
+ extended_inquiry_info* = object {.packed.}
+ bdaddr*: bdaddr_t
+ pscan_rep_mode*: uint8
+ pscan_period_mode*: uint8
+ dev_class*: array[3, uint8]
+ clock_offset*: uint16
+ rssi*: int8
+ data*: array[HCI_MAX_EIR_LENGTH, uint8]
+
+ const
+ EXTENDED_INQUIRY_INFO_SIZE* = 254
+ EVT_ENCRYPTION_KEY_REFRESH_COMPLETE* = 0x00000030
+ type
+ evt_encryption_key_refresh_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ EVT_ENCRYPTION_KEY_REFRESH_COMPLETE_SIZE* = 3
+ EVT_IO_CAPABILITY_REQUEST* = 0x00000031
+ type
+ evt_io_capability_request* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_IO_CAPABILITY_REQUEST_SIZE* = 6
+ EVT_IO_CAPABILITY_RESPONSE* = 0x00000032
+ type
+ evt_io_capability_response* = object {.packed.}
+ bdaddr*: bdaddr_t
+ capability*: uint8
+ oob_data*: uint8
+ authentication*: uint8
+
+ const
+ EVT_IO_CAPABILITY_RESPONSE_SIZE* = 9
+ EVT_USER_CONFIRM_REQUEST* = 0x00000033
+ type
+ evt_user_confirm_request* = object {.packed.}
+ bdaddr*: bdaddr_t
+ passkey*: uint32
+
+ const
+ EVT_USER_CONFIRM_REQUEST_SIZE* = 10
+ EVT_USER_PASSKEY_REQUEST* = 0x00000034
+ type
+ evt_user_passkey_request* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_USER_PASSKEY_REQUEST_SIZE* = 6
+ EVT_REMOTE_OOB_DATA_REQUEST* = 0x00000035
+ type
+ evt_remote_oob_data_request* = object {.packed.}
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_REMOTE_OOB_DATA_REQUEST_SIZE* = 6
+ EVT_SIMPLE_PAIRING_COMPLETE* = 0x00000036
+ type
+ evt_simple_pairing_complete* = object {.packed.}
+ status*: uint8
+ bdaddr*: bdaddr_t
+
+ const
+ EVT_SIMPLE_PAIRING_COMPLETE_SIZE* = 7
+ EVT_LINK_SUPERVISION_TIMEOUT_CHANGED* = 0x00000038
+ type
+ evt_link_supervision_timeout_changed* = object {.packed.}
+ handle*: uint16
+ timeout*: uint16
+
+ const
+ EVT_LINK_SUPERVISION_TIMEOUT_CHANGED_SIZE* = 4
+ EVT_ENHANCED_FLUSH_COMPLETE* = 0x00000039
+ type
+ evt_enhanced_flush_complete* = object {.packed.}
+ handle*: uint16
+
+ const
+ EVT_ENHANCED_FLUSH_COMPLETE_SIZE* = 2
+ EVT_USER_PASSKEY_NOTIFY* = 0x0000003B
+ type
+ evt_user_passkey_notify* = object {.packed.}
+ bdaddr*: bdaddr_t
+ passkey*: uint32
+ entered*: uint8
+
+ const
+ EVT_USER_PASSKEY_NOTIFY_SIZE* = 11
+ EVT_KEYPRESS_NOTIFY* = 0x0000003C
+ type
+ evt_keypress_notify* = object {.packed.}
+ bdaddr*: bdaddr_t
+ `type`*: uint8
+
+ const
+ EVT_KEYPRESS_NOTIFY_SIZE* = 7
+ EVT_REMOTE_HOST_FEATURES_NOTIFY* = 0x0000003D
+ type
+ evt_remote_host_features_notify* = object {.packed.}
+ bdaddr*: bdaddr_t
+ features*: array[8, uint8]
+
+ const
+ EVT_REMOTE_HOST_FEATURES_NOTIFY_SIZE* = 14
+ EVT_LE_META_EVENT* = 0x0000003E
+ type
+ evt_le_meta_event* = object {.packed.}
+ subevent*: uint8
+ data*: array[0, uint8]
+
+ const
+ EVT_LE_META_EVENT_SIZE* = 1
+ EVT_LE_CONN_COMPLETE* = 0x00000001
+ type
+ evt_le_connection_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ role*: uint8
+ peer_bdaddr_type*: uint8
+ peer_bdaddr*: bdaddr_t
+ interval*: uint16
+ latency*: uint16
+ supervision_timeout*: uint16
+ master_clock_accuracy*: uint8
+
+ const
+ EVT_LE_CONN_COMPLETE_SIZE* = 18
+ EVT_LE_ADVERTISING_REPORT* = 0x00000002
+ type
+ le_advertising_info* = object {.packed.}
+ evt_type*: uint8
+ bdaddr_type*: uint8
+ bdaddr*: bdaddr_t
+ length*: uint8
+ data*: array[0, uint8]
+
+ const
+ LE_ADVERTISING_INFO_SIZE* = 9
+ EVT_LE_CONN_UPDATE_COMPLETE* = 0x00000003
+ type
+ evt_le_connection_update_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ interval*: uint16
+ latency*: uint16
+ supervision_timeout*: uint16
+
+ const
+ EVT_LE_CONN_UPDATE_COMPLETE_SIZE* = 9
+ EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE* = 0x00000004
+ type
+ evt_le_read_remote_used_features_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+ features*: array[8, uint8]
+
+ const
+ EVT_LE_READ_REMOTE_USED_FEATURES_COMPLETE_SIZE* = 11
+ EVT_LE_LTK_REQUEST* = 0x00000005
+ type
+ evt_le_long_term_key_request* = object {.packed.}
+ handle*: uint16
+ random*: uint64
+ diversifier*: uint16
+
+ const
+ EVT_LE_LTK_REQUEST_SIZE* = 12
+ EVT_PHYSICAL_LINK_COMPLETE* = 0x00000040
+ type
+ evt_physical_link_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint8
+
+ const
+ EVT_PHYSICAL_LINK_COMPLETE_SIZE* = 2
+ EVT_CHANNEL_SELECTED* = 0x00000041
+ EVT_DISCONNECT_PHYSICAL_LINK_COMPLETE* = 0x00000042
+ type
+ evt_disconn_physical_link_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint8
+ reason*: uint8
+
+ const
+ EVT_DISCONNECT_PHYSICAL_LINK_COMPLETE_SIZE* = 3
+ EVT_PHYSICAL_LINK_LOSS_EARLY_WARNING* = 0x00000043
+ type
+ evt_physical_link_loss_warning* = object {.packed.}
+ handle*: uint8
+ reason*: uint8
+
+ const
+ EVT_PHYSICAL_LINK_LOSS_WARNING_SIZE* = 2
+ EVT_PHYSICAL_LINK_RECOVERY* = 0x00000044
+ type
+ evt_physical_link_recovery* = object {.packed.}
+ handle*: uint8
+
+ const
+ EVT_PHYSICAL_LINK_RECOVERY_SIZE* = 1
+ EVT_LOGICAL_LINK_COMPLETE* = 0x00000045
+ type
+ evt_logical_link_complete* = object {.packed.}
+ status*: uint8
+ log_handle*: uint16
+ handle*: uint8
+ tx_flow_id*: uint8
+
+ const
+ EVT_LOGICAL_LINK_COMPLETE_SIZE* = 5
+ EVT_DISCONNECT_LOGICAL_LINK_COMPLETE* = 0x00000046
+ EVT_FLOW_SPEC_MODIFY_COMPLETE* = 0x00000047
+ type
+ evt_flow_spec_modify_complete* = object {.packed.}
+ status*: uint8
+ handle*: uint16
+
+ const
+ EVT_FLOW_SPEC_MODIFY_COMPLETE_SIZE* = 3
+ EVT_NUMBER_COMPLETED_BLOCKS* = 0x00000048
+ EVT_AMP_STATUS_CHANGE* = 0x0000004D
+ type
+ evt_amp_status_change* = object {.packed.}
+ status*: uint8
+ amp_status*: uint8
+
+ const
+ EVT_AMP_STATUS_CHANGE_SIZE* = 2
+ EVT_TESTING* = 0x000000FE
+ EVT_VENDOR* = 0x000000FF
+ # Internal events generated by BlueZ stack
+ const
+ EVT_STACK_INTERNAL* = 0x000000FD
+ type
+ evt_stack_internal* = object {.packed.}
+ `type`*: uint16
+ data*: array[0, uint8]
+
+ const
+ EVT_STACK_INTERNAL_SIZE* = 2
+ EVT_SI_DEVICE* = 0x00000001
+ type
+ evt_si_device* = object {.packed.}
+ event*: uint16
+ dev_id*: uint16
+
+ const
+ EVT_SI_DEVICE_SIZE* = 4
+ # -------- HCI Packet structures --------
+ const
+ HCI_TYPE_LEN* = 1
+ type
+ hci_command_hdr* = object {.packed.}
+ opcode*: uint16 # OCF & OGF
+ plen*: uint8
+
+ const
+ HCI_COMMAND_HDR_SIZE* = 3
+ type
+ hci_event_hdr* = object {.packed.}
+ evt*: uint8
+ plen*: uint8
+
+ const
+ HCI_EVENT_HDR_SIZE* = 2
+ type
+ hci_acl_hdr* = object {.packed.}
+ handle*: uint16 # Handle & Flags(PB, BC)
+ dlen*: uint16
+
+ const
+ HCI_ACL_HDR_SIZE* = 4
+ type
+ hci_sco_hdr* = object {.packed.}
+ handle*: uint16
+ dlen*: uint8
+
+ const
+ HCI_SCO_HDR_SIZE* = 3
+ type
+ hci_msg_hdr* = object {.packed.}
+ device*: uint16
+ `type`*: uint16
+ plen*: uint16
+
+ const
+ HCI_MSG_HDR_SIZE* = 6
+ # Command opcode pack/unpack
+ template cmd_opcode_pack*(ogf, ocf: expr): expr =
+ (uint16)((ocf and 0x000003FF) or (ogf shl 10))
+
+ template cmd_opcode_ogf*(op: expr): expr =
+ (op shr 10)
+
+ template cmd_opcode_ocf*(op: expr): expr =
+ (op and 0x000003FF)
+
+ # ACL handle and flags pack/unpack
+ template acl_handle_pack*(h, f: expr): expr =
+ (uint16)((h and 0x00000FFF) or (f shl 12))
+
+ template acl_handle*(h: expr): expr =
+ (h and 0x00000FFF)
+
+ template acl_flags*(h: expr): expr =
+ (h shr 12)
+
+# HCI Socket options
+
+const
+ HCI_DATA_DIR* = 1
+ HCI_FILTER* = 2
+ HCI_TIME_STAMP* = 3
+
+# HCI CMSG flags
+
+const
+ HCI_CMSG_DIR* = 0x00000001
+ HCI_CMSG_TSTAMP* = 0x00000002
+
+type
+ sockaddr_hci* = object
+ hci_family*: cushort
+ hci_dev*: cushort
+ hci_channel*: cushort
+
+
+const
+ HCI_DEV_NONE* = 0x0000FFFF
+ HCI_CHANNEL_RAW* = 0
+ HCI_CHANNEL_MONITOR* = 2
+ HCI_CHANNEL_CONTROL* = 3
+
+type
+ hci_filter* = object
+ type_mask*: uint32
+ event_mask*: array[2, uint32]
+ opcode*: uint16
+
+
+const
+ HCI_FLT_TYPE_BITS* = 31
+ HCI_FLT_EVENT_BITS* = 63
+ HCI_FLT_OGF_BITS* = 63
+ HCI_FLT_OCF_BITS* = 127
+
+# Ioctl requests structures
+
+type
+ hci_dev_stats* = object
+ err_rx*: uint32
+ err_tx*: uint32
+ cmd_tx*: uint32
+ evt_rx*: uint32
+ acl_tx*: uint32
+ acl_rx*: uint32
+ sco_tx*: uint32
+ sco_rx*: uint32
+ byte_rx*: uint32
+ byte_tx*: uint32
+
+ hci_dev_info* = object
+ dev_id*: uint16
+ name*: array[8, char]
+ bdaddr*: bdaddr_t
+ flags*: uint32
+ `type`*: uint8
+ features*: array[8, uint8]
+ pkt_type*: uint32
+ link_policy*: uint32
+ link_mode*: uint32
+ acl_mtu*: uint16
+ acl_pkts*: uint16
+ sco_mtu*: uint16
+ sco_pkts*: uint16
+ stat*: hci_dev_stats
+
+ hci_conn_info* = object
+ handle*: uint16
+ bdaddr*: bdaddr_t
+ `type`*: uint8
+ `out`*: uint8
+ state*: uint16
+ link_mode*: uint32
+
+ hci_dev_req* = object
+ dev_id*: uint16
+ dev_opt*: uint32
+
+ hci_dev_list_req* = object
+ dev_num*: uint16
+ # dev_req*: array[0, hci_dev_req] # hci_dev_req structures
+ dev_req*: array[HCI_MAX_DEV, hci_dev_req] # hci_dev_req structures
+
+ hci_conn_list_req* = object
+ dev_id*: uint16
+ conn_num*: uint16
+ conn_info*: array[0, hci_conn_info]
+
+ hci_conn_info_req* = object
+ bdaddr*: bdaddr_t
+ `type`*: uint8
+ conn_info*: array[0, hci_conn_info]
+
+ hci_auth_info_req* = object
+ bdaddr*: bdaddr_t
+ `type`*: uint8
+
+ hci_inquiry_req* = object
+ dev_id*: uint16
+ flags*: uint16
+ lap*: array[3, uint8]
+ length*: uint8
+ num_rsp*: uint8
+
+
+const
+ IREQ_CACHE_FLUSH* = 0x00000001
diff --git a/nimbluez/bluez/bz_hci_lib.nim b/nimbluez/bluez/bz_hci_lib.nim
new file mode 100644
index 0000000..0d6d8dc
--- /dev/null
+++ b/nimbluez/bluez/bz_hci_lib.nim
@@ -0,0 +1,298 @@
+#
+#
+# BlueZ - Bluetooth protocol stack for Linux
+#
+# Copyright (C) 2000-2001 Qualcomm Incorporated
+# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+
+{.deadCodeElim: on.}
+
+import bz_bluetooth
+import bz_hci
+
+
+type
+ hci_request* = object
+ ogf*: uint16
+ ocf*: uint16
+ event*: cint
+ cparam*: pointer
+ clen*: cint
+ rparam*: pointer
+ rlen*: cint
+
+ hci_version* = object
+ manufacturer*: uint16
+ hci_ver*: uint8
+ hci_rev*: uint16
+ lmp_ver*: uint8
+ lmp_subver*: uint16
+
+
+proc hci_open_dev*(dev_id: cint): cint {.cdecl, importc: "hci_open_dev",
+ dynlib: "libbluetooth.so".}
+proc hci_close_dev*(dd: cint): cint {.cdecl, importc: "hci_close_dev",
+ dynlib: "libbluetooth.so".}
+proc hci_send_cmd*(dd: cint; ogf: uint16; ocf: uint16; plen: uint8;
+ param: pointer): cint {.cdecl, importc: "hci_send_cmd",
+ dynlib: "libbluetooth.so".}
+proc hci_send_req*(dd: cint; req: ptr hci_request; timeout: cint): cint {.cdecl,
+ importc: "hci_send_req", dynlib: "libbluetooth.so".}
+proc hci_create_connection*(dd: cint; bdaddr: ptr bdaddr_t; ptype: uint16;
+ clkoffset: uint16; rswitch: uint8;
+ handle: ptr uint16; to: cint): cint {.cdecl,
+ importc: "hci_create_connection", dynlib: "libbluetooth.so".}
+proc hci_disconnect*(dd: cint; handle: uint16; reason: uint8; to: cint): cint {.
+ cdecl, importc: "hci_disconnect", dynlib: "libbluetooth.so".}
+proc hci_inquiry*(dev_id: cint; len: cint; num_rsp: cint; lap: ptr uint8;
+ ii: ptr ptr inquiry_info; flags: clong): cint {.cdecl,
+ importc: "hci_inquiry", dynlib: "libbluetooth.so".}
+proc hci_devinfo*(dev_id: cint; di: ptr hci_dev_info): cint {.cdecl,
+ importc: "hci_devinfo", dynlib: "libbluetooth.so".}
+proc hci_devba*(dev_id: cint; bdaddr: ptr bdaddr_t): cint {.cdecl,
+ importc: "hci_devba", dynlib: "libbluetooth.so".}
+proc hci_devid*(str: cstring): cint {.cdecl, importc: "hci_devid",
+ dynlib: "libbluetooth.so".}
+proc hci_read_local_name*(dd: cint; len: cint; name: cstring; to: cint): cint {.
+ cdecl, importc: "hci_read_local_name", dynlib: "libbluetooth.so".}
+proc hci_write_local_name*(dd: cint; name: cstring; to: cint): cint {.cdecl,
+ importc: "hci_write_local_name", dynlib: "libbluetooth.so".}
+proc hci_read_remote_name*(dd: cint; bdaddr: ptr bdaddr_t; len: cint;
+ name: cstring; to: cint): cint {.cdecl,
+ importc: "hci_read_remote_name", dynlib: "libbluetooth.so".}
+proc hci_read_remote_name_with_clock_offset*(dd: cint; bdaddr: ptr bdaddr_t;
+ pscan_rep_mode: uint8; clkoffset: uint16; len: cint; name: cstring;
+ to: cint): cint {.cdecl, importc: "hci_read_remote_name_with_clock_offset",
+ dynlib: "libbluetooth.so".}
+proc hci_read_remote_name_cancel*(dd: cint; bdaddr: ptr bdaddr_t; to: cint): cint {.
+ cdecl, importc: "hci_read_remote_name_cancel", dynlib: "libbluetooth.so".}
+proc hci_read_remote_version*(dd: cint; handle: uint16; ver: ptr hci_version;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_remote_version", dynlib: "libbluetooth.so".}
+proc hci_read_remote_features*(dd: cint; handle: uint16;
+ features: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_remote_features", dynlib: "libbluetooth.so".}
+proc hci_read_remote_ext_features*(dd: cint; handle: uint16; page: uint8;
+ max_page: ptr uint8; features: ptr uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_remote_ext_features", dynlib: "libbluetooth.so".}
+proc hci_read_clock_offset*(dd: cint; handle: uint16; clkoffset: ptr uint16;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_clock_offset", dynlib: "libbluetooth.so".}
+proc hci_read_local_version*(dd: cint; ver: ptr hci_version; to: cint): cint {.
+ cdecl, importc: "hci_read_local_version", dynlib: "libbluetooth.so".}
+proc hci_read_local_commands*(dd: cint; commands: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_read_local_commands", dynlib: "libbluetooth.so".}
+proc hci_read_local_features*(dd: cint; features: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_read_local_features", dynlib: "libbluetooth.so".}
+proc hci_read_local_ext_features*(dd: cint; page: uint8;
+ max_page: ptr uint8; features: ptr uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_local_ext_features", dynlib: "libbluetooth.so".}
+proc hci_read_bd_addr*(dd: cint; bdaddr: ptr bdaddr_t; to: cint): cint {.cdecl,
+ importc: "hci_read_bd_addr", dynlib: "libbluetooth.so".}
+proc hci_read_class_of_dev*(dd: cint; cls: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_class_of_dev", dynlib: "libbluetooth.so".}
+proc hci_write_class_of_dev*(dd: cint; cls: uint32; to: cint): cint {.cdecl,
+ importc: "hci_write_class_of_dev", dynlib: "libbluetooth.so".}
+proc hci_read_voice_setting*(dd: cint; vs: ptr uint16; to: cint): cint {.
+ cdecl, importc: "hci_read_voice_setting", dynlib: "libbluetooth.so".}
+proc hci_write_voice_setting*(dd: cint; vs: uint16; to: cint): cint {.cdecl,
+ importc: "hci_write_voice_setting", dynlib: "libbluetooth.so".}
+proc hci_read_current_iac_lap*(dd: cint; num_iac: ptr uint8; lap: ptr uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_current_iac_lap", dynlib: "libbluetooth.so".}
+proc hci_write_current_iac_lap*(dd: cint; num_iac: uint8; lap: ptr uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_write_current_iac_lap", dynlib: "libbluetooth.so".}
+proc hci_read_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t; all: uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_stored_link_key", dynlib: "libbluetooth.so".}
+proc hci_write_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t;
+ key: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_write_stored_link_key", dynlib: "libbluetooth.so".}
+proc hci_delete_stored_link_key*(dd: cint; bdaddr: ptr bdaddr_t; all: uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_delete_stored_link_key", dynlib: "libbluetooth.so".}
+proc hci_authenticate_link*(dd: cint; handle: uint16; to: cint): cint {.cdecl,
+ importc: "hci_authenticate_link", dynlib: "libbluetooth.so".}
+proc hci_encrypt_link*(dd: cint; handle: uint16; encrypt: uint8; to: cint): cint {.
+ cdecl, importc: "hci_encrypt_link", dynlib: "libbluetooth.so".}
+proc hci_change_link_key*(dd: cint; handle: uint16; to: cint): cint {.cdecl,
+ importc: "hci_change_link_key", dynlib: "libbluetooth.so".}
+proc hci_switch_role*(dd: cint; bdaddr: ptr bdaddr_t; role: uint8; to: cint): cint {.
+ cdecl, importc: "hci_switch_role", dynlib: "libbluetooth.so".}
+proc hci_park_mode*(dd: cint; handle: uint16; max_interval: uint16;
+ min_interval: uint16; to: cint): cint {.cdecl,
+ importc: "hci_park_mode", dynlib: "libbluetooth.so".}
+proc hci_exit_park_mode*(dd: cint; handle: uint16; to: cint): cint {.cdecl,
+ importc: "hci_exit_park_mode", dynlib: "libbluetooth.so".}
+proc hci_read_inquiry_scan_type*(dd: cint; `type`: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_read_inquiry_scan_type", dynlib: "libbluetooth.so".}
+proc hci_write_inquiry_scan_type*(dd: cint; `type`: uint8; to: cint): cint {.
+ cdecl, importc: "hci_write_inquiry_scan_type", dynlib: "libbluetooth.so".}
+proc hci_read_inquiry_mode*(dd: cint; mode: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_read_inquiry_mode", dynlib: "libbluetooth.so".}
+proc hci_write_inquiry_mode*(dd: cint; mode: uint8; to: cint): cint {.cdecl,
+ importc: "hci_write_inquiry_mode", dynlib: "libbluetooth.so".}
+proc hci_read_afh_mode*(dd: cint; mode: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_afh_mode", dynlib: "libbluetooth.so".}
+proc hci_write_afh_mode*(dd: cint; mode: uint8; to: cint): cint {.cdecl,
+ importc: "hci_write_afh_mode", dynlib: "libbluetooth.so".}
+proc hci_read_ext_inquiry_response*(dd: cint; fec: ptr uint8;
+ data: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_ext_inquiry_response", dynlib: "libbluetooth.so".}
+proc hci_write_ext_inquiry_response*(dd: cint; fec: uint8; data: ptr uint8;
+ to: cint): cint {.cdecl,
+ importc: "hci_write_ext_inquiry_response", dynlib: "libbluetooth.so".}
+proc hci_read_simple_pairing_mode*(dd: cint; mode: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_read_simple_pairing_mode", dynlib: "libbluetooth.so".}
+proc hci_write_simple_pairing_mode*(dd: cint; mode: uint8; to: cint): cint {.
+ cdecl, importc: "hci_write_simple_pairing_mode", dynlib: "libbluetooth.so".}
+proc hci_read_local_oob_data*(dd: cint; hash: ptr uint8;
+ randomizer: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_local_oob_data", dynlib: "libbluetooth.so".}
+proc hci_read_inquiry_transmit_power_level*(dd: cint; level: ptr int8;
+ to: cint): cint {.cdecl, importc: "hci_read_inquiry_transmit_power_level",
+ dynlib: "libbluetooth.so".}
+proc hci_write_inquiry_transmit_power_level*(dd: cint; level: int8; to: cint): cint {.
+ cdecl, importc: "hci_write_inquiry_transmit_power_level",
+ dynlib: "libbluetooth.so".}
+proc hci_read_transmit_power_level*(dd: cint; handle: uint16; `type`: uint8;
+ level: ptr int8; to: cint): cint {.cdecl,
+ importc: "hci_read_transmit_power_level", dynlib: "libbluetooth.so".}
+proc hci_read_link_policy*(dd: cint; handle: uint16; policy: ptr uint16;
+ to: cint): cint {.cdecl,
+ importc: "hci_read_link_policy", dynlib: "libbluetooth.so".}
+proc hci_write_link_policy*(dd: cint; handle: uint16; policy: uint16;
+ to: cint): cint {.cdecl,
+ importc: "hci_write_link_policy", dynlib: "libbluetooth.so".}
+proc hci_read_link_supervision_timeout*(dd: cint; handle: uint16;
+ timeout: ptr uint16; to: cint): cint {.
+ cdecl, importc: "hci_read_link_supervision_timeout", dynlib: "libbluetooth.so".}
+proc hci_write_link_supervision_timeout*(dd: cint; handle: uint16;
+ timeout: uint16; to: cint): cint {.cdecl,
+ importc: "hci_write_link_supervision_timeout", dynlib: "libbluetooth.so".}
+proc hci_set_afh_classification*(dd: cint; map: ptr uint8; to: cint): cint {.
+ cdecl, importc: "hci_set_afh_classification", dynlib: "libbluetooth.so".}
+proc hci_read_link_quality*(dd: cint; handle: uint16;
+ link_quality: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_link_quality", dynlib: "libbluetooth.so".}
+proc hci_read_rssi*(dd: cint; handle: uint16; rssi: ptr int8; to: cint): cint {.
+ cdecl, importc: "hci_read_rssi", dynlib: "libbluetooth.so".}
+proc hci_read_afh_map*(dd: cint; handle: uint16; mode: ptr uint8;
+ map: ptr uint8; to: cint): cint {.cdecl,
+ importc: "hci_read_afh_map", dynlib: "libbluetooth.so".}
+proc hci_read_clock*(dd: cint; handle: uint16; which: uint8;
+ clock: ptr uint32; accuracy: ptr uint16; to: cint): cint {.
+ cdecl, importc: "hci_read_clock", dynlib: "libbluetooth.so".}
+proc hci_for_each_dev*(flag: cint; `func`: proc (dd: cint; dev_id: cint;
+ arg: clong): cint {.cdecl.}; arg: clong): cint {.cdecl,
+ importc: "hci_for_each_dev", dynlib: "libbluetooth.so".}
+proc hci_get_route*(bdaddr: ptr bdaddr_t): cint {.cdecl,
+ importc: "hci_get_route", dynlib: "libbluetooth.so".}
+proc hci_dtypetostr*(`type`: cint): cstring {.cdecl, importc: "hci_dtypetostr",
+ dynlib: "libbluetooth.so".}
+proc hci_dflagstostr*(flags: uint32): cstring {.cdecl,
+ importc: "hci_dflagstostr", dynlib: "libbluetooth.so".}
+proc hci_ptypetostr*(ptype: cuint): cstring {.cdecl, importc: "hci_ptypetostr",
+ dynlib: "libbluetooth.so".}
+proc hci_strtoptype*(str: cstring; val: ptr cuint): cint {.cdecl,
+ importc: "hci_strtoptype", dynlib: "libbluetooth.so".}
+proc hci_scoptypetostr*(ptype: cuint): cstring {.cdecl,
+ importc: "hci_scoptypetostr", dynlib: "libbluetooth.so".}
+proc hci_strtoscoptype*(str: cstring; val: ptr cuint): cint {.cdecl,
+ importc: "hci_strtoscoptype", dynlib: "libbluetooth.so".}
+proc hci_lptostr*(ptype: cuint): cstring {.cdecl, importc: "hci_lptostr",
+ dynlib: "libbluetooth.so".}
+proc hci_strtolp*(str: cstring; val: ptr cuint): cint {.cdecl,
+ importc: "hci_strtolp", dynlib: "libbluetooth.so".}
+proc hci_lmtostr*(ptype: cuint): cstring {.cdecl, importc: "hci_lmtostr",
+ dynlib: "libbluetooth.so".}
+proc hci_strtolm*(str: cstring; val: ptr cuint): cint {.cdecl,
+ importc: "hci_strtolm", dynlib: "libbluetooth.so".}
+proc hci_cmdtostr*(cmd: cuint): cstring {.cdecl, importc: "hci_cmdtostr",
+ dynlib: "libbluetooth.so".}
+proc hci_commandstostr*(commands: ptr uint8; pref: cstring; width: cint): cstring {.
+ cdecl, importc: "hci_commandstostr", dynlib: "libbluetooth.so".}
+proc hci_vertostr*(ver: cuint): cstring {.cdecl, importc: "hci_vertostr",
+ dynlib: "libbluetooth.so".}
+proc hci_strtover*(str: cstring; ver: ptr cuint): cint {.cdecl,
+ importc: "hci_strtover", dynlib: "libbluetooth.so".}
+proc lmp_vertostr*(ver: cuint): cstring {.cdecl, importc: "lmp_vertostr",
+ dynlib: "libbluetooth.so".}
+proc lmp_strtover*(str: cstring; ver: ptr cuint): cint {.cdecl,
+ importc: "lmp_strtover", dynlib: "libbluetooth.so".}
+proc lmp_featurestostr*(features: ptr uint8; pref: cstring; width: cint): cstring {.
+ cdecl, importc: "lmp_featurestostr", dynlib: "libbluetooth.so".}
+proc hci_set_bit*(nr: cint; `addr`: pointer) {.inline, cdecl.} =
+ cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[] =
+ uint32(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) or (1 shl (nr and 31)))
+
+proc hci_clear_bit*(nr: cint; `addr`: pointer) {.inline, cdecl.} =
+ cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[] =
+ uint32(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) and not (1 shl (nr and 31)))
+
+proc hci_test_bit*(nr: cint; `addr`: pointer): cint {.inline, cdecl.} =
+ return cint(int(cast[ptr uint32](cast[int](`addr`) + (nr shr 5))[]) and (1 shl (nr and 31)))
+
+# HCI filter tools
+
+proc hci_filter_clear*(f: ptr hci_filter) {.inline, cdecl.} =
+ zeroMem(f, sizeof((f[])))
+
+proc hci_filter_set_ptype*(t: cint; f: ptr hci_filter) {.inline, cdecl.} =
+ hci_set_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and HCI_FLT_TYPE_BITS),
+ addr(f.type_mask))
+
+proc hci_filter_clear_ptype*(t: cint; f: ptr hci_filter) {.inline, cdecl.} =
+ hci_clear_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and HCI_FLT_TYPE_BITS),
+ addr(f.type_mask))
+
+proc hci_filter_test_ptype*(t: cint; f: ptr hci_filter): cint {.inline, cdecl.} =
+ return hci_test_bit(if (t == HCI_VENDOR_PKT): 0 else: (t and
+ HCI_FLT_TYPE_BITS), addr(f.type_mask))
+
+proc hci_filter_all_ptypes*(f: ptr hci_filter) {.inline, cdecl.} =
+ f.type_mask = 0x000000FF
+
+proc hci_filter_set_event*(e: cint; f: ptr hci_filter) {.inline, cdecl.} =
+ hci_set_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask))
+
+proc hci_filter_clear_event*(e: cint; f: ptr hci_filter) {.inline, cdecl.} =
+ hci_clear_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask))
+
+proc hci_filter_test_event*(e: cint; f: ptr hci_filter): cint {.inline, cdecl.} =
+ return hci_test_bit((e and HCI_FLT_EVENT_BITS), addr(f.event_mask))
+
+proc hci_filter_all_events*(f: ptr hci_filter) {.inline, cdecl.} =
+ for i in low(f.event_mask)..high(f.event_mask):
+ f.event_mask[i] = 0x000000FF
+
+proc hci_filter_set_opcode*(opcode: uint16; f: ptr hci_filter) {.inline, cdecl.} =
+ f.opcode = opcode
+
+proc hci_filter_clear_opcode*(f: ptr hci_filter) {.inline, cdecl.} =
+ f.opcode = 0
+
+proc hci_filter_test_opcode*(opcode: uint16; f: ptr hci_filter): bool {.inline,
+ cdecl.} =
+ return int16(f.opcode) == int16(opcode)
diff --git a/nimbluez/bluez/bz_l2cap.nim b/nimbluez/bluez/bz_l2cap.nim
new file mode 100644
index 0000000..a819b13
--- /dev/null
+++ b/nimbluez/bluez/bz_l2cap.nim
@@ -0,0 +1,344 @@
+#
+#
+# BlueZ - Bluetooth protocol stack for Linux
+#
+# Copyright (C) 2000-2001 Qualcomm Incorporated
+# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
+# Copyright (c) 2012 Code Aurora Forum. All rights reserved.
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+
+{.deadCodeElim: on.}
+
+import bz_bluetooth
+
+# L2CAP defaults
+
+const
+ L2CAP_DEFAULT_MTU* = 672
+ L2CAP_DEFAULT_FLUSH_TO* = 0x0000FFFF
+
+# L2CAP socket address
+
+type
+ sockaddr_l2* = object
+ l2_family*: cushort
+ l2_psm*: cushort
+ l2_bdaddr*: bdaddr_t
+ l2_cid*: cushort
+ l2_bdaddr_type*: uint8
+
+
+# L2CAP socket options
+
+const
+ L2CAP_OPTIONS* = 0x00000001
+
+type
+ l2cap_options* = object
+ omtu*: uint16
+ imtu*: uint16
+ flush_to*: uint16
+ mode*: uint8
+ fcs*: uint8
+ max_tx*: uint8
+ txwin_size*: uint16
+
+
+const
+ L2CAP_CONNINFO* = 0x00000002
+
+type
+ l2cap_conninfo* = object
+ hci_handle*: uint16
+ dev_class*: array[3, uint8]
+
+
+const
+ L2CAP_LM* = 0x00000003
+ L2CAP_LM_MASTER* = 0x00000001
+ L2CAP_LM_AUTH* = 0x00000002
+ L2CAP_LM_ENCRYPT* = 0x00000004
+ L2CAP_LM_TRUSTED* = 0x00000008
+ L2CAP_LM_RELIABLE* = 0x00000010
+ L2CAP_LM_SECURE* = 0x00000020
+
+# L2CAP command codes
+
+const
+ L2CAP_COMMAND_REJ* = 0x00000001
+ L2CAP_CONN_REQ* = 0x00000002
+ L2CAP_CONN_RSP* = 0x00000003
+ L2CAP_CONF_REQ* = 0x00000004
+ L2CAP_CONF_RSP* = 0x00000005
+ L2CAP_DISCONN_REQ* = 0x00000006
+ L2CAP_DISCONN_RSP* = 0x00000007
+ L2CAP_ECHO_REQ* = 0x00000008
+ L2CAP_ECHO_RSP* = 0x00000009
+ L2CAP_INFO_REQ* = 0x0000000A
+ L2CAP_INFO_RSP* = 0x0000000B
+ L2CAP_CREATE_REQ* = 0x0000000C
+ L2CAP_CREATE_RSP* = 0x0000000D
+ L2CAP_MOVE_REQ* = 0x0000000E
+ L2CAP_MOVE_RSP* = 0x0000000F
+ L2CAP_MOVE_CFM* = 0x00000010
+ L2CAP_MOVE_CFM_RSP* = 0x00000011
+
+# L2CAP extended feature mask
+
+const
+ L2CAP_FEAT_FLOWCTL* = 0x00000001
+ L2CAP_FEAT_RETRANS* = 0x00000002
+ L2CAP_FEAT_BIDIR_QOS* = 0x00000004
+ L2CAP_FEAT_ERTM* = 0x00000008
+ L2CAP_FEAT_STREAMING* = 0x00000010
+ L2CAP_FEAT_FCS* = 0x00000020
+ L2CAP_FEAT_EXT_FLOW* = 0x00000040
+ L2CAP_FEAT_FIXED_CHAN* = 0x00000080
+ L2CAP_FEAT_EXT_WINDOW* = 0x00000100
+ L2CAP_FEAT_UCD* = 0x00000200
+
+# L2CAP fixed channels
+
+const
+ L2CAP_FC_L2CAP* = 0x00000002
+ L2CAP_FC_CONNLESS* = 0x00000004
+ L2CAP_FC_A2MP* = 0x00000008
+
+# L2CAP structures
+
+type
+ l2cap_hdr* = object {.packed.}
+ len*: uint16
+ cid*: uint16
+
+
+const
+ L2CAP_HDR_SIZE* = 4
+
+type
+ l2cap_cmd_hdr* = object {.packed.}
+ code*: uint8
+ ident*: uint8
+ len*: uint16
+
+
+const
+ L2CAP_CMD_HDR_SIZE* = 4
+
+type
+ l2cap_cmd_rej* = object {.packed.}
+ reason*: uint16
+
+
+const
+ L2CAP_CMD_REJ_SIZE* = 2
+
+type
+ l2cap_conn_req* = object {.packed.}
+ psm*: uint16
+ scid*: uint16
+
+
+const
+ L2CAP_CONN_REQ_SIZE* = 4
+
+type
+ l2cap_conn_rsp* = object {.packed.}
+ dcid*: uint16
+ scid*: uint16
+ result*: uint16
+ status*: uint16
+
+
+const
+ L2CAP_CONN_RSP_SIZE* = 8
+
+# connect result
+
+const
+ L2CAP_CR_SUCCESS* = 0x00000000
+ L2CAP_CR_PEND* = 0x00000001
+ L2CAP_CR_BAD_PSM* = 0x00000002
+ L2CAP_CR_SEC_BLOCK* = 0x00000003
+ L2CAP_CR_NO_MEM* = 0x00000004
+
+# connect status
+
+const
+ L2CAP_CS_NO_INFO* = 0x00000000
+ L2CAP_CS_AUTHEN_PEND* = 0x00000001
+ L2CAP_CS_AUTHOR_PEND* = 0x00000002
+
+type
+ l2cap_conf_req* = object {.packed.}
+ dcid*: uint16
+ flags*: uint16
+ data*: array[0, uint8]
+
+
+const
+ L2CAP_CONF_REQ_SIZE* = 4
+
+type
+ l2cap_conf_rsp* = object {.packed.}
+ scid*: uint16
+ flags*: uint16
+ result*: uint16
+ data*: array[0, uint8]
+
+
+const
+ L2CAP_CONF_RSP_SIZE* = 6
+ L2CAP_CONF_SUCCESS* = 0x00000000
+ L2CAP_CONF_UNACCEPT* = 0x00000001
+ L2CAP_CONF_REJECT* = 0x00000002
+ L2CAP_CONF_UNKNOWN* = 0x00000003
+ L2CAP_CONF_PENDING* = 0x00000004
+ L2CAP_CONF_EFS_REJECT* = 0x00000005
+
+type
+ l2cap_conf_opt* = object {.packed.}
+ `type`*: uint8
+ len*: uint8
+ val*: array[0, uint8]
+
+
+const
+ L2CAP_CONF_OPT_SIZE* = 2
+ L2CAP_CONF_MTU* = 0x00000001
+ L2CAP_CONF_FLUSH_TO* = 0x00000002
+ L2CAP_CONF_QOS* = 0x00000003
+ L2CAP_CONF_RFC* = 0x00000004
+ L2CAP_CONF_FCS* = 0x00000005
+ L2CAP_CONF_EFS* = 0x00000006
+ L2CAP_CONF_EWS* = 0x00000007
+ L2CAP_CONF_MAX_SIZE* = 22
+ L2CAP_MODE_BASIC* = 0x00000000
+ L2CAP_MODE_RETRANS* = 0x00000001
+ L2CAP_MODE_FLOWCTL* = 0x00000002
+ L2CAP_MODE_ERTM* = 0x00000003
+ L2CAP_MODE_STREAMING* = 0x00000004
+ L2CAP_SERVTYPE_NOTRAFFIC* = 0x00000000
+ L2CAP_SERVTYPE_BESTEFFORT* = 0x00000001
+ L2CAP_SERVTYPE_GUARANTEED* = 0x00000002
+
+type
+ l2cap_disconn_req* = object {.packed.}
+ dcid*: uint16
+ scid*: uint16
+
+
+const
+ L2CAP_DISCONN_REQ_SIZE* = 4
+
+type
+ l2cap_disconn_rsp* = object {.packed.}
+ dcid*: uint16
+ scid*: uint16
+
+
+const
+ L2CAP_DISCONN_RSP_SIZE* = 4
+
+type
+ l2cap_info_req* = object {.packed.}
+ `type`*: uint16
+
+
+const
+ L2CAP_INFO_REQ_SIZE* = 2
+
+type
+ l2cap_info_rsp* = object {.packed.}
+ `type`*: uint16
+ result*: uint16
+ data*: array[0, uint8]
+
+
+const
+ L2CAP_INFO_RSP_SIZE* = 4
+
+# info type
+
+const
+ L2CAP_IT_CL_MTU* = 0x00000001
+ L2CAP_IT_FEAT_MASK* = 0x00000002
+
+# info result
+
+const
+ L2CAP_IR_SUCCESS* = 0x00000000
+ L2CAP_IR_NOTSUPP* = 0x00000001
+
+type
+ l2cap_create_req* = object {.packed.}
+ psm*: uint16
+ scid*: uint16
+ id*: uint8
+
+
+const
+ L2CAP_CREATE_REQ_SIZE* = 5
+
+type
+ l2cap_create_rsp* = object {.packed.}
+ dcid*: uint16
+ scid*: uint16
+ result*: uint16
+ status*: uint16
+
+
+const
+ L2CAP_CREATE_RSP_SIZE* = 8
+
+type
+ l2cap_move_req* = object {.packed.}
+ icid*: uint16
+ id*: uint8
+
+
+const
+ L2CAP_MOVE_REQ_SIZE* = 3
+
+type
+ l2cap_move_rsp* = object {.packed.}
+ icid*: uint16
+ result*: uint16
+
+
+const
+ L2CAP_MOVE_RSP_SIZE* = 4
+
+type
+ l2cap_move_cfm* = object {.packed.}
+ icid*: uint16
+ result*: uint16
+
+
+const
+ L2CAP_MOVE_CFM_SIZE* = 4
+
+type
+ l2cap_move_cfm_rsp* = object {.packed.}
+ icid*: uint16
+
+
+const
+ L2CAP_MOVE_CFM_RSP_SIZE* = 2
diff --git a/nimbluez/bluez/bz_rfcomm.nim b/nimbluez/bluez/bz_rfcomm.nim
new file mode 100644
index 0000000..38984ba
--- /dev/null
+++ b/nimbluez/bluez/bz_rfcomm.nim
@@ -0,0 +1,100 @@
+#
+#
+# BlueZ - Bluetooth protocol stack for Linux
+#
+# Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
+# Copyright (C) 2002-2010 Marcel Holtmann <marcel@holtmann.org>
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+#
+
+{.deadCodeElim: on.}
+
+import ioctl, bz_bluetooth
+
+# RFCOMM defaults
+
+const
+ RFCOMM_DEFAULT_MTU* = 127
+ RFCOMM_PSM* = 3
+
+# RFCOMM socket address
+
+type
+ sockaddr_rc* = object
+ rc_family*: uint16
+ rc_bdaddr*: bdaddr_t
+ rc_channel*: uint8
+
+
+# RFCOMM socket options
+
+const
+ RFCOMM_CONNINFO* = 0x00000002
+
+type
+ rfcomm_conninfo* = object
+ hci_handle*: uint16
+ dev_class*: array[3, uint8]
+
+
+const
+ RFCOMM_LM* = 0x00000003
+ RFCOMM_LM_MASTER* = 0x00000001
+ RFCOMM_LM_AUTH* = 0x00000002
+ RFCOMM_LM_ENCRYPT* = 0x00000004
+ RFCOMM_LM_TRUSTED* = 0x00000008
+ RFCOMM_LM_RELIABLE* = 0x00000010
+ RFCOMM_LM_SECURE* = 0x00000020
+
+# RFCOMM TTY support
+
+const
+ RFCOMM_MAX_DEV* = 256
+ RFCOMMCREATEDEV* = IOW(ord('R'), 200, int)
+ RFCOMMRELEASEDEV* = IOW(ord('R'), 201, int)
+ RFCOMMGETDEVLIST* = IOR(ord('R'), 210, int)
+ RFCOMMGETDEVINFO* = IOR(ord('R'), 211, int)
+
+type
+ rfcomm_dev_req* = object
+ dev_id*: int16
+ flags*: uint32
+ src*: bdaddr_t
+ dst*: bdaddr_t
+ channel*: uint8
+
+
+const
+ RFCOMM_REUSE_DLC* = 0
+ RFCOMM_RELEASE_ONHUP* = 1
+ RFCOMM_HANGUP_NOW* = 2
+ RFCOMM_TTY_ATTACHED* = 3
+
+type
+ rfcomm_dev_info* = object
+ id*: int16
+ flags*: uint32
+ state*: uint16
+ src*: bdaddr_t
+ dst*: bdaddr_t
+ channel*: uint8
+
+ rfcomm_dev_list_req* = object
+ dev_num*: uint16
+ dev_info*: array[0, rfcomm_dev_info]
+
diff --git a/nimbluez/bluez/ioctl.nim b/nimbluez/bluez/ioctl.nim
new file mode 100644
index 0000000..dc57ae6
--- /dev/null
+++ b/nimbluez/bluez/ioctl.nim
@@ -0,0 +1,110 @@
+# ioctl command encoding: 32 bits total, command in lower 16 bits,
+# size of the parameter structure in the lower 14 bits of the
+# upper 16 bits.
+# Encoding the size of the parameter structure in the ioctl request
+# is useful for catching programs compiled with old versions
+# and to avoid overwriting user space outside the user buffer area.
+# The highest 2 bits are reserved for indicating the ``access mode''.
+# NOTE: This limits the max parameter size to 16kB -1 !
+#
+#
+# The following is for compatibility across the various Linux
+# platforms. The generic ioctl numbering scheme doesn't really enforce
+# a type field. De facto, however, the top 8 bits of the lower 16
+# bits are indeed used as a type field, so we might just as well make
+# this explicit here. Please be sure to use the decoding macros
+# below from now on.
+#
+
+{.deadCodeElim: on.}
+
+const
+ IOC_NRBITS* = 8
+ IOC_TYPEBITS* = 8
+
+#
+# Let any architecture override either of the following before
+# including this file.
+#
+
+const
+ IOC_SIZEBITS* = 14
+ IOC_DIRBITS* = 2
+
+const
+ IOC_NRMASK* = ((1 shl IOC_NRBITS) - 1)
+ IOC_TYPEMASK* = ((1 shl IOC_TYPEBITS) - 1)
+ IOC_SIZEMASK* = ((1 shl IOC_SIZEBITS) - 1)
+ IOC_DIRMASK* = ((1 shl IOC_DIRBITS) - 1)
+ IOC_NRSHIFT* = 0
+ IOC_TYPESHIFT* = (IOC_NRSHIFT + IOC_NRBITS)
+ IOC_SIZESHIFT* = (IOC_TYPESHIFT + IOC_TYPEBITS)
+ IOC_DIRSHIFT* = (IOC_SIZESHIFT + IOC_SIZEBITS)
+
+#
+# Direction bits, which any architecture can choose to override
+# before including this file.
+#
+
+const
+ IOC_NONE* = 0
+ IOC_WRITE* = 1
+ IOC_READ* = 2
+
+template IOC_TYPECHECK*(t: expr): expr =
+ (sizeof((t)))
+
+# used to create numbers
+
+template IO*(`type`, nr: expr): expr =
+ (((IOC_NONE) shl IOC_DIRSHIFT) or (((`type`)) shl IOC_TYPESHIFT) or
+ (((nr)) shl IOC_NRSHIFT) or ((0) shl IOC_SIZESHIFT))
+
+template IOR*(`type`, nr, size: expr): expr =
+ (((IOC_READ) shl IOC_DIRSHIFT) or (((`type`)) shl IOC_TYPESHIFT) or
+ (((nr)) shl IOC_NRSHIFT) or (((IOC_TYPECHECK(size))) shl IOC_SIZESHIFT))
+
+template IOW*(`type`, nr, size: expr): expr =
+ (((IOC_WRITE) shl IOC_DIRSHIFT) or (((`type`)) shl IOC_TYPESHIFT) or
+ (((nr)) shl IOC_NRSHIFT) or (((IOC_TYPECHECK(size))) shl IOC_SIZESHIFT))
+
+template IOWR*(`type`, nr, size: expr): expr =
+ (((IOC_READ or IOC_WRITE) shl IOC_DIRSHIFT) or
+ (((`type`)) shl IOC_TYPESHIFT) or (((nr)) shl IOC_NRSHIFT) or
+ (((IOC_TYPECHECK(size))) shl IOC_SIZESHIFT))
+
+template IOR_BAD*(`type`, nr, size: expr): expr =
+ (((IOC_READ) shl IOC_DIRSHIFT) or (((`type`)) shl IOC_TYPESHIFT) or
+ (((nr)) shl IOC_NRSHIFT) or ((sizeof((size))) shl IOC_SIZESHIFT))
+
+template IOW_BAD*(`type`, nr, size: expr): expr =
+ (((IOC_WRITE) shl IOC_DIRSHIFT) or (((`type`)) shl IOC_TYPESHIFT) or
+ (((nr)) shl IOC_NRSHIFT) or ((sizeof((size))) shl IOC_SIZESHIFT))
+
+template IOWR_BAD*(`type`, nr, size: expr): expr =
+ (((IOC_READ or IOC_WRITE) shl IOC_DIRSHIFT) or
+ (((`type`)) shl IOC_TYPESHIFT) or (((nr)) shl IOC_NRSHIFT) or
+ ((sizeof((size))) shl IOC_SIZESHIFT))
+
+# used to decode ioctl numbers..
+
+template IOC_DIR*(nr: expr): expr =
+ (((nr) shr IOC_DIRSHIFT) and IOC_DIRMASK)
+
+template IOC_TYPE*(nr: expr): expr =
+ (((nr) shr IOC_TYPESHIFT) and IOC_TYPEMASK)
+
+template IOC_NR*(nr: expr): expr =
+ (((nr) shr IOC_NRSHIFT) and IOC_NRMASK)
+
+template IOC_SIZE*(nr: expr): expr =
+ (((nr) shr IOC_SIZESHIFT) and IOC_SIZEMASK)
+
+# ...and for the drivers/sound files...
+
+const
+ IOC_IN* = (IOC_WRITE shl IOC_DIRSHIFT)
+ IOC_OUT* = (IOC_READ shl IOC_DIRSHIFT)
+ IOC_INOUT* = ((IOC_WRITE or IOC_READ) shl IOC_DIRSHIFT)
+ IOCSIZE_MASK_S* = (IOC_SIZEMASK shl IOC_SIZESHIFT)
+ IOCSIZE_SHIFT_S* = (IOC_SIZESHIFT)