blob: 1a3db54d5a72e06310c580d2fcdf6df0c016b580 [file] [log] [blame]
little_endian_packets
custom_field Address : 48 "hci/"
custom_field ClassOfDevice : 24 "hci/"
enum Enable : 8 {
DISABLED = 0x00,
ENABLED = 0x01,
}
// https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile
enum GapDataType : 8 {
INVALID = 0x00,
FLAGS = 0x01,
INCOMPLETE_LIST_16_BIT_UUIDS = 0x02,
COMPLETE_LIST_16_BIT_UUIDS = 0x03,
INCOMPLETE_LIST_32_BIT_UUIDS = 0x04,
COMPLETE_LIST_32_BIT_UUIDS = 0x05,
INCOMPLETE_LIST_128_BIT_UUIDS = 0x06,
COMPLETE_LIST_128_BIT_UUIDS = 0x07,
SHORTENED_LOCAL_NAME = 0x08,
COMPLETE_LOCAL_NAME = 0x09,
TX_POWER_LEVEL = 0x0A,
CLASS_OF_DEVICE = 0x0D,
SERVICE_DATA_16_BIT_UUIDS = 0x16,
APPEARANCE = 0x19,
SERVICE_DATA_32_BIT_UUIDS = 0x20,
SERVICE_DATA_128_BIT_UUIDS = 0x21,
MANUFACTURER_SPECIFIC_DATA = 0xFF,
}
struct GapData {
_size_(data) : 8, // Including one byte for data_type
data_type : GapDataType,
data : 8[+1*8],
}
// HCI ACL Packets
enum PacketBoundaryFlag : 2 {
FIRST_NON_AUTOMATICALLY_FLUSHABLE = 0,
CONTINUING_FRAGMENT = 1,
FIRST_AUTOMATICALLY_FLUSHABLE = 2,
}
enum BroadcastFlag : 2 {
POINT_TO_POINT = 0,
ACTIVE_SLAVE_BROADCAST = 1,
}
packet AclPacket {
handle : 12,
packet_boundary_flag : PacketBoundaryFlag,
broadcast_flag : BroadcastFlag,
_size_(_payload_) : 16,
_payload_,
}
// HCI SCO Packets
enum PacketStatusFlag : 2 {
CORRECTLY_RECEIVED = 0,
POSSIBLY_INCOMPLETE = 1,
NO_DATA = 2,
PARTIALLY_LOST = 3,
}
packet ScoPacket {
handle : 12,
packet_status_flag : PacketStatusFlag,
_reserved_ : 2, // BroadcastFlag
_size_(data) : 8,
data : 8[],
}
// HCI Command Packets
enum OpCode : 16 {
NONE = 0x0000,
// LINK_CONTROL
INQUIRY = 0x0401,
INQUIRY_CANCEL = 0x0402,
PERIODIC_INQUIRY_MODE = 0x0403,
EXIT_PERIODIC_INQUIRY_MODE = 0x0404,
CREATE_CONNECTION = 0x0405,
DISCONNECT = 0x0406,
CREATE_CONNECTION_CANCEL = 0x0408,
ACCEPT_CONNECTION_REQUEST = 0x0409,
REJECT_CONNECTION_REQUEST = 0x040A,
LINK_KEY_REQUEST_REPLY = 0x040B,
LINK_KEY_REQUEST_NEGATIVE_REPLY = 0x040C,
PIN_CODE_REQUEST_REPLY = 0x040D,
PIN_CODE_REQUEST_NEGATIVE_REPLY = 0x040E,
CHANGE_CONNECTION_PACKET_TYPE = 0x040F,
AUTHENTICATION_REQUESTED = 0x0411,
SET_CONNECTION_ENCRYPTION = 0x0413,
CHANGE_CONNECTION_LINK_KEY = 0x0415,
MASTER_LINK_KEY = 0x0417,
REMOTE_NAME_REQUEST = 0x0419,
REMOTE_NAME_REQUEST_CANCEL = 0x041A,
READ_REMOTE_SUPPORTED_FEATURES = 0x041B,
READ_REMOTE_EXTENDED_FEATURES = 0x041C,
READ_REMOTE_VERSION_INFORMATION = 0x041D,
READ_CLOCK_OFFSET = 0x041F,
READ_LMP_HANDLE = 0x0420,
SETUP_SYNCHRONOUS_CONNECTION = 0x0428,
ACCEPT_SYNCHRONOUS_CONNECTION = 0x0429,
REJECT_SYNCHRONOUS_CONNECTION = 0x042A,
IO_CAPABILITY_REQUEST_REPLY = 0x042B,
USER_CONFIRMATION_REQUEST_REPLY = 0x042C,
USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY = 0x042D,
USER_PASSKEY_REQUEST_REPLY = 0x042E,
USER_PASSKEY_REQUEST_NEGATIVE_REPLY = 0x042F,
REMOTE_OOB_DATA_REQUEST_REPLY = 0x0430,
REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY = 0x0433,
IO_CAPABILITY_REQUEST_NEGATIVE_REPLY = 0x0434,
ENHANCED_SETUP_SYNCHRONOUS_CONNECTION = 0x043D,
ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION = 0x043E,
// LINK_POLICY
HOLD_MODE = 0x0801,
SNIFF_MODE = 0x0803,
EXIT_SNIFF_MODE = 0x0804,
QOS_SETUP = 0x0807,
ROLE_DISCOVERY = 0x0809,
SWITCH_ROLE = 0x080B,
READ_LINK_POLICY_SETTINGS = 0x080C,
WRITE_LINK_POLICY_SETTINGS = 0x080D,
READ_DEFAULT_LINK_POLICY_SETTINGS = 0x080E,
WRITE_DEFAULT_LINK_POLICY_SETTINGS = 0x080F,
FLOW_SPECIFICATION = 0x0810,
SNIFF_SUBRATING = 0x0811,
// CONTROLLER_AND_BASEBAND
SET_EVENT_MASK = 0x0C01,
RESET = 0x0C03,
SET_EVENT_FILTER = 0x0C05,
FLUSH = 0x0C08,
READ_PIN_TYPE = 0x0C09,
WRITE_PIN_TYPE = 0x0C0A,
CREATE_NEW_UNIT_KEY = 0x0C0B,
READ_STORED_LINK_KEY = 0x0C0D,
WRITE_STORED_LINK_KEY = 0x0C11,
DELETE_STORED_LINK_KEY = 0x0C12,
WRITE_LOCAL_NAME = 0x0C13,
READ_LOCAL_NAME = 0x0C14,
READ_CONNECTION_ACCEPT_TIMEOUT = 0x0C15,
WRITE_CONNECTION_ACCEPT_TIMEOUT = 0x0C16,
READ_PAGE_TIMEOUT = 0x0C17,
WRITE_PAGE_TIMEOUT = 0x0C18,
READ_SCAN_ENABLE = 0x0C19,
WRITE_SCAN_ENABLE = 0x0C1A,
READ_PAGE_SCAN_ACTIVITY = 0x0C1B,
WRITE_PAGE_SCAN_ACTIVITY = 0x0C1C,
READ_INQUIRY_SCAN_ACTIVITY = 0x0C1D,
WRITE_INQUIRY_SCAN_ACTIVITY = 0x0C1E,
READ_AUTHENTICATION_ENABLE = 0x0C1F,
WRITE_AUTHENTICATION_ENABLE = 0x0C20,
READ_CLASS_OF_DEVICE = 0x0C23,
WRITE_CLASS_OF_DEVICE = 0x0C24,
READ_VOICE_SETTING = 0x0C25,
WRITE_VOICE_SETTING = 0x0C26,
READ_AUTOMATIC_FLUSH_TIMEOUT = 0x0C27,
WRITE_AUTOMATIC_FLUSH_TIMEOUT = 0x0C28,
READ_NUM_BROADCAST_RETRANSMITS = 0x0C29,
WRITE_NUM_BROADCAST_RETRANSMITS = 0x0C2A,
READ_HOLD_MODE_ACTIVITY = 0x0C2B,
WRITE_HOLD_MODE_ACTIVITY = 0x0C2C,
READ_TRANSMIT_POWER_LEVEL = 0x0C2D,
READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 0x0C2E,
WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 0x0C2F,
SET_CONTROLLER_TO_HOST_FLOW_CONTROL = 0x0C31,
HOST_BUFFER_SIZE = 0x0C33,
HOST_NUM_COMPLETED_PACKETS = 0x0C35,
READ_LINK_SUPERVISION_TIMEOUT = 0x0C36,
WRITE_LINK_SUPERVISION_TIMEOUT = 0x0C37,
READ_NUMBER_OF_SUPPORTED_IAC = 0x0C38,
READ_CURRENT_IAC_LAP = 0x0C39,
WRITE_CURRENT_IAC_LAP = 0x0C3A,
SET_AFH_HOST_CHANNEL_CLASSIFICATION = 0x0C3F,
READ_INQUIRY_SCAN_TYPE = 0x0C42,
WRITE_INQUIRY_SCAN_TYPE = 0x0C43,
READ_INQUIRY_MODE = 0x0C44,
WRITE_INQUIRY_MODE = 0x0C45,
READ_PAGE_SCAN_TYPE = 0x0C46,
WRITE_PAGE_SCAN_TYPE = 0x0C47,
READ_AFH_CHANNEL_ASSESSMENT_MODE = 0x0C48,
WRITE_AFH_CHANNEL_ASSESSMENT_MODE = 0x0C49,
READ_EXTENDED_INQUIRY_RESPONSE = 0x0C51,
WRITE_EXTENDED_INQUIRY_RESPONSE = 0x0C52,
REFRESH_ENCRYPTION_KEY = 0x0C53,
READ_SIMPLE_PAIRING_MODE = 0x0C55,
WRITE_SIMPLE_PAIRING_MODE = 0x0C56,
READ_LOCAL_OOB_DATA = 0x0C57,
READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL = 0x0C58,
WRITE_INQUIRY_TRANSMIT_POWER_LEVEL = 0x0C59,
SEND_KEYPRESS_NOTIFICATION = 0x0C60,
READ_LE_HOST_SUPPORT = 0x0C6C,
WRITE_LE_HOST_SUPPORT = 0x0C6D,
READ_SECURE_CONNECTIONS_HOST_SUPPORT = 0x0C79,
WRITE_SECURE_CONNECTIONS_HOST_SUPPORT = 0x0C7A,
READ_LOCAL_OOB_EXTENDED_DATA = 0x0C7D,
// INFORMATIONAL_PARAMETERS
READ_LOCAL_VERSION_INFORMATION = 0x1001,
READ_LOCAL_SUPPORTED_COMMANDS = 0x1002,
READ_LOCAL_SUPPORTED_FEATURES = 0x1003,
READ_LOCAL_EXTENDED_FEATURES = 0x1004,
READ_BUFFER_SIZE = 0x1005,
READ_BD_ADDR = 0x1009,
READ_DATA_BLOCK_SIZE = 0x100A,
READ_LOCAL_SUPPORTED_CODECS = 0x100B,
// STATUS_PARAMETERS
READ_FAILED_CONTACT_COUNTER = 0x1401,
RESET_FAILED_CONTACT_COUNTER = 0x1402,
READ_LINK_QUALITY = 0x1403,
READ_RSSI = 0x1405,
READ_AFH_CHANNEL_MAP = 0x1406,
READ_CLOCK = 0x1407,
READ_ENCRYPTION_KEY_SIZE = 0x1408,
// TESTING
READ_LOOPBACK_MODE = 0x1801,
WRITE_LOOPBACK_MODE = 0x1802,
ENABLE_DEVICE_UNDER_TEST_MODE = 0x1803,
WRITE_SIMPLE_PAIRING_DEBUG_MODE = 0x1804,
WRITE_SECURE_CONNECTIONS_TEST_MODE = 0x180A,
// LE_CONTROLLER
LE_SET_EVENT_MASK = 0x2001,
LE_READ_BUFFER_SIZE = 0x2002,
LE_READ_LOCAL_SUPPORTED_FEATURES = 0x2003,
LE_SET_RANDOM_ADDRESS = 0x2005,
LE_SET_ADVERTISING_PARAMETERS = 0x2006,
LE_READ_ADVERTISING_CHANNEL_TX_POWER = 0x2007,
LE_SET_ADVERTISING_DATA = 0x2008,
LE_SET_SCAN_RESPONSE_DATA = 0x2009,
LE_SET_ADVERTISING_ENABLE = 0x200A,
LE_SET_SCAN_PARAMETERS = 0x200B,
LE_SET_SCAN_ENABLE = 0x200C,
LE_CREATE_CONNECTION = 0x200D,
LE_CREATE_CONNECTION_CANCEL = 0x200E,
LE_READ_WHITE_LIST_SIZE = 0x200F,
LE_CLEAR_WHITE_LIST = 0x2010,
LE_ADD_DEVICE_TO_WHITE_LIST = 0x2011,
LE_REMOVE_DEVICE_FROM_WHITE_LIST = 0x2012,
LE_CONNECTION_UPDATE = 0x2013,
LE_SET_HOST_CHANNEL_CLASSIFICATION = 0x2014,
LE_READ_CHANNEL_MAP = 0x2015,
LE_READ_REMOTE_FEATURES = 0x2016,
LE_ENCRYPT = 0x2017,
LE_RAND = 0x2018,
LE_START_ENCRYPTION = 0x2019,
LE_LONG_TERM_KEY_REQUEST_REPLY = 0x201A,
LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY = 0x201B,
LE_READ_SUPPORTED_STATES = 0x201C,
LE_RECEIVER_TEST = 0x201D,
LE_TRANSMITTER_TEST = 0x201E,
LE_TEST_END = 0x201F,
LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY = 0x2020,
LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY = 0x2021,
LE_SET_DATA_LENGTH = 0x2022,
LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH = 0x2023,
LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH = 0x2024,
LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND = 0x2025,
LE_GENERATE_DHKEY_COMMAND_V1 = 0x2026,
LE_ADD_DEVICE_TO_RESOLVING_LIST = 0x2027,
LE_REMOVE_DEVICE_FROM_RESOLVING_LIST = 0x2028,
LE_CLEAR_RESOLVING_LIST = 0x2029,
LE_READ_RESOLVING_LIST_SIZE = 0x202A,
LE_READ_PEER_RESOLVABLE_ADDRESS = 0x202B,
LE_READ_LOCAL_RESOLVABLE_ADDRESS = 0x202C,
LE_SET_ADDRESS_RESOLUTION_ENABLE = 0x202D,
LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT = 0x202E,
LE_READ_MAXIMUM_DATA_LENGTH = 0x202F,
LE_READ_PHY = 0x2030,
LE_SET_DEFAULT_PHY = 0x2031,
LE_SET_PHY = 0x2032,
LE_ENHANCED_RECEIVER_TEST = 0x2033,
LE_ENHANCED_TRANSMITTER_TEST = 0x2034,
LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS = 0x2035,
LE_SET_EXTENDED_ADVERTISING_PARAMETERS = 0x2036,
LE_SET_EXTENDED_ADVERTISING_DATA = 0x2037,
LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE = 0x2038,
LE_SET_EXTENDED_ADVERTISING_ENABLE = 0x2039,
LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH = 0x203A,
LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 0x203B,
LE_REMOVE_ADVERTISING_SET = 0x203C,
LE_CLEAR_ADVERTISING_SETS = 0x203D,
LE_SET_PERIODIC_ADVERTISING_PARAM = 0x203E,
LE_SET_PERIODIC_ADVERTISING_DATA = 0x203F,
LE_SET_PERIODIC_ADVERTISING_ENABLE = 0x2040,
LE_SET_EXTENDED_SCAN_PARAMETERS = 0x2041,
LE_SET_EXTENDED_SCAN_ENABLE = 0x2042,
LE_EXTENDED_CREATE_CONNECTION = 0x2043,
LE_PERIODIC_ADVERTISING_CREATE_SYNC = 0x2044,
LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL = 0x2045,
LE_PERIODIC_ADVERTISING_TERMINATE_SYNC = 0x2046,
LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST = 0x2047,
LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST = 0x2048,
LE_CLEAR_PERIODIC_ADVERTISING_LIST = 0x2049,
LE_READ_PERIODIC_ADVERTISING_LIST_SIZE = 0x204A,
LE_READ_TRANSMIT_POWER = 0x204B,
LE_READ_RF_PATH_COMPENSATION_POWER = 0x204C,
LE_WRITE_RF_PATH_COMPENSATION_POWER = 0x204D,
LE_SET_PRIVACY_MODE = 0x204E,
LE_GENERATE_DHKEY_COMMAND = 0x205E,
// VENDOR_SPECIFIC
LE_GET_VENDOR_CAPABILITIES = 0xFD53,
LE_MULTI_ADVT = 0xFD54,
LE_BATCH_SCAN = 0xFD56,
LE_ADV_FILTER = 0xFD57,
LE_TRACK_ADV = 0xFD58,
LE_ENERGY_INFO = 0xFD59,
LE_EXTENDED_SCAN_PARAMS = 0xFD5A,
CONTROLLER_DEBUG_INFO = 0xFD5B,
CONTROLLER_A2DP_OPCODE = 0xFD5D,
CONTROLLER_BQR = 0xFD5E,
}
// For mapping Local Supported Commands command
// Value = Octet * 10 + bit
enum OpCodeIndex : 16 {
INQUIRY = 0,
INQUIRY_CANCEL = 1,
PERIODIC_INQUIRY_MODE = 2,
EXIT_PERIODIC_INQUIRY_MODE = 3,
CREATE_CONNECTION = 4,
DISCONNECT = 5,
CREATE_CONNECTION_CANCEL = 7,
ACCEPT_CONNECTION_REQUEST = 10,
REJECT_CONNECTION_REQUEST = 11,
LINK_KEY_REQUEST_REPLY = 12,
LINK_KEY_REQUEST_NEGATIVE_REPLY = 13,
PIN_CODE_REQUEST_REPLY = 14,
PIN_CODE_REQUEST_NEGATIVE_REPLY = 15,
CHANGE_CONNECTION_PACKET_TYPE = 16,
AUTHENTICATION_REQUESTED = 17,
SET_CONNECTION_ENCRYPTION = 20,
CHANGE_CONNECTION_LINK_KEY = 21,
MASTER_LINK_KEY = 22,
REMOTE_NAME_REQUEST = 23,
REMOTE_NAME_REQUEST_CANCEL = 24,
READ_REMOTE_SUPPORTED_FEATURES = 25,
READ_REMOTE_EXTENDED_FEATURES = 26,
READ_REMOTE_VERSION_INFORMATION = 27,
READ_CLOCK_OFFSET = 30,
READ_LMP_HANDLE = 31,
HOLD_MODE = 41,
SNIFF_MODE = 42,
EXIT_SNIFF_MODE = 43,
QOS_SETUP = 46,
ROLE_DISCOVERY = 47,
SWITCH_ROLE = 50,
READ_LINK_POLICY_SETTINGS = 51,
WRITE_LINK_POLICY_SETTINGS = 52,
READ_DEFAULT_LINK_POLICY_SETTINGS = 53,
WRITE_DEFAULT_LINK_POLICY_SETTINGS = 54,
FLOW_SPECIFICATION = 55,
SET_EVENT_MASK = 56,
RESET = 57,
SET_EVENT_FILTER = 60,
FLUSH = 61,
READ_PIN_TYPE = 62,
WRITE_PIN_TYPE = 63,
READ_STORED_LINK_KEY = 65,
WRITE_STORED_LINK_KEY = 66,
DELETE_STORED_LINK_KEY = 67,
WRITE_LOCAL_NAME = 70,
READ_LOCAL_NAME = 71,
READ_CONNECTION_ACCEPT_TIMEOUT = 72,
WRITE_CONNECTION_ACCEPT_TIMEOUT = 73,
READ_PAGE_TIMEOUT = 74,
WRITE_PAGE_TIMEOUT = 75,
READ_SCAN_ENABLE = 76,
WRITE_SCAN_ENABLE = 77,
READ_PAGE_SCAN_ACTIVITY = 80,
WRITE_PAGE_SCAN_ACTIVITY = 81,
READ_INQUIRY_SCAN_ACTIVITY = 82,
WRITE_INQUIRY_SCAN_ACTIVITY = 83,
READ_AUTHENTICATION_ENABLE = 84,
WRITE_AUTHENTICATION_ENABLE = 85,
READ_CLASS_OF_DEVICE = 90,
WRITE_CLASS_OF_DEVICE = 91,
READ_VOICE_SETTING = 92,
WRITE_VOICE_SETTING = 93,
READ_AUTOMATIC_FLUSH_TIMEOUT = 94,
WRITE_AUTOMATIC_FLUSH_TIMEOUT = 95,
READ_NUM_BROADCAST_RETRANSMITS = 96,
WRITE_NUM_BROADCAST_RETRANSMITS = 97,
READ_HOLD_MODE_ACTIVITY = 100,
WRITE_HOLD_MODE_ACTIVITY = 101,
READ_TRANSMIT_POWER_LEVEL = 102,
READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 103,
WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE = 104,
SET_CONTROLLER_TO_HOST_FLOW_CONTROL = 105,
HOST_BUFFER_SIZE = 106,
HOST_NUM_COMPLETED_PACKETS = 107,
READ_LINK_SUPERVISION_TIMEOUT = 110,
WRITE_LINK_SUPERVISION_TIMEOUT = 111,
READ_NUMBER_OF_SUPPORTED_IAC = 112,
READ_CURRENT_IAC_LAP = 113,
WRITE_CURRENT_IAC_LAP = 114,
SET_AFH_HOST_CHANNEL_CLASSIFICATION = 121,
READ_INQUIRY_SCAN_TYPE = 124,
WRITE_INQUIRY_SCAN_TYPE = 125,
READ_INQUIRY_MODE = 126,
WRITE_INQUIRY_MODE = 127,
READ_PAGE_SCAN_TYPE = 130,
WRITE_PAGE_SCAN_TYPE = 131,
READ_AFH_CHANNEL_ASSESSMENT_MODE = 132,
WRITE_AFH_CHANNEL_ASSESSMENT_MODE = 133,
READ_LOCAL_VERSION_INFORMATION = 143,
READ_LOCAL_SUPPORTED_FEATURES = 145,
READ_LOCAL_EXTENDED_FEATURES = 146,
READ_BUFFER_SIZE = 147,
READ_BD_ADDR = 151,
READ_FAILED_CONTACT_COUNTER = 152,
RESET_FAILED_CONTACT_COUNTER = 153,
READ_LINK_QUALITY = 154,
READ_RSSI = 155,
READ_AFH_CHANNEL_MAP = 156,
READ_CLOCK = 157,
READ_LOOPBACK_MODE = 160,
WRITE_LOOPBACK_MODE = 161,
ENABLE_DEVICE_UNDER_TEST_MODE = 162,
SETUP_SYNCHRONOUS_CONNECTION = 163,
ACCEPT_SYNCHRONOUS_CONNECTION = 164,
REJECT_SYNCHRONOUS_CONNECTION = 165,
READ_EXTENDED_INQUIRY_RESPONSE = 170,
WRITE_EXTENDED_INQUIRY_RESPONSE = 171,
REFRESH_ENCRYPTION_KEY = 172,
SNIFF_SUBRATING = 174,
READ_SIMPLE_PAIRING_MODE = 175,
WRITE_SIMPLE_PAIRING_MODE = 176,
READ_LOCAL_OOB_DATA = 177,
READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL = 180,
WRITE_INQUIRY_TRANSMIT_POWER_LEVEL = 181,
IO_CAPABILITY_REQUEST_REPLY = 187,
USER_CONFIRMATION_REQUEST_REPLY = 190,
USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY = 191,
USER_PASSKEY_REQUEST_REPLY = 192,
USER_PASSKEY_REQUEST_NEGATIVE_REPLY = 193,
REMOTE_OOB_DATA_REQUEST_REPLY = 194,
WRITE_SIMPLE_PAIRING_DEBUG_MODE = 195,
REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY = 197,
SEND_KEYPRESS_NOTIFICATION = 202,
IO_CAPABILITY_REQUEST_NEGATIVE_REPLY = 203,
READ_ENCRYPTION_KEY_SIZE = 204,
READ_DATA_BLOCK_SIZE = 232,
READ_LE_HOST_SUPPORT = 245,
WRITE_LE_HOST_SUPPORT = 246,
LE_SET_EVENT_MASK = 250,
LE_READ_BUFFER_SIZE = 251,
LE_READ_LOCAL_SUPPORTED_FEATURES = 252,
LE_SET_RANDOM_ADDRESS = 254,
LE_SET_ADVERTISING_PARAMETERS = 255,
LE_READ_ADVERTISING_CHANNEL_TX_POWER = 256,
LE_SET_ADVERTISING_DATA = 257,
LE_SET_SCAN_RESPONSE_DATA = 260,
LE_SET_ADVERTISING_ENABLE = 261,
LE_SET_SCAN_PARAMETERS = 262,
LE_SET_SCAN_ENABLE = 263,
LE_CREATE_CONNECTION = 264,
LE_CREATE_CONNECTION_CANCEL = 265,
LE_READ_WHITE_LIST_SIZE = 266,
LE_CLEAR_WHITE_LIST = 267,
LE_ADD_DEVICE_TO_WHITE_LIST = 270,
LE_REMOVE_DEVICE_FROM_WHITE_LIST = 271,
LE_CONNECTION_UPDATE = 272,
LE_SET_HOST_CHANNEL_CLASSIFICATION = 273,
LE_READ_CHANNEL_MAP = 274,
LE_READ_REMOTE_FEATURES = 275,
LE_ENCRYPT = 276,
LE_RAND = 277,
LE_START_ENCRYPTION = 280,
LE_LONG_TERM_KEY_REQUEST_REPLY = 281,
LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY = 282,
LE_READ_SUPPORTED_STATES = 283,
LE_RECEIVER_TEST = 284,
LE_TRANSMITTER_TEST = 285,
LE_TEST_END = 286,
ENHANCED_SETUP_SYNCHRONOUS_CONNECTION = 293,
ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION = 294,
READ_LOCAL_SUPPORTED_CODECS = 295,
READ_SECURE_CONNECTIONS_HOST_SUPPORT = 322,
WRITE_SECURE_CONNECTIONS_HOST_SUPPORT = 323,
READ_LOCAL_OOB_EXTENDED_DATA = 326,
WRITE_SECURE_CONNECTIONS_TEST_MODE = 327,
LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY = 334,
LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY = 335,
LE_SET_DATA_LENGTH = 336,
LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH = 337,
LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH = 340,
LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND = 341,
LE_GENERATE_DHKEY_COMMAND_V1 = 342,
LE_ADD_DEVICE_TO_RESOLVING_LIST = 343,
LE_REMOVE_DEVICE_FROM_RESOLVING_LIST = 344,
LE_CLEAR_RESOLVING_LIST = 345,
LE_READ_RESOLVING_LIST_SIZE = 346,
LE_READ_PEER_RESOLVABLE_ADDRESS = 347,
LE_READ_LOCAL_RESOLVABLE_ADDRESS = 350,
LE_SET_ADDRESS_RESOLUTION_ENABLE = 351,
LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT = 352,
LE_READ_MAXIMUM_DATA_LENGTH = 353,
LE_READ_PHY = 354,
LE_SET_DEFAULT_PHY = 355,
LE_SET_PHY = 356,
LE_ENHANCED_RECEIVER_TEST = 357,
LE_ENHANCED_TRANSMITTER_TEST = 360,
LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS = 361,
LE_SET_EXTENDED_ADVERTISING_PARAMETERS = 362,
LE_SET_EXTENDED_ADVERTISING_DATA = 363,
LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE = 364,
LE_SET_EXTENDED_ADVERTISING_ENABLE = 365,
LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH = 366,
LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 367,
LE_REMOVE_ADVERTISING_SET = 370,
LE_CLEAR_ADVERTISING_SETS = 371,
LE_SET_PERIODIC_ADVERTISING_PARAM = 372,
LE_SET_PERIODIC_ADVERTISING_DATA = 373,
LE_SET_PERIODIC_ADVERTISING_ENABLE = 374,
LE_SET_EXTENDED_SCAN_PARAMETERS = 375,
LE_SET_EXTENDED_SCAN_ENABLE = 376,
LE_EXTENDED_CREATE_CONNECTION = 377,
LE_PERIODIC_ADVERTISING_CREATE_SYNC = 380,
LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL = 381,
LE_PERIODIC_ADVERTISING_TERMINATE_SYNC = 382,
LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST = 383,
LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST = 384,
LE_CLEAR_PERIODIC_ADVERTISING_LIST = 385,
LE_READ_PERIODIC_ADVERTISING_LIST_SIZE = 386,
LE_READ_TRANSMIT_POWER = 387,
LE_READ_RF_PATH_COMPENSATION_POWER = 390,
LE_WRITE_RF_PATH_COMPENSATION_POWER = 391,
LE_SET_PRIVACY_MODE = 392,
LE_GENERATE_DHKEY_COMMAND = 412,
}
packet CommandPacket {
op_code : OpCode,
_size_(_payload_) : 8,
_payload_,
}
// Packets for interfaces
packet DiscoveryCommand : CommandPacket { _payload_, }
packet ConnectionManagementCommand : CommandPacket { _payload_, }
packet SecurityCommand : CommandPacket { _payload_, }
packet ScoConnectionCommand : CommandPacket { _payload_, }
packet LeAdvertisingCommand : CommandPacket { _payload_, }
packet LeScanningCommand : CommandPacket { _payload_, }
packet LeConnectionManagementCommand : CommandPacket { _payload_, }
packet LeSecurityCommand : CommandPacket { _payload_, }
packet VendorCommand : CommandPacket { _payload_, }
// HCI Event Packets
enum EventCode : 8 {
INQUIRY_COMPLETE = 0x01,
INQUIRY_RESULT = 0x02,
CONNECTION_COMPLETE = 0x03,
CONNECTION_REQUEST = 0x04,
DISCONNECTION_COMPLETE = 0x05,
AUTHENTICATION_COMPLETE = 0x06,
REMOTE_NAME_REQUEST_COMPLETE = 0x07,
ENCRYPTION_CHANGE = 0x08,
CHANGE_CONNECTION_LINK_KEY_COMPLETE = 0x09,
MASTER_LINK_KEY_COMPLETE = 0x0A,
READ_REMOTE_SUPPORTED_FEATURES_COMPLETE = 0x0B,
READ_REMOTE_VERSION_INFORMATION_COMPLETE = 0x0C,
QOS_SETUP_COMPLETE = 0x0D,
COMMAND_COMPLETE = 0x0E,
COMMAND_STATUS = 0x0F,
HARDWARE_ERROR = 0x10,
FLUSH_OCCURRED = 0x11,
ROLE_CHANGE = 0x12,
NUMBER_OF_COMPLETED_PACKETS = 0x13,
MODE_CHANGE = 0x14,
RETURN_LINK_KEYS = 0x15,
PIN_CODE_REQUEST = 0x16,
LINK_KEY_REQUEST = 0x17,
LINK_KEY_NOTIFICATION = 0x18,
LOOPBACK_COMMAND = 0x19,
DATA_BUFFER_OVERFLOW = 0x1A,
MAX_SLOTS_CHANGE = 0x1B,
READ_CLOCK_OFFSET_COMPLETE = 0x1C,
CONNECTION_PACKET_TYPE_CHANGED = 0x1D,
QOS_VIOLATION = 0x1E,
PAGE_SCAN_REPETITION_MODE_CHANGE = 0x20,
FLOW_SPECIFICATION_COMPLETE = 0x21,
INQUIRY_RESULT_WITH_RSSI = 0x22,
READ_REMOTE_EXTENDED_FEATURES_COMPLETE = 0x23,
SYNCHRONOUS_CONNECTION_COMPLETE = 0x2C,
SYNCHRONOUS_CONNECTION_CHANGED = 0x2D,
SNIFF_SUBRATING = 0x2E,
EXTENDED_INQUIRY_RESULT = 0x2F,
ENCRYPTION_KEY_REFRESH_COMPLETE = 0x30,
IO_CAPABILITY_REQUEST = 0x31,
IO_CAPABILITY_RESPONSE = 0x32,
USER_CONFIRMATION_REQUEST = 0x33,
USER_PASSKEY_REQUEST = 0x34,
REMOTE_OOB_DATA_REQUEST = 0x35,
SIMPLE_PAIRING_COMPLETE = 0x36,
LINK_SUPERVISION_TIMEOUT_CHANGED = 0x38,
ENHANCED_FLUSH_COMPLETE = 0x39,
USER_PASSKEY_NOTIFICATION = 0x3B,
KEYPRESS_NOTIFICATION = 0x3C,
REMOTE_HOST_SUPPORTED_FEATURES_NOTIFICATION = 0x3D,
LE_META_EVENT = 0x3e,
NUMBER_OF_COMPLETED_DATA_BLOCKS = 0x48,
VENDOR_SPECIFIC = 0xFF,
}
packet EventPacket {
event_code : EventCode,
_size_(_payload_) : 8,
_payload_,
}
// LE Events
enum SubeventCode : 8 {
CONNECTION_COMPLETE = 0x01,
ADVERTISING_REPORT = 0x02,
CONNECTION_UPDATE_COMPLETE = 0x03,
READ_REMOTE_FEATURES_COMPLETE = 0x04,
LONG_TERM_KEY_REQUEST = 0x05,
REMOTE_CONNECTION_PARAMETER_REQUEST = 0x06,
DATA_LENGTH_CHANGE = 0x07,
READ_LOCAL_P256_PUBLIC_KEY_COMPLETE = 0x08,
GENERATE_DHKEY_COMPLETE = 0x09,
ENHANCED_CONNECTION_COMPLETE = 0x0a,
DIRECTED_ADVERTISING_REPORT = 0x0b,
PHY_UPDATE_COMPLETE = 0x0c,
EXTENDED_ADVERTISING_REPORT = 0x0D,
PERIODIC_ADVERTISING_SYNC_ESTABLISHED = 0x0E,
PERIODIC_ADVERTISING_REPORT = 0x0F,
PERIODIC_ADVERTISING_SYNC_LOST = 0x10,
SCAN_TIMEOUT = 0x11,
ADVERTISING_SET_TERMINATED = 0x12,
SCAN_REQUEST_RECEIVED = 0x13,
}
// Vendor specific events
enum VseSubeventCode : 8 {
BLE_THRESHOLD = 0x54,
BLE_TRACKING = 0x56,
DEBUG_INFO = 0x57,
BQR_EVENT = 0x58,
}
// Common definitions for commands and events
enum FeatureFlag : 1 {
UNSUPPORTED = 0,
SUPPORTED = 1,
}
enum ErrorCode: 8 {
SUCCESS = 0x00,
UNKNOWN_HCI_COMMAND = 0x01,
UNKNOWN_CONNECTION = 0x02,
HARDWARE_FAILURE = 0x03,
PAGE_TIMEOUT = 0x04,
AUTHENTICATION_FAILURE = 0x05,
PIN_OR_KEY_MISSING = 0x06,
MEMORY_CAPACITY_EXCEEDED = 0x07,
CONNECTION_TIMEOUT = 0x08,
CONNECTION_LIMIT_EXCEEDED = 0x09,
SYNCHRONOUS_CONNECTION_LIMIT_EXCEEDED = 0x0A,
CONNECTION_ALREADY_EXISTS = 0x0B,
COMMAND_DISALLOWED = 0x0C,
CONNECTION_REJECTED_LIMITED_RESOURCES = 0x0D,
CONNECTION_REJECTED_SECURITY_REASONS = 0x0E,
CONNECTION_REJECTED_UNACCEPTABLE_BD_ADDR = 0x0F,
CONNECTION_ACCEPT_TIMEOUT = 0x10,
UNSUPORTED_FEATURE_OR_PARAMETER_VALUE = 0x11,
INVALID_HCI_COMMAND_PARAMETERS = 0x12,
REMOTE_USER_TERMINATED_CONNECTION = 0x13,
REMOTE_DEVICE_TERMINATED_CONNECTION_LOW_RESOURCES = 0x14,
REMOTE_DEVICE_TERMINATED_CONNECTION_POWER_OFF = 0x15,
CONNECTION_TERMINATED_BY_LOCAL_HOST = 0x16,
REPEATED_ATTEMPTS = 0x17,
PAIRING_NOT_ALLOWED = 0x18,
UNKNOWN_LMP_PDU = 0x19,
UNSUPPORTED_REMOTE_OR_LMP_FEATURE = 0x1A,
SCO_OFFSET_REJECTED = 0x1B,
SCO_INTERVAL_REJECTED = 0x1C,
SCO_AIR_MODE_REJECTED = 0x1D,
INVALID_LMP_OR_LL_PARAMETERS = 0x1E,
UNSPECIFIED_ERROR = 0x1F,
UNSUPPORTED_LMP_OR_LL_PARAMETER = 0x20,
ROLE_CHANGE_NOT_ALLOWED = 0x21,
LINK_LAYER_COLLISION = 0x23,
ENCRYPTION_MODE_NOT_ACCEPTABLE = 0x25,
CONTROLLER_BUSY = 0x3A,
}
// Events that are defined with their respective commands
packet CommandComplete : EventPacket (event_code = COMMAND_COMPLETE){
num_hci_command_packets : 8,
command_op_code : OpCode,
_payload_,
}
packet CommandStatus : EventPacket (event_code = COMMAND_STATUS){
status : ErrorCode, // SUCCESS means PENDING
num_hci_command_packets : 8,
command_op_code : OpCode,
_payload_,
}
// Credits
packet NoCommandComplete : CommandComplete (command_op_code = NONE){
}
struct Lap { // Lower Address Part
lap : 6,
_reserved_ : 2,
_fixed_ = 0x9e8b : 16,
}
// LINK_CONTROL
packet Inquiry : DiscoveryCommand (op_code = INQUIRY) {
lap : Lap,
inquiry_length : 8, // 0x1 - 0x30 (times 1.28s)
num_responses : 8, // 0x00 unlimited
}
packet InquiryStatus : CommandStatus (command_op_code = INQUIRY) {
}
packet InquiryCancel : DiscoveryCommand (op_code = INQUIRY_CANCEL) {
}
packet InquiryCancelComplete : CommandComplete (command_op_code = INQUIRY_CANCEL) {
status : ErrorCode,
}
packet PeriodicInquiryMode : DiscoveryCommand (op_code = PERIODIC_INQUIRY_MODE) {
max_period_length : 16, // Range 0x0003 to 0xffff (times 1.28s)
min_period_length : 16, // Range 0x0002 to 0xfffe (times 1.28s)
lap : Lap,
inquiry_length : 8, // 0x1 - 0x30 (times 1.28s)
num_responses : 8, // 0x00 unlimited
}
packet PeriodicInquiryModeComplete : CommandComplete (command_op_code = PERIODIC_INQUIRY_MODE) {
status : ErrorCode,
}
packet ExitPeriodicInquiryMode : DiscoveryCommand (op_code = EXIT_PERIODIC_INQUIRY_MODE) {
}
packet ExitPeriodicInquiryModeComplete : CommandComplete (command_op_code = EXIT_PERIODIC_INQUIRY_MODE) {
status : ErrorCode,
}
enum PageScanRepetitionMode : 8 {
R0 = 0x00,
R1 = 0x01,
R2 = 0x02,
}
enum ClockOffsetValid : 1 {
INVALID = 0,
VALID = 1,
}
enum CreateConnectionRoleSwitch : 8 {
REMAIN_MASTER = 0x00,
ALLOW_ROLE_SWITCH = 0x01,
}
packet CreateConnection : ConnectionManagementCommand (op_code = CREATE_CONNECTION) {
bd_addr : Address,
packet_type : 16,
page_scan_repetition_mode : PageScanRepetitionMode,
_reserved_ : 8,
clock_offset : 15,
clock_offset_valid : ClockOffsetValid,
allow_role_switch : CreateConnectionRoleSwitch,
}
packet CreateConnectionStatus : CommandStatus (command_op_code = CREATE_CONNECTION) {
}
enum DisconnectReason : 8 {
AUTHENTICATION_FAILURE = 0x05,
REMOTE_USER_TERMINATED_CONNECTION = 0x13,
REMOTE_DEVICE_TERMINATED_CONNECTION_LOW_RESOURCES = 0x14,
REMOTE_DEVICE_TERMINATED_CONNECTION_POWER_OFF = 0x15,
UNSUPPORTED_REMOTE_FEATURE = 0x1A,
PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED = 0x29,
UNACCEPTABLE_CONNECTION_PARAMETERS = 0x3B,
}
packet Disconnect : ConnectionManagementCommand (op_code = DISCONNECT) {
connection_handle : 12,
_reserved_ : 4,
reason : DisconnectReason,
}
packet DisconnectStatus : CommandStatus (command_op_code = DISCONNECT) {
}
packet CreateConnectionCancel : ConnectionManagementCommand (op_code = CREATE_CONNECTION_CANCEL) {
bd_addr : Address,
}
packet CreateConnectionCancelComplete : CommandComplete (command_op_code = CREATE_CONNECTION_CANCEL) {
status : ErrorCode,
bd_addr : Address,
}
enum AcceptConnectionRequestRole : 8 {
BECOME_MASTER = 0x00,
REMAIN_SLAVE = 0x01,
}
packet AcceptConnectionRequest : ConnectionManagementCommand (op_code = ACCEPT_CONNECTION_REQUEST) {
bd_addr : Address,
role : AcceptConnectionRequestRole,
}
packet AcceptConnectionRequestStatus : CommandStatus (command_op_code = ACCEPT_CONNECTION_REQUEST) {
}
enum RejectConnectionReason : 8 {
LIMITED_RESOURCES = 0x0D,
SECURITY_REASONS = 0x0E,
UNACCEPTABLE_BD_ADDR = 0x0F,
}
packet RejectConnectionRequest : ConnectionManagementCommand (op_code = REJECT_CONNECTION_REQUEST) {
bd_addr : Address,
reason : RejectConnectionReason,
}
packet RejectConnectionRequestStatus : CommandStatus (command_op_code = REJECT_CONNECTION_REQUEST) {
}
packet LinkKeyRequestReply : SecurityCommand (op_code = LINK_KEY_REQUEST_REPLY) {
bd_addr : Address,
link_key : 8[16],
}
packet LinkKeyRequestReplyComplete : CommandComplete (command_op_code = LINK_KEY_REQUEST_REPLY) {
status : ErrorCode,
}
packet LinkKeyRequestNegativeReply : SecurityCommand (op_code = LINK_KEY_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
}
packet LinkKeyRequestNegativeReplyComplete : CommandComplete (command_op_code = LINK_KEY_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet PinCodeRequestReply : SecurityCommand (op_code = PIN_CODE_REQUEST_REPLY) {
bd_addr : Address,
pin_code_length : 5, // 0x01 - 0x10
_reserved_ : 3,
pin_code : 8[16], // string parameter, first octet first
}
packet PinCodeRequestReplyComplete : CommandComplete (command_op_code = PIN_CODE_REQUEST_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet PinCodeRequestNegativeReply : SecurityCommand (op_code = PIN_CODE_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
}
packet PinCodeRequestNegativeReplyComplete : CommandComplete (command_op_code = PIN_CODE_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet ChangeConnectionPacketType : ConnectionManagementCommand (op_code = CHANGE_CONNECTION_PACKET_TYPE) {
connection_handle : 12,
_reserved_ : 4,
packet_type : 16,
}
packet ChangeConnectionPacketTypeStatus : CommandStatus (command_op_code = CHANGE_CONNECTION_PACKET_TYPE) {
}
packet AuthenticationRequested : ConnectionManagementCommand (op_code = AUTHENTICATION_REQUESTED) {
connection_handle : 12,
_reserved_ : 4,
}
packet AuthenticationRequestedStatus : CommandStatus (command_op_code = AUTHENTICATION_REQUESTED) {
}
packet SetConnectionEncryption : ConnectionManagementCommand (op_code = SET_CONNECTION_ENCRYPTION) {
connection_handle : 12,
_reserved_ : 4,
encryption_enable : Enable,
}
packet SetConnectionEncryptionStatus : CommandStatus (command_op_code = SET_CONNECTION_ENCRYPTION) {
}
packet ChangeConnectionLinkKey : ConnectionManagementCommand (op_code = CHANGE_CONNECTION_LINK_KEY) {
connection_handle : 12,
_reserved_ : 4,
}
packet ChangeConnectionLinkKeyStatus : CommandStatus (command_op_code = CHANGE_CONNECTION_LINK_KEY) {
}
enum KeyFlag : 8 {
SEMI_PERMANENT = 0x00,
TEMPORARY = 0x01,
}
packet MasterLinkKey : ConnectionManagementCommand (op_code = MASTER_LINK_KEY) {
key_flag : KeyFlag,
}
packet MasterLinkKeyStatus : CommandStatus (command_op_code = MASTER_LINK_KEY) {
}
packet RemoteNameRequest : DiscoveryCommand (op_code = REMOTE_NAME_REQUEST) {
bd_addr : Address,
page_scan_repetition_mode : PageScanRepetitionMode,
_reserved_ : 8,
clock_offset : 15,
clock_offset_valid : ClockOffsetValid,
}
packet RemoteNameRequestStatus : CommandStatus (command_op_code = REMOTE_NAME_REQUEST) {
}
packet RemoteNameRequestCancel : DiscoveryCommand (op_code = REMOTE_NAME_REQUEST_CANCEL) {
bd_addr : Address,
}
packet RemoteNameRequestCancelComplete : CommandComplete (command_op_code = REMOTE_NAME_REQUEST_CANCEL) {
status : ErrorCode,
bd_addr : Address,
}
packet ReadRemoteSupportedFeatures : DiscoveryCommand (op_code = READ_REMOTE_SUPPORTED_FEATURES) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadRemoteSupportedFeaturesStatus : CommandStatus (command_op_code = READ_REMOTE_SUPPORTED_FEATURES) {
}
packet ReadRemoteExtendedFeatures : DiscoveryCommand (op_code = READ_REMOTE_EXTENDED_FEATURES) {
connection_handle : 12,
_reserved_ : 4,
page_number : 8,
}
packet ReadRemoteExtendedFeaturesStatus : CommandStatus (command_op_code = READ_REMOTE_EXTENDED_FEATURES) {
}
packet ReadRemoteVersionInformation : DiscoveryCommand (op_code = READ_REMOTE_VERSION_INFORMATION) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadRemoteVersionInformationStatus : CommandStatus (command_op_code = READ_REMOTE_VERSION_INFORMATION) {
}
packet ReadClockOffset : ConnectionManagementCommand (op_code = READ_CLOCK_OFFSET) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadClockOffsetStatus : CommandStatus (command_op_code = READ_CLOCK_OFFSET) {
}
packet ReadLmpHandle : ConnectionManagementCommand (op_code = READ_LMP_HANDLE) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadLmpHandleComplete : CommandComplete (command_op_code = READ_LMP_HANDLE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
lmp_handle : 8,
_reserved_ : 32,
}
packet SetupSynchronousConnection : ScoConnectionCommand (op_code = SETUP_SYNCHRONOUS_CONNECTION) {
_payload_, // placeholder (unimplemented)
}
packet AcceptSynchronousConnection : ScoConnectionCommand (op_code = ACCEPT_SYNCHRONOUS_CONNECTION) {
_payload_, // placeholder (unimplemented)
}
packet RejectSynchronousConnection : ScoConnectionCommand (op_code = REJECT_SYNCHRONOUS_CONNECTION) {
_payload_, // placeholder (unimplemented)
}
enum IoCapability : 8 {
DISPLAY_ONLY = 0x00,
DISPLAY_YES_NO = 0x01,
KEYBOARD_ONLY = 0x02,
NO_INPUT_NO_OUTPUT = 0x03,
}
enum OobDataPresent : 8 {
NOT_PRESENT = 0x00,
P_192_PRESENT = 0x01,
P_256_PRESENT = 0x02,
P_192_AND_256_PRESENT = 0x03,
}
enum AuthenticationRequirements : 8 {
NO_BONDING = 0x00,
NO_BONDING_MITM_PROTECTION = 0x01,
DEDICATED_BONDING = 0x02,
DEDICATED_BONDING_MITM_PROTECTION = 0x03,
GENERAL_BONDING = 0x04,
GENERAL_BONDING_MITM_PROTECTION = 0x05,
}
packet IoCapabilityRequestReply : SecurityCommand (op_code = IO_CAPABILITY_REQUEST_REPLY) {
bd_addr : Address,
io_capability : IoCapability,
oob_present : OobDataPresent,
authentication_requirements : AuthenticationRequirements,
}
packet IoCapabilityRequestReplyComplete : CommandComplete (command_op_code = IO_CAPABILITY_REQUEST_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet UserConfirmationRequestReply : SecurityCommand (op_code = USER_CONFIRMATION_REQUEST_REPLY) {
bd_addr : Address,
}
packet UserConfirmationRequestReplyComplete : CommandComplete (command_op_code = USER_CONFIRMATION_REQUEST_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet UserConfirmationRequestNegativeReply : SecurityCommand (op_code = USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
}
packet UserConfirmationRequestNegativeReplyComplete : CommandComplete (command_op_code = USER_CONFIRMATION_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet UserPasskeyRequestReply : SecurityCommand (op_code = USER_PASSKEY_REQUEST_REPLY) {
bd_addr : Address,
numeric_value : 32, // 000000-999999 decimal or 0x0-0xF423F
}
packet UserPasskeyRequestReplyComplete : CommandComplete (command_op_code = USER_PASSKEY_REQUEST_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet UserPasskeyRequestNegativeReply : SecurityCommand (op_code = USER_PASSKEY_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
}
packet UserPasskeyRequestNegativeReplyComplete : CommandComplete (command_op_code = USER_PASSKEY_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet RemoteOobDataRequestReply : SecurityCommand (op_code = REMOTE_OOB_DATA_REQUEST_REPLY) {
bd_addr : Address,
c : 8[16],
r : 8[16],
}
packet RemoteOobDataRequestReplyComplete : CommandComplete (command_op_code = REMOTE_OOB_DATA_REQUEST_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet RemoteOobDataRequestNegativeReply : SecurityCommand (op_code = REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
}
packet RemoteOobDataRequestNegativeReplyComplete : CommandComplete (command_op_code = REMOTE_OOB_DATA_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet IoCapabilityRequestNegativeReply : SecurityCommand (op_code = IO_CAPABILITY_REQUEST_NEGATIVE_REPLY) {
bd_addr : Address,
reason : ErrorCode,
}
packet IoCapabilityRequestNegativeReplyComplete : CommandComplete (command_op_code = IO_CAPABILITY_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
bd_addr : Address,
}
packet EnhancedSetupSynchronousConnection : ScoConnectionCommand (op_code = ENHANCED_SETUP_SYNCHRONOUS_CONNECTION) {
_payload_, // placeholder (unimplemented)
}
packet EnhancedAcceptSynchronousConnection : ScoConnectionCommand (op_code = ENHANCED_ACCEPT_SYNCHRONOUS_CONNECTION) {
_payload_, // placeholder (unimplemented)
}
// LINK_POLICY
packet HoldMode : ConnectionManagementCommand (op_code = HOLD_MODE) {
connection_handle : 12,
_reserved_ : 4,
hold_mode_max_interval: 16, // 0x0002-0xFFFE (1.25ms-40.9s)
hold_mode_min_interval: 16, // 0x0002-0xFFFE (1.25ms-40.9s)
}
packet HoldModeStatus : CommandStatus (command_op_code = HOLD_MODE) {
}
packet SniffMode : ConnectionManagementCommand (op_code = SNIFF_MODE) {
connection_handle : 12,
_reserved_ : 4,
sniff_max_interval: 16, // 0x0002-0xFFFE (1.25ms-40.9s)
sniff_min_interval: 16, // 0x0002-0xFFFE (1.25ms-40.9s)
sniff_attempt: 16, // 0x0001-0x7FFF (1.25ms-40.9s)
sniff_timeout: 16, // 0x0000-0x7FFF (0ms-40.9s)
}
packet SniffModeStatus : CommandStatus (command_op_code = SNIFF_MODE) {
}
packet ExitSniffMode : ConnectionManagementCommand (op_code = EXIT_SNIFF_MODE) {
connection_handle : 12,
_reserved_ : 4,
}
packet ExitSniffModeStatus : CommandStatus (command_op_code = EXIT_SNIFF_MODE) {
}
enum ServiceType : 8 {
NO_TRAFFIC = 0x00,
BEST_EFFORT = 0x01,
GUARANTEED = 0x02,
}
packet QosSetup : ConnectionManagementCommand (op_code = QOS_SETUP) {
connection_handle : 12,
_reserved_ : 4,
_reserved_ : 8,
service_type : ServiceType,
token_rate : 32, // Octets/s
peak_bandwidth : 32, // Octets/s
latency : 32, // Octets/s
delay_variation : 32, // microseconds
}
packet QosSetupStatus : CommandStatus (command_op_code = QOS_SETUP) {
}
packet RoleDiscovery : ConnectionManagementCommand (op_code = ROLE_DISCOVERY) {
connection_handle : 12,
_reserved_ : 4,
}
enum Role : 8 {
MASTER = 0x00,
SLAVE = 0x01,
}
packet RoleDiscoveryComplete : CommandComplete (command_op_code = ROLE_DISCOVERY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
current_role : Role,
}
packet SwitchRole : ConnectionManagementCommand (op_code = SWITCH_ROLE) {
bd_addr : Address,
role : Role,
}
packet SwitchRoleStatus : CommandStatus (command_op_code = SWITCH_ROLE) {
}
packet ReadLinkPolicySettings : ConnectionManagementCommand (op_code = READ_LINK_POLICY_SETTINGS) {
connection_handle : 12,
_reserved_ : 4,
}
enum LinkPolicy : 16 {
ENABLE_ROLE_SWITCH = 0x01,
ENABLE_HOLD_MODE = 0x02,
ENABLE_SNIFF_MODE = 0x04,
ENABLE_PARK_MODE = 0x08, // deprecated after 5.0
}
packet ReadLinkPolicySettingsComplete : CommandComplete (command_op_code = READ_LINK_POLICY_SETTINGS) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
link_policy_settings : 16,
}
packet WriteLinkPolicySettings : ConnectionManagementCommand (op_code = WRITE_LINK_POLICY_SETTINGS) {
connection_handle : 12,
_reserved_ : 4,
link_policy_settings : 16,
}
packet WriteLinkPolicySettingsComplete : CommandComplete (command_op_code = WRITE_LINK_POLICY_SETTINGS) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet ReadDefaultLinkPolicySettings : ConnectionManagementCommand (op_code = READ_DEFAULT_LINK_POLICY_SETTINGS) {
}
packet ReadDefaultLinkPolicySettingsComplete : CommandComplete (command_op_code = READ_DEFAULT_LINK_POLICY_SETTINGS) {
status : ErrorCode,
default_link_policy_settings : 16,
}
packet WriteDefaultLinkPolicySettings : ConnectionManagementCommand (op_code = WRITE_DEFAULT_LINK_POLICY_SETTINGS) {
default_link_policy_settings : 16,
}
packet WriteDefaultLinkPolicySettingsComplete : CommandComplete (command_op_code = WRITE_DEFAULT_LINK_POLICY_SETTINGS) {
status : ErrorCode,
}
enum FlowDirection : 8 {
OUTGOING_FLOW = 0x00,
INCOMING_FLOW = 0x01,
}
packet FlowSpecification : ConnectionManagementCommand (op_code = FLOW_SPECIFICATION) {
connection_handle : 12,
_reserved_ : 4,
_reserved_ : 8,
flow_direction : FlowDirection,
service_type : ServiceType,
token_rate : 32, // Octets/s
token_bucket_size : 32,
peak_bandwidth : 32, // Octets/s
access_latency : 32, // Octets/s
}
packet FlowSpecificationStatus : CommandStatus (command_op_code = FLOW_SPECIFICATION) {
}
packet SniffSubrating : ConnectionManagementCommand (op_code = SNIFF_SUBRATING) {
connection_handle : 12,
_reserved_ : 4,
maximum_latency : 16, // 0x0002-0xFFFE (1.25ms-40.9s)
minimum_remote_timeout : 16, // 0x0000-0xFFFE (0-40.9s)
minimum_local_timeout: 16, // 0x0000-0xFFFE (0-40.9s)
}
packet SniffSubratingComplete : CommandComplete (command_op_code = SNIFF_SUBRATING) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
// CONTROLLER_AND_BASEBAND
packet SetEventMask : CommandPacket (op_code = SET_EVENT_MASK) {
event_mask : 64,
}
packet SetEventMaskComplete : CommandComplete (command_op_code = SET_EVENT_MASK) {
status : ErrorCode,
}
packet Reset : CommandPacket (op_code = RESET) {
}
packet ResetComplete : CommandComplete (command_op_code = RESET) {
status : ErrorCode,
}
enum FilterType : 8 {
CLEAR_ALL_FILTERS = 0x00,
INQUIRY_RESULT = 0x01,
CONNECTION_SETUP = 0x02,
}
packet SetEventFilter : CommandPacket (op_code = SET_EVENT_FILTER) {
filter_type : FilterType,
_body_,
}
packet SetEventFilterComplete : CommandComplete (command_op_code = SET_EVENT_FILTER) {
status : ErrorCode,
}
packet SetEventFilterClearAll : SetEventFilter (filter_type = CLEAR_ALL_FILTERS) {
}
enum FilterConditionType : 8 {
ALL_DEVICES = 0x00,
CLASS_OF_DEVICE = 0x01,
ADDRESS = 0x02,
}
packet SetEventFilterInquiryResult : SetEventFilter (filter_type = INQUIRY_RESULT) {
filter_condition_type : FilterConditionType,
_body_,
}
packet SetEventFilterInquiryResultAllDevices : SetEventFilterInquiryResult (filter_condition_type = ALL_DEVICES) {
}
packet SetEventFilterInquiryResultClassOfDevice : SetEventFilterInquiryResult (filter_condition_type = CLASS_OF_DEVICE) {
class_of_device : ClassOfDevice,
class_of_device_mask : ClassOfDevice,
}
packet SetEventFilterInquiryResultAddress : SetEventFilterInquiryResult (filter_condition_type = ADDRESS) {
address : Address,
}
packet SetEventFilterConnectionSetup : SetEventFilter (filter_type = CONNECTION_SETUP) {
filter_condition_type : FilterConditionType,
_body_,
}
enum AutoAcceptFlag : 8 {
AUTO_ACCEPT_OFF = 0x01,
AUTO_ACCEPT_ON_ROLE_SWITCH_DISABLED = 0x02,
AUTO_ACCEPT_ON_ROLE_SWITCH_ENABLED = 0x03,
}
packet SetEventFilterConnectionSetupAllDevices : SetEventFilterConnectionSetup (filter_condition_type = ALL_DEVICES) {
auto_accept_flag : AutoAcceptFlag,
}
packet SetEventFilterConnectionSetupClassOfDevice : SetEventFilterConnectionSetup (filter_condition_type = CLASS_OF_DEVICE) {
class_of_device : ClassOfDevice,
class_of_device_mask : ClassOfDevice,
auto_accept_flag : AutoAcceptFlag,
}
packet SetEventFilterConnectionSetupAddress : SetEventFilterConnectionSetup (filter_condition_type = ADDRESS) {
address : Address,
auto_accept_flag : AutoAcceptFlag,
}
packet Flush : ConnectionManagementCommand (op_code = FLUSH) {
connection_handle : 12,
_reserved_ : 4,
}
packet FlushComplete : CommandComplete (command_op_code = FLUSH) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
enum PinType : 8 {
VARIABLE = 0,
FIXED = 1,
}
packet ReadPinType : CommandPacket (op_code = READ_PIN_TYPE) {
}
packet ReadPinTypeComplete : CommandComplete (command_op_code = READ_PIN_TYPE) {
status : ErrorCode,
pin_type : PinType,
}
packet WritePinType : CommandPacket (op_code = WRITE_PIN_TYPE) {
pin_type : PinType,
}
packet WritePinTypeComplete : CommandComplete (command_op_code = WRITE_PIN_TYPE) {
status : ErrorCode,
}
packet CreateNewUnitKey : CommandPacket (op_code = CREATE_NEW_UNIT_KEY) {
_payload_, // placeholder (unimplemented)
}
enum ReadStoredLinkKeyReadAllFlag : 8 {
SPECIFIED_BD_ADDR = 0x00,
ALL = 0x01,
}
packet ReadStoredLinkKey : SecurityCommand (op_code = READ_STORED_LINK_KEY) {
bd_addr : Address,
read_all_flag : ReadStoredLinkKeyReadAllFlag,
}
packet ReadStoredLinkKeyComplete : CommandComplete (command_op_code = READ_STORED_LINK_KEY) {
status : ErrorCode,
max_num_keys : 16,
num_keys_read : 16,
}
struct KeyAndAddress {
address : Address,
link_key : 8[16],
}
packet WriteStoredLinkKey : SecurityCommand (op_code = WRITE_STORED_LINK_KEY) {
_count_(keys_to_write) : 8, // 0x01-0x0B
keys_to_write : KeyAndAddress[],
}
packet WriteStoredLinkKeyComplete : CommandComplete (command_op_code = WRITE_STORED_LINK_KEY) {
status : ErrorCode,
num_keys_written : 8,
}
enum DeleteStoredLinkKeyDeleteAllFlag : 8 {
SPECIFIED_BD_ADDR = 0x00,
ALL = 0x01,
}
packet DeleteStoredLinkKey : SecurityCommand (op_code = DELETE_STORED_LINK_KEY) {
bd_addr : Address,
delete_all_flag : DeleteStoredLinkKeyDeleteAllFlag,
}
packet DeleteStoredLinkKeyComplete : CommandComplete (command_op_code = DELETE_STORED_LINK_KEY) {
status : ErrorCode,
num_keys_deleted : 16,
}
packet WriteLocalName : CommandPacket (op_code = WRITE_LOCAL_NAME) {
local_name : 8[248], // Null-terminated UTF-8 encoded name
}
packet WriteLocalNameComplete : CommandComplete (command_op_code = WRITE_LOCAL_NAME) {
status : ErrorCode,
}
packet ReadLocalName : CommandPacket (op_code = READ_LOCAL_NAME) {
}
packet ReadLocalNameComplete : CommandComplete (command_op_code = READ_LOCAL_NAME) {
status : ErrorCode,
local_name : 8[248], // Null-terminated UTF-8 encoded name
}
packet ReadConnectionAcceptTimeout : ConnectionManagementCommand (op_code = READ_CONNECTION_ACCEPT_TIMEOUT) {
}
packet ReadConnectionAcceptTimeoutComplete : CommandComplete (command_op_code = READ_CONNECTION_ACCEPT_TIMEOUT) {
status : ErrorCode,
conn_accept_timeout : 16, // 0x0001 to 0xB540 (N * 0.625 ms) 0.625 ms to 29 s
}
packet WriteConnectionAcceptTimeout : ConnectionManagementCommand (op_code = WRITE_CONNECTION_ACCEPT_TIMEOUT) {
conn_accept_timeout : 16, // 0x0001 to 0xB540 (N * 0.625 ms) 0.625 ms to 29 s, Default 0x1FA0, 5.06s
}
packet WriteConnectionAcceptTimeoutComplete : CommandComplete (command_op_code = WRITE_CONNECTION_ACCEPT_TIMEOUT) {
status : ErrorCode,
}
packet ReadPageTimeout : DiscoveryCommand (op_code = READ_PAGE_TIMEOUT) {
}
packet ReadPageTimeoutComplete : CommandComplete (command_op_code = READ_PAGE_TIMEOUT) {
status : ErrorCode,
page_timeout : 16,
}
packet WritePageTimeout : DiscoveryCommand (op_code = WRITE_PAGE_TIMEOUT) {
page_timeout : 16,
}
packet WritePageTimeoutComplete : CommandComplete (command_op_code = WRITE_PAGE_TIMEOUT) {
status : ErrorCode,
}
enum ScanEnable : 8 {
NO_SCANS = 0x00,
INQUIRY_SCAN_ONLY = 0x01,
PAGE_SCAN_ONLY = 0x02,
INQUIRY_AND_PAGE_SCAN = 0x03,
}
packet ReadScanEnable : DiscoveryCommand (op_code = READ_SCAN_ENABLE) {
}
packet ReadScanEnableComplete : CommandComplete (command_op_code = READ_SCAN_ENABLE) {
status : ErrorCode,
scan_enable : ScanEnable,
}
packet WriteScanEnable : DiscoveryCommand (op_code = WRITE_SCAN_ENABLE) {
scan_enable : ScanEnable,
}
packet WriteScanEnableComplete : CommandComplete (command_op_code = WRITE_SCAN_ENABLE) {
status : ErrorCode,
}
packet ReadPageScanActivity : DiscoveryCommand (op_code = READ_PAGE_SCAN_ACTIVITY) {
}
packet ReadPageScanActivityComplete : CommandComplete (command_op_code = READ_PAGE_SCAN_ACTIVITY) {
status : ErrorCode,
page_scan_interval : 16, // Range: 0x0012 to 0x1000; only even values are valid * 0x625 ms
page_scan_window : 16, // 0x0011 to PageScanInterval
}
packet WritePageScanActivity : DiscoveryCommand (op_code = WRITE_PAGE_SCAN_ACTIVITY) {
page_scan_interval : 16, // Range: 0x0012 to 0x1000; only even values are valid * 0x625 ms
page_scan_window : 16, // 0x0011 to PageScanInterval
}
packet WritePageScanActivityComplete : CommandComplete (command_op_code = WRITE_PAGE_SCAN_ACTIVITY) {
status : ErrorCode,
}
packet ReadInquiryScanActivity : DiscoveryCommand (op_code = READ_INQUIRY_SCAN_ACTIVITY) {
}
packet ReadInquiryScanActivityComplete : CommandComplete (command_op_code = READ_INQUIRY_SCAN_ACTIVITY) {
status : ErrorCode,
inquiry_scan_interval : 16, // Range: 0x0012 to 0x1000; only even values are valid * 0x625 ms
inquiry_scan_window : 16, // Range: 0x0011 to 0x1000
}
packet WriteInquiryScanActivity : DiscoveryCommand (op_code = WRITE_INQUIRY_SCAN_ACTIVITY) {
inquiry_scan_interval : 16, // Range: 0x0012 to 0x1000; only even values are valid * 0x625 ms
inquiry_scan_window : 16, // Range: 0x0011 to 0x1000
}
packet WriteInquiryScanActivityComplete : CommandComplete (command_op_code = WRITE_INQUIRY_SCAN_ACTIVITY) {
status : ErrorCode,
}
enum AuthenticationEnable : 8 {
NOT_REQUIRED = 0x00,
REQUIRED = 0x01,
}
packet ReadAuthenticationEnable : CommandPacket (op_code = READ_AUTHENTICATION_ENABLE) {
}
packet ReadAuthenticationEnableComplete : CommandComplete (command_op_code = READ_AUTHENTICATION_ENABLE) {
status : ErrorCode,
authentication_enable : AuthenticationEnable,
}
packet WriteAuthenticationEnable : SecurityCommand (op_code = WRITE_AUTHENTICATION_ENABLE) {
authentication_enable : AuthenticationEnable,
}
packet WriteAuthenticationEnableComplete : CommandComplete (command_op_code = WRITE_AUTHENTICATION_ENABLE) {
status : ErrorCode,
}
packet ReadClassOfDevice : DiscoveryCommand (op_code = READ_CLASS_OF_DEVICE) {
}
packet ReadClassOfDeviceComplete : CommandComplete (command_op_code = READ_CLASS_OF_DEVICE) {
status : ErrorCode,
class_of_device : ClassOfDevice,
}
packet WriteClassOfDevice : DiscoveryCommand (op_code = WRITE_CLASS_OF_DEVICE) {
class_of_device : ClassOfDevice,
}
packet WriteClassOfDeviceComplete : CommandComplete (command_op_code = WRITE_CLASS_OF_DEVICE) {
status : ErrorCode,
}
packet ReadVoiceSetting : CommandPacket (op_code = READ_VOICE_SETTING) {
_payload_, // placeholder (unimplemented)
}
packet WriteVoiceSetting : CommandPacket (op_code = WRITE_VOICE_SETTING) {
_payload_, // placeholder (unimplemented)
}
packet WriteVoiceSettingComplete : CommandComplete (command_op_code = WRITE_VOICE_SETTING) {
status : ErrorCode,
}
packet ReadAutomaticFlushTimeout : ConnectionManagementCommand (op_code = READ_AUTOMATIC_FLUSH_TIMEOUT) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadAutomaticFlushTimeoutComplete : CommandComplete (command_op_code = READ_AUTOMATIC_FLUSH_TIMEOUT) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
flush_timeout : 16,
}
packet WriteAutomaticFlushTimeout : ConnectionManagementCommand (op_code = WRITE_AUTOMATIC_FLUSH_TIMEOUT) {
connection_handle : 12,
_reserved_ : 4,
flush_timeout : 16, // 0x0000-0x07FF Default 0x0000 (No Automatic Flush)
}
packet WriteAutomaticFlushTimeoutComplete : CommandComplete (command_op_code = WRITE_AUTOMATIC_FLUSH_TIMEOUT) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet ReadNumBroadcastRetransmits : CommandPacket (op_code = READ_NUM_BROADCAST_RETRANSMITS) {
_payload_, // placeholder (unimplemented)
}
packet WriteNumBroadcastRetransmits : CommandPacket (op_code = WRITE_NUM_BROADCAST_RETRANSMITS) {
_payload_, // placeholder (unimplemented)
}
packet ReadHoldModeActivity : CommandPacket (op_code = READ_HOLD_MODE_ACTIVITY) {
_payload_, // placeholder (unimplemented)
}
packet WriteHoldModeActivity : CommandPacket (op_code = WRITE_HOLD_MODE_ACTIVITY) {
_payload_, // placeholder (unimplemented)
}
enum TransmitPowerLevelType : 8 {
CURRENT = 0x00,
MAXIMUM = 0x01,
}
packet ReadTransmitPowerLevel : ConnectionManagementCommand (op_code = READ_TRANSMIT_POWER_LEVEL) {
connection_handle : 12,
_reserved_ : 4,
type : TransmitPowerLevelType,
}
packet ReadTransmitPowerLevelComplete : CommandComplete (command_op_code = READ_TRANSMIT_POWER_LEVEL) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
transmit_power_level : 8,
}
packet ReadSynchronousFlowControlEnable : CommandPacket (op_code = READ_SYNCHRONOUS_FLOW_CONTROL_ENABLE) {
_payload_, // placeholder (unimplemented)
}
packet WriteSynchronousFlowControlEnable : CommandPacket (op_code = WRITE_SYNCHRONOUS_FLOW_CONTROL_ENABLE) {
_payload_, // placeholder (unimplemented)
}
packet SetControllerToHostFlowControl : CommandPacket (op_code = SET_CONTROLLER_TO_HOST_FLOW_CONTROL) {
_payload_, // placeholder (unimplemented)
}
packet HostBufferSize : CommandPacket (op_code = HOST_BUFFER_SIZE) {
host_acl_data_packet_length : 16,
host_synchronous_data_packet_length : 8,
host_total_num_acl_data_packets : 16,
host_total_num_synchronous_data_packets : 16,
}
packet HostBufferSizeComplete : CommandComplete (command_op_code = HOST_BUFFER_SIZE) {
status : ErrorCode,
}
struct CompletedPackets {
connection_handle : 12,
_reserved_ : 4,
host_num_of_completed_packets : 16,
}
packet HostNumCompletedPackets : CommandPacket (op_code = HOST_NUM_COMPLETED_PACKETS) {
_count_(completed_packets) : 8,
completed_packets : CompletedPackets[],
}
packet HostNumCompletedPacketsError : CommandComplete (command_op_code = HOST_NUM_COMPLETED_PACKETS) {
error_code : ErrorCode,
}
packet ReadLinkSupervisionTimeout : ConnectionManagementCommand (op_code = READ_LINK_SUPERVISION_TIMEOUT) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadLinkSupervisionTimeoutComplete : CommandComplete (command_op_code = READ_LINK_SUPERVISION_TIMEOUT) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
link_supervision_timeout : 16, // 0x001-0xFFFF (0.625ms-40.9s)
}
packet WriteLinkSupervisionTimeout : ConnectionManagementCommand (op_code = WRITE_LINK_SUPERVISION_TIMEOUT) {
handle : 12,
_reserved_ : 4,
link_supervision_timeout : 16, // 0x001-0xFFFF (0.625ms-40.9s)
}
packet WriteLinkSupervisionTimeoutComplete : CommandComplete (command_op_code = WRITE_LINK_SUPERVISION_TIMEOUT) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet ReadNumberOfSupportedIac : DiscoveryCommand (op_code = READ_NUMBER_OF_SUPPORTED_IAC) {
}
packet ReadNumberOfSupportedIacComplete : CommandComplete (command_op_code = READ_NUMBER_OF_SUPPORTED_IAC) {
status : ErrorCode,
num_support_iac : 8,
}
packet ReadCurrentIacLap : DiscoveryCommand (op_code = READ_CURRENT_IAC_LAP) {
}
packet ReadCurrentIacLapComplete : CommandComplete (command_op_code = READ_CURRENT_IAC_LAP) {
status : ErrorCode,
_count_(laps_to_read) : 8,
laps_to_read : Lap[],
}
packet WriteCurrentIacLap : DiscoveryCommand (op_code = WRITE_CURRENT_IAC_LAP) {
_count_(laps_to_write) : 8,
laps_to_write : Lap[],
}
packet WriteCurrentIacLapComplete : CommandComplete (command_op_code = WRITE_CURRENT_IAC_LAP) {
status : ErrorCode,
}
packet SetAfhHostChannelClassification : CommandPacket (op_code = SET_AFH_HOST_CHANNEL_CLASSIFICATION) {
afh_host_channel_classification : 8[10],
}
packet SetAfhHostChannelClassificationComplete : CommandComplete (command_op_code = SET_AFH_HOST_CHANNEL_CLASSIFICATION) {
status : ErrorCode,
}
enum InquiryScanType : 8 {
STANDARD = 0x00,
INTERLACED = 0x01,
}
packet ReadInquiryScanType : DiscoveryCommand (op_code = READ_INQUIRY_SCAN_TYPE) {
}
packet ReadInquiryScanTypeComplete : CommandComplete (command_op_code = READ_INQUIRY_SCAN_TYPE) {
status : ErrorCode,
inquiry_scan_type : InquiryScanType,
}
packet WriteInquiryScanType : DiscoveryCommand (op_code = WRITE_INQUIRY_SCAN_TYPE) {
inquiry_scan_type : InquiryScanType,
}
packet WriteInquiryScanTypeComplete : CommandComplete (command_op_code = WRITE_INQUIRY_SCAN_TYPE) {
status : ErrorCode,
}
enum InquiryMode : 8 {
STANDARD = 0x00,
RSSI = 0x01,
RSSI_OR_EXTENDED = 0x02,
}
packet ReadInquiryMode : DiscoveryCommand (op_code = READ_INQUIRY_MODE) {
}
packet ReadInquiryModeComplete : CommandComplete (command_op_code = READ_INQUIRY_MODE) {
status : ErrorCode,
inquiry_mode : InquiryMode,
}
packet WriteInquiryMode : DiscoveryCommand (op_code = WRITE_INQUIRY_MODE) {
inquiry_mode : InquiryMode,
}
packet WriteInquiryModeComplete : CommandComplete (command_op_code = WRITE_INQUIRY_MODE) {
status : ErrorCode,
}
enum PageScanType : 8 {
STANDARD = 0x00,
INTERLACED = 0x01,
}
packet ReadPageScanType : DiscoveryCommand (op_code = READ_PAGE_SCAN_TYPE) {
}
packet ReadPageScanTypeComplete : CommandComplete (command_op_code = READ_PAGE_SCAN_TYPE) {
status : ErrorCode,
page_scan_type : PageScanType,
}
packet WritePageScanType : DiscoveryCommand (op_code = WRITE_PAGE_SCAN_TYPE) {
page_scan_type : PageScanType,
}
packet WritePageScanTypeComplete : CommandComplete (command_op_code = WRITE_PAGE_SCAN_TYPE) {
status : ErrorCode,
}
packet ReadAfhChannelAssessmentMode : CommandPacket (op_code = READ_AFH_CHANNEL_ASSESSMENT_MODE) {
_payload_, // placeholder (unimplemented)
}
packet WriteAfhChannelAssessmentMode : CommandPacket (op_code = WRITE_AFH_CHANNEL_ASSESSMENT_MODE) {
_payload_, // placeholder (unimplemented)
}
enum FecRequired : 8 {
NOT_REQUIRED = 0x00,
REQUIRED = 0x01,
}
packet ReadExtendedInquiryResponse : CommandPacket (op_code = READ_EXTENDED_INQUIRY_RESPONSE) {
}
packet ReadExtendedInquiryResponseComplete : CommandComplete (command_op_code = READ_EXTENDED_INQUIRY_RESPONSE) {
status : ErrorCode,
fec_required : FecRequired,
extended_inquiry_response : GapData[],
}
packet WriteExtendedInquiryResponse : CommandPacket (op_code = WRITE_EXTENDED_INQUIRY_RESPONSE) {
fec_required : FecRequired,
extended_inquiry_response : GapData[],
_padding_[244], // Zero padding to be 240 octets (GapData[]) + 2 (opcode) + 1 (size) + 1 (FecRequired)
}
packet WriteExtendedInquiryResponseComplete : CommandComplete (command_op_code = WRITE_EXTENDED_INQUIRY_RESPONSE) {
status : ErrorCode,
}
packet RefreshEncryptionKey : SecurityCommand (op_code = REFRESH_ENCRYPTION_KEY) {
connection_handle : 12,
_reserved_ : 4,
}
packet RefreshEncryptionKeyStatus : CommandStatus (command_op_code = REFRESH_ENCRYPTION_KEY) {
}
packet ReadSimplePairingMode : SecurityCommand (op_code = READ_SIMPLE_PAIRING_MODE) {
}
packet ReadSimplePairingModeComplete : CommandComplete (command_op_code = READ_SIMPLE_PAIRING_MODE) {
status : ErrorCode,
simple_pairing_mode : Enable,
}
packet WriteSimplePairingMode : SecurityCommand (op_code = WRITE_SIMPLE_PAIRING_MODE) {
simple_pairing_mode : Enable,
}
packet WriteSimplePairingModeComplete : CommandComplete (command_op_code = WRITE_SIMPLE_PAIRING_MODE) {
status : ErrorCode,
}
packet ReadLocalOobData : SecurityCommand (op_code = READ_LOCAL_OOB_DATA) {
}
packet ReadLocalOobDataComplete : CommandComplete (command_op_code = READ_LOCAL_OOB_DATA) {
status : ErrorCode,
c : 8[16],
r : 8[16],
}
packet ReadInquiryResponseTransmitPowerLevel : DiscoveryCommand (op_code = READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL) {
}
packet ReadInquiryResponseTransmitPowerLevelComplete : CommandComplete (command_op_code = READ_INQUIRY_RESPONSE_TRANSMIT_POWER_LEVEL) {
status : ErrorCode,
tx_power : 8, // (-70dBm to 20dBm)
}
packet WriteInquiryTransmitPowerLevel : DiscoveryCommand (op_code = WRITE_INQUIRY_TRANSMIT_POWER_LEVEL) {
tx_power : 8,
}
packet WriteInquiryResponseTransmitPowerLevelComplete : CommandComplete (command_op_code = WRITE_INQUIRY_TRANSMIT_POWER_LEVEL) {
status : ErrorCode,
}
enum KeypressNotificationType : 8 {
ENTRY_STARTED = 0,
DIGIT_ENTERED = 1,
DIGIT_ERASED = 2,
CLEARED = 3,
ENTRY_COMPLETED = 4,
}
packet SendKeypressNotification : SecurityCommand (op_code = SEND_KEYPRESS_NOTIFICATION) {
bd_addr : Address,
notification_type : KeypressNotificationType,
}
packet SendKeypressNotificationComplete : CommandComplete (command_op_code = SEND_KEYPRESS_NOTIFICATION) {
status : ErrorCode,
bd_addr : Address,
}
enum SimultaneousLeHost : 8 {
DISABLED = 0x00,
}
packet ReadLeHostSupport : CommandPacket (op_code = READ_LE_HOST_SUPPORT) {
}
packet ReadLeHostSupportComplete : CommandComplete (command_op_code = READ_LE_HOST_SUPPORT) {
status : ErrorCode,
le_supported_host : Enable,
simultaneous_le_host : SimultaneousLeHost,
}
packet WriteLeHostSupport : CommandPacket (op_code = WRITE_LE_HOST_SUPPORT) {
le_supported_host : Enable,
simultaneous_le_host : SimultaneousLeHost,
}
packet WriteLeHostSupportComplete : CommandComplete (command_op_code = WRITE_LE_HOST_SUPPORT) {
status : ErrorCode,
}
packet ReadSecureConnectionsHostSupport : CommandPacket (op_code = READ_SECURE_CONNECTIONS_HOST_SUPPORT) {
}
packet ReadSecureConnectionsHostSupportComplete : CommandComplete (command_op_code = READ_SECURE_CONNECTIONS_HOST_SUPPORT) {
status : ErrorCode,
secure_connections_host_support : Enable,
}
packet WriteSecureConnectionsHostSupport : SecurityCommand (op_code = WRITE_SECURE_CONNECTIONS_HOST_SUPPORT) {
secure_connections_host_support : Enable,
}
packet WriteSecureConnectionsHostSupportComplete : CommandComplete (command_op_code = WRITE_SECURE_CONNECTIONS_HOST_SUPPORT) {
status : ErrorCode,
}
packet ReadLocalOobExtendedData : SecurityCommand (op_code = READ_LOCAL_OOB_EXTENDED_DATA) {
}
packet ReadLocalOobExtendedDataComplete : CommandComplete (command_op_code = READ_LOCAL_OOB_EXTENDED_DATA) {
status : ErrorCode,
c_192 : 8[16],
r_192 : 8[16],
c_256 : 8[16],
r_256 : 8[16],
}
// INFORMATIONAL_PARAMETERS
packet ReadLocalVersionInformation : CommandPacket (op_code = READ_LOCAL_VERSION_INFORMATION) {
}
enum HciVersion : 8 {
V_1_0B = 0x00,
V_1_1 = 0x01,
V_1_2 = 0x02,
V_2_0 = 0x03, // + EDR
V_2_1 = 0x04, // + EDR
V_3_0 = 0x05, // + HS
V_4_0 = 0x06,
V_4_1 = 0x07,
V_4_2 = 0x08,
V_5_0 = 0x09,
V_5_1 = 0x0a,
}
enum LmpVersion : 8 {
V_1_0B = 0x00, // withdrawn
V_1_1 = 0x01, // withdrawn
V_1_2 = 0x02, // withdrawn
V_2_0 = 0x03, // + EDR
V_2_1 = 0x04, // + EDR
V_3_0 = 0x05, // + HS
V_4_0 = 0x06,
V_4_1 = 0x07,
V_4_2 = 0x08,
V_5_0 = 0x09,
V_5_1 = 0x0a,
}
struct LocalVersionInformation {
hci_version : HciVersion,
hci_revision : 16,
lmp_version : LmpVersion,
manufacturer_name : 16,
lmp_subversion : 16,
}
packet ReadLocalVersionInformationComplete : CommandComplete (command_op_code = READ_LOCAL_VERSION_INFORMATION) {
status : ErrorCode,
local_version_information : LocalVersionInformation,
}
packet ReadLocalSupportedCommands : CommandPacket (op_code = READ_LOCAL_SUPPORTED_COMMANDS) {
}
packet ReadLocalSupportedCommandsComplete : CommandComplete (command_op_code = READ_LOCAL_SUPPORTED_COMMANDS) {
status : ErrorCode,
supported_commands : 8[64],
}
packet ReadLocalSupportedFeatures : CommandPacket (op_code = READ_LOCAL_SUPPORTED_FEATURES) {
}
packet ReadLocalSupportedFeaturesComplete : CommandComplete (command_op_code = READ_LOCAL_SUPPORTED_FEATURES) {
status : ErrorCode,
lmp_features : 64,
}
packet ReadLocalExtendedFeatures : CommandPacket (op_code = READ_LOCAL_EXTENDED_FEATURES) {
page_number : 8,
}
packet ReadLocalExtendedFeaturesComplete : CommandComplete (command_op_code = READ_LOCAL_EXTENDED_FEATURES) {
status : ErrorCode,
page_number : 8,
maximum_page_number : 8,
extended_lmp_features : 64,
}
packet ReadBufferSize : CommandPacket (op_code = READ_BUFFER_SIZE) {
}
packet ReadBufferSizeComplete : CommandComplete (command_op_code = READ_BUFFER_SIZE) {
status : ErrorCode,
acl_data_packet_length : 16,
synchronous_data_packet_length : 8,
total_num_acl_data_packets : 16,
total_num_synchronous_data_packets : 16,
}
packet ReadBdAddr : CommandPacket (op_code = READ_BD_ADDR) {
}
packet ReadBdAddrComplete : CommandComplete (command_op_code = READ_BD_ADDR) {
status : ErrorCode,
bd_addr : Address,
}
packet ReadDataBlockSize : CommandPacket (op_code = READ_DATA_BLOCK_SIZE) {
}
packet ReadLocalSupportedCodecs : CommandPacket (op_code = READ_LOCAL_SUPPORTED_CODECS) {
}
packet ReadLocalSupportedCodecsComplete : CommandComplete (command_op_code = READ_LOCAL_SUPPORTED_CODECS) {
status : ErrorCode,
_size_(supported_codecs) : 8,
supported_codecs : 8[],
_size_(vendor_specific_codecs) : 8,
vendor_specific_codecs : 32[],
}
// STATUS_PARAMETERS
packet ReadFailedContactCounter : ConnectionManagementCommand (op_code = READ_FAILED_CONTACT_COUNTER) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadFailedContactCounterComplete : CommandComplete (command_op_code = READ_FAILED_CONTACT_COUNTER) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
failed_contact_counter : 16,
}
packet ResetFailedContactCounter : ConnectionManagementCommand (op_code = RESET_FAILED_CONTACT_COUNTER) {
connection_handle : 12,
_reserved_ : 4,
}
packet ResetFailedContactCounterComplete : CommandComplete (command_op_code = RESET_FAILED_CONTACT_COUNTER) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet ReadLinkQuality : ConnectionManagementCommand (op_code = READ_LINK_QUALITY) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadLinkQualityComplete : CommandComplete (command_op_code = READ_LINK_QUALITY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
link_quality : 8,
}
packet ReadRssi : ConnectionManagementCommand (op_code = READ_RSSI) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadRssiComplete : CommandComplete (command_op_code = READ_RSSI) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
rssi : 8,
}
packet ReadAfhChannelMap : ConnectionManagementCommand (op_code = READ_AFH_CHANNEL_MAP) {
connection_handle : 12,
_reserved_ : 4,
}
enum AfhMode : 8 {
AFH_DISABLED = 0x00,
AFH_ENABLED = 0x01,
}
packet ReadAfhChannelMapComplete : CommandComplete (command_op_code = READ_AFH_CHANNEL_MAP) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
afh_mode : AfhMode,
afh_channel_map : 8[10],
}
enum WhichClock : 8 {
LOCAL = 0x00,
PICONET = 0x01,
}
packet ReadClock : ConnectionManagementCommand (op_code = READ_CLOCK) {
connection_handle : 12,
_reserved_ : 4,
which_clock : WhichClock,
}
packet ReadClockComplete : CommandComplete (command_op_code = READ_CLOCK) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
clock : 28,
_reserved_ : 4,
accuracy : 16,
}
packet ReadEncryptionKeySize : SecurityCommand (op_code = READ_ENCRYPTION_KEY_SIZE) {
connection_handle : 12,
_reserved_ : 4,
}
packet ReadEncryptionKeySizeComplete : CommandComplete (command_op_code = READ_ENCRYPTION_KEY_SIZE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
key_size : 8,
}
// TESTING
enum LoopbackMode : 8 {
NO_LOOPBACK = 0x00,
ENABLE_LOCAL = 0x01,
ENABLE_REMOTE = 0x02,
}
packet ReadLoopbackMode : CommandPacket (op_code = READ_LOOPBACK_MODE) {
}
packet ReadLoopbackModeComplete : CommandComplete (command_op_code = READ_LOOPBACK_MODE) {
status : ErrorCode,
loopback_mode : LoopbackMode,
}
packet WriteLoopbackMode : CommandPacket (op_code = WRITE_LOOPBACK_MODE) {
loopback_mode : LoopbackMode,
}
packet WriteLoopbackModeComplete : CommandComplete (command_op_code = WRITE_LOOPBACK_MODE) {
status : ErrorCode,
}
packet EnableDeviceUnderTestMode : CommandPacket (op_code = ENABLE_DEVICE_UNDER_TEST_MODE) {
}
packet EnableDeviceUnderTestModeComplete : CommandComplete (command_op_code = ENABLE_DEVICE_UNDER_TEST_MODE) {
status : ErrorCode,
}
packet WriteSimplePairingDebugMode : SecurityCommand (op_code = WRITE_SIMPLE_PAIRING_DEBUG_MODE) {
simple_pairing_debug_mode : Enable,
}
packet WriteSimplePairingDebugModeComplete : CommandComplete (command_op_code = WRITE_SIMPLE_PAIRING_DEBUG_MODE) {
status : ErrorCode,
}
packet WriteSecureConnectionsTestMode : CommandPacket (op_code = WRITE_SECURE_CONNECTIONS_TEST_MODE) {
connection_handle : 12,
_reserved_ : 4,
dm1_aclu_mode : Enable,
esco_loopback_mode : Enable,
}
packet WriteSecureConnectionsTestModeComplete : CommandComplete (command_op_code = WRITE_SECURE_CONNECTIONS_TEST_MODE) {
status : ErrorCode,
}
// LE_CONTROLLER
packet LeSetEventMask : CommandPacket (op_code = LE_SET_EVENT_MASK) {
le_event_mask : 64,
}
packet LeSetEventMaskComplete : CommandComplete (command_op_code = LE_SET_EVENT_MASK) {
status : ErrorCode,
}
packet LeReadBufferSize : CommandPacket (op_code = LE_READ_BUFFER_SIZE) {
}
struct LeBufferSize {
le_data_packet_length : 16,
total_num_le_packets : 8,
}
packet LeReadBufferSizeComplete : CommandComplete (command_op_code = LE_READ_BUFFER_SIZE) {
status : ErrorCode,
le_buffer_size : LeBufferSize,
}
packet LeReadLocalSupportedFeatures : CommandPacket (op_code = LE_READ_LOCAL_SUPPORTED_FEATURES) {
}
packet LeReadLocalSupportedFeaturesComplete : CommandComplete (command_op_code = LE_READ_LOCAL_SUPPORTED_FEATURES) {
status : ErrorCode,
le_features : 64,
}
packet LeSetRandomAddress : LeAdvertisingCommand (op_code = LE_SET_RANDOM_ADDRESS) {
random_address : Address,
}
packet LeSetRandomAddressComplete : CommandComplete (command_op_code = LE_SET_RANDOM_ADDRESS) {
status : ErrorCode,
}
enum AdvertisingFilterPolicy : 2 {
ALL_DEVICES = 0, // Default
WHITELISTED_SCAN = 1,
WHITELISTED_CONNECT = 2,
WHITELISTED_SCAN_AND_CONNECT = 3,
}
enum PeerAddressType : 8 {
PUBLIC_DEVICE_OR_IDENTITY_ADDRESS = 0x00,
RANDOM_DEVICE_OR_IDENTITY_ADDRESS = 0x01,
}
enum AdvertisingEventType : 8 {
ADV_IND = 0x00,
ADV_DIRECT_IND = 0x01,
ADV_SCAN_IND = 0x02,
ADV_NONCONN_IND = 0x03,
ADV_DIRECT_IND_LOW = 0x04,
}
enum AddressType : 8 {
PUBLIC_DEVICE_ADDRESS = 0x00,
RANDOM_DEVICE_ADDRESS = 0x01,
PUBLIC_IDENTITY_ADDRESS = 0x02,
RANDOM_IDENTITY_ADDRESS = 0x03,
}
packet LeSetAdvertisingParameters : LeAdvertisingCommand (op_code = LE_SET_ADVERTISING_PARAMETERS) {
interval_min : 16,
interval_max : 16,
type : AdvertisingEventType,
own_address_type : AddressType,
peer_address_type : PeerAddressType,
peer_address : Address,
channel_map : 8,
filter_policy : AdvertisingFilterPolicy,
_reserved_ : 6,
}
packet LeSetAdvertisingParametersComplete : CommandComplete (command_op_code = LE_SET_ADVERTISING_PARAMETERS) {
status : ErrorCode,
}
packet LeReadAdvertisingChannelTxPower : LeAdvertisingCommand (op_code = LE_READ_ADVERTISING_CHANNEL_TX_POWER) {
}
packet LeReadAdvertisingChannelTxPowerComplete : CommandComplete (command_op_code = LE_READ_ADVERTISING_CHANNEL_TX_POWER) {
status : ErrorCode,
transmit_power_level : 8, // (-20dBm to 10dBm) Accuracy: +/-4dB
}
packet LeSetAdvertisingData : LeAdvertisingCommand (op_code = LE_SET_ADVERTISING_DATA) {
_size_(advertising_data) : 8,
advertising_data : GapData[],
_padding_[35], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size
}
packet LeSetAdvertisingDataComplete : CommandComplete (command_op_code = LE_SET_ADVERTISING_DATA) {
status : ErrorCode,
}
packet LeSetScanResponseData : LeAdvertisingCommand (op_code = LE_SET_SCAN_RESPONSE_DATA) {
_size_(advertising_data) : 8,
advertising_data : GapData[],
_padding_[35], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size
}
packet LeSetScanResponseDataComplete : CommandComplete (command_op_code = LE_SET_SCAN_RESPONSE_DATA) {
status : ErrorCode,
}
packet LeSetAdvertisingEnable : LeAdvertisingCommand (op_code = LE_SET_ADVERTISING_ENABLE) {
advertising_enable : Enable, // Default DISABLED
}
packet LeSetAdvertisingEnableComplete : CommandComplete (command_op_code = LE_SET_ADVERTISING_ENABLE) {
status : ErrorCode,
}
enum LeScanType : 8 {
PASSIVE = 0x00, // Default
ACTIVE = 0x01,
}
enum LeSetScanningFilterPolicy : 8 {
ACCEPT_ALL = 0x00, // Default
WHITE_LIST_ONLY = 0x01,
CHECK_INITIATORS_IDENTITY = 0x02,
WHITE_LIST_AND_INITIATORS_IDENTITY = 0x03,
}
packet LeSetScanParameters : LeScanningCommand (op_code = LE_SET_SCAN_PARAMETERS) {
le_scan_type : LeScanType,
le_scan_interval : 16, // 0x0004-0x4000 Default 0x10 (10ms)
le_scan_window : 16, // Default 0x10 (10ms)
own_address_type : AddressType,
scanning_filter_policy : LeSetScanningFilterPolicy,
}
packet LeSetScanParametersComplete : CommandComplete (command_op_code = LE_SET_SCAN_PARAMETERS) {
status : ErrorCode,
}
packet LeSetScanEnable : LeScanningCommand (op_code = LE_SET_SCAN_ENABLE) {
le_scan_enable : Enable,
filter_duplicates : Enable,
}
packet LeSetScanEnableComplete : CommandComplete (command_op_code = LE_SET_SCAN_ENABLE) {
status : ErrorCode,
}
enum InitiatorFilterPolicy : 8 {
USE_PEER_ADDRESS = 0x00,
USE_WHITE_LIST = 0x01,
}
enum OwnAddressType : 8 {
PUBLIC_DEVICE_ADDRESS = 0x00,
RANDOM_DEVICE_ADDRESS = 0x01,
RESOLVABLE_OR_PUBLIC_ADDRESS = 0x02,
RESOLVABLE_OR_RANDOM_ADDRESS = 0x03,
}
packet LeCreateConnection : LeConnectionManagementCommand (op_code = LE_CREATE_CONNECTION) {
le_scan_interval : 16, // 0x0004-0x4000
le_scan_window : 16, // < = LeScanInterval
initiator_filter_policy : InitiatorFilterPolicy,
peer_address_type : AddressType,
peer_address : Address,
own_address_type : OwnAddressType,
conn_interval_min : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_interval_max : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_latency : 16, // 0x0006-0x01F3
supervision_timeout : 16, // 0x00A to 0x0C80 (100ms to 32s)
minimum_ce_length : 16, // 0.625ms
maximum_ce_length : 16, // 0.625ms
}
packet LeCreateConnectionStatus : CommandStatus (command_op_code = LE_CREATE_CONNECTION) {
}
packet LeCreateConnectionCancel : LeConnectionManagementCommand (op_code = LE_CREATE_CONNECTION_CANCEL) {
}
packet LeCreateConnectionCancelStatus : CommandStatus (command_op_code = LE_CREATE_CONNECTION_CANCEL) {
}
packet LeCreateConnectionCancelComplete : CommandComplete (command_op_code = LE_CREATE_CONNECTION_CANCEL) {
status : ErrorCode,
}
packet LeReadWhiteListSize : LeConnectionManagementCommand (op_code = LE_READ_WHITE_LIST_SIZE) {
}
packet LeReadWhiteListSizeComplete : CommandComplete (command_op_code = LE_READ_WHITE_LIST_SIZE) {
status : ErrorCode,
white_list_size : 8,
}
packet LeClearWhiteList : LeConnectionManagementCommand (op_code = LE_CLEAR_WHITE_LIST) {
}
packet LeClearWhiteListComplete : CommandComplete (command_op_code = LE_CLEAR_WHITE_LIST) {
status : ErrorCode,
}
enum WhiteListAddressType : 8 {
PUBLIC = 0x00,
RANDOM = 0x01,
ANONYMOUS_ADVERTISERS = 0xFF,
}
packet LeAddDeviceToWhiteList : LeConnectionManagementCommand (op_code = LE_ADD_DEVICE_TO_WHITE_LIST) {
address_type : WhiteListAddressType,
address : Address,
}
packet LeAddDeviceToWhiteListComplete : CommandComplete (command_op_code = LE_ADD_DEVICE_TO_WHITE_LIST) {
status : ErrorCode,
}
packet LeRemoveDeviceFromWhiteList : LeConnectionManagementCommand (op_code = LE_REMOVE_DEVICE_FROM_WHITE_LIST) {
address_type : WhiteListAddressType,
address : Address,
}
packet LeRemoveDeviceFromWhiteListComplete : CommandComplete (command_op_code = LE_REMOVE_DEVICE_FROM_WHITE_LIST) {
status : ErrorCode,
}
packet LeConnectionUpdate : LeConnectionManagementCommand (op_code = LE_CONNECTION_UPDATE) {
connection_handle : 12,
_reserved_ : 4,
conn_interval_min : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_interval_max : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_latency : 16, // 0x0006-0x01F3
supervision_timeout : 16, // 0x00A to 0x0C80 (100ms to 32s)
minimum_ce_length : 16, // 0.625ms
maximum_ce_length : 16, // 0.625ms
}
packet LeConnectionUpdateStatus : CommandStatus (command_op_code = LE_CONNECTION_UPDATE) {
}
packet LeSetHostChannelClassification : LeConnectionManagementCommand (op_code = LE_SET_HOST_CHANNEL_CLASSIFICATION) {
channel_map : 8[5],
}
packet LeSetHostChannelClassificationComplete : CommandComplete (command_op_code = LE_SET_HOST_CHANNEL_CLASSIFICATION) {
status : ErrorCode,
}
packet LeReadChannelMap : LeConnectionManagementCommand (op_code = LE_READ_CHANNEL_MAP) {
}
packet LeReadChannelMapComplete : CommandComplete (command_op_code = LE_SET_HOST_CHANNEL_CLASSIFICATION) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
channel_map : 8[5],
}
packet LeReadRemoteFeatures : LeConnectionManagementCommand (op_code = LE_READ_REMOTE_FEATURES) {
connection_handle : 12,
_reserved_ : 4,
}
packet LeEncrypt : LeSecurityCommand (op_code = LE_ENCRYPT) {
key : 8[16],
plaintext_data : 8[16],
}
packet LeEncryptComplete : CommandComplete (command_op_code = LE_ENCRYPT) {
status : ErrorCode,
encrypted_data : 8[16],
}
packet LeRand : LeSecurityCommand (op_code = LE_RAND) {
}
packet LeRandComplete : CommandComplete (command_op_code = LE_RAND) {
status : ErrorCode,
random_number : 64,
}
packet LeStartEncryption : LeSecurityCommand (op_code = LE_START_ENCRYPTION) {
connection_handle: 16,
rand: 8[8],
ediv: 16,
ltk: 8[16],
}
packet LeStartEncryptionStatus : CommandStatus (command_op_code = LE_START_ENCRYPTION) {
}
packet LeLongTermKeyRequestReply : LeSecurityCommand (op_code = LE_LONG_TERM_KEY_REQUEST_REPLY) {
connection_handle: 16,
long_term_key: 8[16],
}
packet LeLongTermKeyRequestReplyComplete : CommandComplete (command_op_code = LE_LONG_TERM_KEY_REQUEST_REPLY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet LeLongTermKeyRequestNegativeReply : LeSecurityCommand (op_code = LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY) {
connection_handle : 12,
_reserved_ : 4,
}
packet LeLongTermKeyRequestNegativeReplyComplete : CommandComplete (command_op_code = LE_LONG_TERM_KEY_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet LeReadSupportedStates : CommandPacket (op_code = LE_READ_SUPPORTED_STATES) {
}
packet LeReadSupportedStatesComplete : CommandComplete (command_op_code = LE_READ_SUPPORTED_STATES) {
status : ErrorCode,
le_states : 64,
}
packet LeReceiverTest : CommandPacket (op_code = LE_RECEIVER_TEST) {
_payload_, // placeholder (unimplemented)
}
packet LeTransmitterTest : CommandPacket (op_code = LE_TRANSMITTER_TEST) {
_payload_, // placeholder (unimplemented)
}
packet LeTestEnd : CommandPacket (op_code = LE_TEST_END) {
_payload_, // placeholder (unimplemented)
}
packet LeRemoteConnectionParameterRequestReply : LeConnectionManagementCommand (op_code = LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY) {
connection_handle : 12,
_reserved_ : 4,
interval_min : 16, // 0x0006-0x0C80 (7.5ms to 4s)
interval_max : 16, // 0x0006-0x0C80 (7.5ms to 4s)
latency : 16, // 0x0006-0x01F3
timeout : 16, // 0x00A to 0x0C80 (100ms to 32s)
minimum_ce_length : 16, // 0.625ms
maximum_ce_length : 16, // 0.625ms
}
packet LeRemoteConnectionParameterRequestReplyComplete : CommandComplete (command_op_code = LE_REMOTE_CONNECTION_PARAMETER_REQUEST_REPLY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet LeRemoteConnectionParameterRequestNegativeReply : LeConnectionManagementCommand (op_code = LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY) {
connection_handle : 12,
_reserved_ : 4,
reason : ErrorCode,
}
packet LeRemoteConnectionParameterRequestNegativeReplyComplete : CommandComplete (command_op_code = LE_REMOTE_CONNECTION_PARAMETER_REQUEST_NEGATIVE_REPLY) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet LeSetDataLength : LeConnectionManagementCommand (op_code = LE_SET_DATA_LENGTH) {
connection_handle : 12,
_reserved_ : 4,
tx_octets : 16, // payload octets per single PDU 0x1B to 0x00FB
tx_time : 16, // microseconds used to transmit a single PDU 0x0148 to 0x4290
}
packet LeSetDataLengthComplete : CommandComplete (command_op_code = LE_SET_DATA_LENGTH) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet LeReadSuggestedDefaultDataLength : LeConnectionManagementCommand (op_code = LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH) {
}
packet LeReadSuggestedDefaultDataLengthComplete : CommandComplete (command_op_code = LE_READ_SUGGESTED_DEFAULT_DATA_LENGTH) {
status : ErrorCode,
tx_octets : 16, // payload octets per single PDU 0x1B to 0x00FB
tx_time : 16, // microseconds used to transmit a single PDU 0x0148 to 0x4290
}
packet LeWriteSuggestedDefaultDataLength : LeConnectionManagementCommand (op_code = LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH) {
tx_octets : 16, // payload octets per single PDU 0x1B to 0x00FB
tx_time : 16, // microseconds used to transmit a single PDU 0x0148 to 0x4290
}
packet LeWriteSuggestedDefaultDataLengthComplete : CommandComplete (command_op_code = LE_WRITE_SUGGESTED_DEFAULT_DATA_LENGTH) {
status : ErrorCode,
}
packet LeReadLocalP256PublicKeyCommand : LeSecurityCommand (op_code = LE_READ_LOCAL_P_256_PUBLIC_KEY_COMMAND) {
}
packet LeGenerateDhkeyV1Command : LeSecurityCommand (op_code = LE_GENERATE_DHKEY_COMMAND_V1) {
remote_p_256_public_key : 8[64],
}
packet LeGenerateDhkeyV1CommandStatus : CommandStatus (command_op_code = LE_GENERATE_DHKEY_COMMAND_V1) {
}
packet LeAddDeviceToResolvingList : LeSecurityCommand (op_code = LE_ADD_DEVICE_TO_RESOLVING_LIST) {
peer_identity_address_type : PeerAddressType,
peer_identity_address : Address,
peer_irk : 8[16],
local_irk : 8[16],
}
packet LeAddDeviceToResolvingListComplete : CommandComplete (command_op_code = LE_ADD_DEVICE_TO_RESOLVING_LIST) {
status : ErrorCode,
}
packet LeRemoveDeviceFromResolvingList : LeSecurityCommand (op_code = LE_REMOVE_DEVICE_FROM_RESOLVING_LIST) {
peer_identity_address_type : PeerAddressType,
peer_identity_address : Address,
}
packet LeRemoveDeviceFromResolvingListComplete : CommandComplete (command_op_code = LE_REMOVE_DEVICE_FROM_RESOLVING_LIST) {
status : ErrorCode,
}
packet LeClearResolvingList : LeSecurityCommand (op_code = LE_CLEAR_RESOLVING_LIST) {
}
packet LeClearResolvingListComplete : CommandComplete (command_op_code = LE_CLEAR_RESOLVING_LIST) {
status : ErrorCode,
}
packet LeReadResolvingListSize : LeSecurityCommand (op_code = LE_READ_RESOLVING_LIST_SIZE) {
}
packet LeReadResolvingListSizeComplete : CommandComplete (command_op_code = LE_READ_RESOLVING_LIST_SIZE) {
status : ErrorCode,
}
packet LeReadPeerResolvableAddress : LeSecurityCommand (op_code = LE_READ_PEER_RESOLVABLE_ADDRESS) {
peer_identity_address_type : PeerAddressType,
peer_identity_address : Address,
}
packet LeReadPeerResolvableAddressComplete : CommandComplete (command_op_code = LE_READ_PEER_RESOLVABLE_ADDRESS) {
status : ErrorCode,
peer_resolvable_address : Address,
}
packet LeReadLocalResolvableAddress : LeSecurityCommand (op_code = LE_READ_LOCAL_RESOLVABLE_ADDRESS) {
peer_identity_address_type : PeerAddressType,
peer_identity_address : Address,
}
packet LeReadLocalResolvableAddressComplete : CommandComplete (command_op_code = LE_READ_LOCAL_RESOLVABLE_ADDRESS) {
status : ErrorCode,
local_resolvable_address : Address,
}
packet LeSetAddressResolutionEnable : LeSecurityCommand (op_code = LE_SET_ADDRESS_RESOLUTION_ENABLE) {
address_resolution_enable : Enable,
}
packet LeSetAddressResolutionEnableComplete : CommandComplete (command_op_code = LE_SET_ADDRESS_RESOLUTION_ENABLE) {
status : ErrorCode,
}
packet LeSetResolvablePrivateAddressTimeout : LeSecurityCommand (op_code = LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT) {
rpa_timeout : 16, // RPA_Timeout measured in seconds 0x0001 to 0xA1B8 1s to 11.5 hours
}
packet LeSetResolvablePrivateAddressTimeoutComplete : CommandComplete (command_op_code = LE_SET_RESOLVABLE_PRIVATE_ADDRESS_TIMEOUT) {
status : ErrorCode,
}
packet LeReadMaximumDataLength : CommandPacket (op_code = LE_READ_MAXIMUM_DATA_LENGTH) {
}
struct LeMaximumDataLength {
supported_max_tx_octets : 16,
supported_max_tx_time: 16,
supported_max_rx_octets : 16,
supported_max_rx_time: 16,
}
packet LeReadMaximumDataLengthComplete : CommandComplete (command_op_code = LE_READ_MAXIMUM_DATA_LENGTH) {
status : ErrorCode,
le_maximum_data_length : LeMaximumDataLength,
}
packet LeReadPhy : LeConnectionManagementCommand (op_code = LE_READ_PHY) {
_payload_, // placeholder (unimplemented)
}
packet LeSetDefaultPhy : LeConnectionManagementCommand (op_code = LE_SET_DEFAULT_PHY) {
_payload_, // placeholder (unimplemented)
}
packet LeSetPhy : LeConnectionManagementCommand (op_code = LE_SET_PHY) {
_payload_, // placeholder (unimplemented)
}
packet LeEnhancedReceiverTest : CommandPacket (op_code = LE_ENHANCED_RECEIVER_TEST) {
_payload_, // placeholder (unimplemented)
}
packet LeEnhancedTransmitterTest : CommandPacket (op_code = LE_ENHANCED_TRANSMITTER_TEST) {
_payload_, // placeholder (unimplemented)
}
packet LeSetExtendedAdvertisingRandomAddress : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS) {
advertising_handle : 8,
advertising_random_address : Address,
}
packet LeSetExtendedAdvertisingRandomAddressComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_RANDOM_ADDRESS) {
status : ErrorCode,
}
// The lower 4 bits of the advertising event properties
enum LegacyAdvertisingProperties : 4 {
ADV_IND = 0x3,
ADV_DIRECT_IND_LOW = 0x5,
ADV_DIRECT_IND_HIGH = 0xD,
ADV_SCAN_IND = 0x2,
ADV_NONCONN_IND = 0,
}
enum PrimaryPhyType : 8 {
LE_1M = 0x01,
LE_CODED = 0x03,
}
enum SecondaryPhyType : 8 {
NO_PACKETS = 0x00,
LE_1M = 0x01,
LE_2M = 0x02,
LE_CODED = 0x03,
}
packet LeSetExtendedAdvertisingLegacyParameters : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
advertising_handle : 8,
advertising_event_legacy_properties : LegacyAdvertisingProperties,
_fixed_ = 0x1 : 1, // legacy bit set
_reserved_ : 11, // advertising_event_properties
primary_advertising_interval_min : 24, // 0x20 - 0xFFFFFF N * 0.625 ms
primary_advertising_interval_max : 24, // 0x20 - 0xFFFFFF N * 0.625 ms
primary_advertising_channel_map : 3, // bit 0 - Channel 37, bit 1 - 38, bit 2 - 39
_reserved_ : 5,
own_address_type : OwnAddressType,
peer_address_type : PeerAddressType,
peer_address : Address,
advertising_filter_policy : AdvertisingFilterPolicy,
_reserved_ : 6,
advertising_tx_power : 8, // -127 to +20, 0x7F - no preference
_fixed_ = 0x1 : 8, // PrimaryPhyType LE_1M
_reserved_ : 8, // secondary_advertising_max_skip
_fixed_ = 0x1 : 8, // secondary_advertising_phy LE_1M
advertising_sid : 8, // SID subfield from the ADI field of the PDU
scan_request_notification_enable : Enable,
}
packet LeSetExtendedAdvertisingParameters : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
advertising_handle : 8,
advertising_event_legacy_properties : 4,
_fixed_ = 0 : 1, // legacy bit cleared
advertising_event_properties : 3,
_reserved_ : 8,
primary_advertising_interval_min : 24, // 0x20 - 0xFFFFFF N * 0.625 ms
primary_advertising_interval_max : 24, // 0x20 - 0xFFFFFF N * 0.625 ms
primary_advertising_channel_map : 3, // bit 0 - Channel 37, bit 1 - 38, bit 2 - 39
_reserved_ : 5,
own_address_type : OwnAddressType,
peer_address_type : PeerAddressType,
peer_address : Address,
advertising_filter_policy : AdvertisingFilterPolicy,
_reserved_ : 6,
advertising_tx_power : 8, // -127 to +20, 0x7F - no preference
primary_advertising_phy : PrimaryPhyType,
secondary_advertising_max_skip : 8, // 1 to 255, 0x00 - AUX_ADV_IND sent before next advertising event
secondary_advertising_phy : SecondaryPhyType,
advertising_sid : 8, // SID subfield from the ADI field of the PDU
scan_request_notification_enable : Enable,
}
packet LeSetExtendedAdvertisingParametersComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
status : ErrorCode,
selected_tx_power : 8, // -127 to +20
}
enum Operation : 3 {
INTERMEDIATE_FRAGMENT = 0,
FIRST_FRAGMENT = 1,
LAST_FRAGMENT = 2,
COMPLETE_ADVERTISEMENT = 3,
UNCHANGED_DATA = 4,
}
enum FragmentPreference : 1 {
CONTROLLER_MAY_FRAGMENT = 0,
CONTROLLER_SHOULD_NOT = 1,
}
packet LeSetExtendedAdvertisingData : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_DATA) {
advertising_handle : 8,
operation : Operation,
_reserved_ : 5,
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(advertising_data) : 8,
advertising_data : GapData[],
}
packet LeSetExtendedAdvertisingDataRaw : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_DATA) {
advertising_handle : 8,
operation : Operation,
_reserved_ : 5,
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(advertising_data) : 8,
advertising_data : 8[],
}
packet LeSetExtendedAdvertisingDataComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_DATA) {
status : ErrorCode,
}
packet LeSetExtendedAdvertisingScanResponse : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE) {
advertising_handle : 8,
operation : Operation,
_reserved_ : 5,
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(scan_response_data) : 8,
scan_response_data : GapData[],
}
packet LeSetExtendedAdvertisingScanResponseRaw : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE) {
advertising_handle : 8,
operation : Operation,
_reserved_ : 5,
fragment_preference : FragmentPreference,
_reserved_ : 7,
_size_(scan_response_data) : 8,
scan_response_data : 8[],
}
packet LeSetExtendedAdvertisingScanResponseComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_SCAN_RESPONSE) {
status : ErrorCode,
}
packet LeSetExtendedAdvertisingEnableDisableAll : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_ENABLE) {
_fixed_ = 0x00 : 8, // Enable::DISABLED
_fixed_ = 0x00 : 8, // Disable all sets
}
struct EnabledSet {
advertising_handle : 8,
duration : 16,
max_extended_advertising_events : 8,
}
struct DisabledSet {
advertising_handle : 8,
_fixed_ = 0x00 : 16, // duration
_fixed_ = 0x00 : 8, // max_extended_advertising_events
}
packet LeSetExtendedAdvertisingDisable : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_ENABLE) {
_fixed_ = 0x00 : 8, // Enable::DISABLED
_count_(disabled_sets) : 8,
disabled_sets : DisabledSet[],
}
packet LeSetExtendedAdvertisingEnable : LeAdvertisingCommand (op_code = LE_SET_EXTENDED_ADVERTISING_ENABLE) {
enable : Enable,
_count_(enabled_sets) : 8,
enabled_sets : EnabledSet[],
}
packet LeSetExtendedAdvertisingEnableComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_ADVERTISING_ENABLE) {
status : ErrorCode,
}
packet LeReadMaximumAdvertisingDataLength : CommandPacket (op_code = LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH) {
}
packet LeReadMaximumAdvertisingDataLengthComplete : CommandComplete (command_op_code = LE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH) {
status : ErrorCode,
maximum_advertising_data_length : 16,
}
packet LeReadNumberOfSupportedAdvertisingSets : CommandPacket (op_code = LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS) {
}
packet LeReadNumberOfSupportedAdvertisingSetsComplete : CommandComplete (command_op_code = LE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS) {
status : ErrorCode,
number_supported_advertising_sets : 8,
}
packet LeRemoveAdvertisingSet : LeAdvertisingCommand (op_code = LE_REMOVE_ADVERTISING_SET) {
advertising_handle : 8,
}
packet LeRemoveAdvertisingSetComplete : CommandComplete (command_op_code = LE_REMOVE_ADVERTISING_SET) {
status : ErrorCode,
}
packet LeClearAdvertisingSets : LeAdvertisingCommand (op_code = LE_CLEAR_ADVERTISING_SETS) {
}
packet LeClearAdvertisingSetsComplete : CommandComplete (command_op_code = LE_CLEAR_ADVERTISING_SETS) {
status : ErrorCode,
}
packet LeSetPeriodicAdvertisingParam : LeAdvertisingCommand (op_code = LE_SET_PERIODIC_ADVERTISING_PARAM) {
advertising_handle : 8,
periodic_advertising_interval_min : 16, // 0x006 to 0xFFFF (7.5 ms to 82s)
periodic_advertising_interval_max : 16, // 0x006 to 0xFFFF (7.5 ms to 82s)
_reserved_ : 6,
include_tx_power : 1,
_reserved_ : 9,
}
packet LeSetPeriodicAdvertisingParamComplete : CommandComplete (command_op_code = LE_SET_PERIODIC_ADVERTISING_PARAM) {
status : ErrorCode,
}
packet LeSetPeriodicAdvertisingData : LeAdvertisingCommand (op_code = LE_SET_PERIODIC_ADVERTISING_DATA) {
advertising_handle : 8,
operation : Operation,
_reserved_ : 5,
_size_(scan_response_data) : 8,
scan_response_data : 8[],
}
packet LeSetPeriodicAdvertisingDataComplete : CommandComplete (command_op_code = LE_SET_PERIODIC_ADVERTISING_DATA) {
status : ErrorCode,
}
packet LeSetPeriodicAdvertisingEnable : LeAdvertisingCommand (op_code = LE_SET_PERIODIC_ADVERTISING_ENABLE) {
advertising_handle : 8,
enable : Enable,
}
packet LeSetPeriodicAdvertisingEnableComplete : CommandComplete (command_op_code = LE_SET_PERIODIC_ADVERTISING_ENABLE) {
status : ErrorCode,
}
struct PhyScanParameters {
le_scan_type : LeScanType,
le_scan_interval : 16, // 0x0004-0xFFFF Default 0x10 (10ms)
le_scan_window : 16, // 0x004-0xFFFF Default 0x10 (10ms)
}
packet LeSetExtendedScanParameters : LeScanningCommand (op_code = LE_SET_EXTENDED_SCAN_PARAMETERS) {
own_address_type : AddressType,
scanning_filter_policy : LeSetScanningFilterPolicy,
scanning_phys : 8,
parameters : PhyScanParameters[],
}
packet LeSetExtendedScanParametersComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_SCAN_PARAMETERS) {
status : ErrorCode,
}
enum FilterDuplicates : 8 {
DISABLED = 0,
ENABLED = 1,
RESET_EACH_PERIOD = 2,
}
packet LeSetExtendedScanEnable : LeScanningCommand (op_code = LE_SET_EXTENDED_SCAN_ENABLE) {
enable : Enable,
filter_duplicates : FilterDuplicates,
duration : 16, // 0 - Scan continuously, N * 10 ms
period : 16, // 0 - Scan continuously, N * 1.28 sec
}
packet LeSetExtendedScanEnableComplete : CommandComplete (command_op_code = LE_SET_EXTENDED_SCAN_ENABLE) {
status : ErrorCode,
}
struct LeCreateConnPhyScanParameters {
scan_interval : 16, // 0x0004-0xFFFF
scan_window : 16, // < = LeScanInterval
conn_interval_min : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_interval_max : 16, // 0x0006-0x0C80 (7.5ms to 4s)
conn_latency : 16, // 0x0006-0x01F3
supervision_timeout : 16, // 0x00A to 0x0C80 (100ms to 32s)
min_ce_length : 16, // 0.625ms
max_ce_length : 16, // 0.625ms
}
packet LeExtendedCreateConnection : LeConnectionManagementCommand (op_code = LE_EXTENDED_CREATE_CONNECTION) {
initiator_filter_policy : InitiatorFilterPolicy,
own_address_type : OwnAddressType,
peer_address_type : AddressType,
peer_address : Address,
initiating_phys : 8,
phy_scan_parameters : LeCreateConnPhyScanParameters[],
}
packet LeExtendedCreateConnectionStatus : CommandStatus (command_op_code = LE_EXTENDED_CREATE_CONNECTION) {
}
packet LePeriodicAdvertisingCreateSync : LeAdvertisingCommand (op_code = LE_PERIODIC_ADVERTISING_CREATE_SYNC) {
_payload_, // placeholder (unimplemented)
}
packet LePeriodicAdvertisingCreateSyncCancel : LeAdvertisingCommand (op_code = LE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL) {
_payload_, // placeholder (unimplemented)
}
packet LePeriodicAdvertisingTerminateSync : LeAdvertisingCommand (op_code = LE_PERIODIC_ADVERTISING_TERMINATE_SYNC) {
_payload_, // placeholder (unimplemented)
}
packet LeAddDeviceToPeriodicAdvertisingList : LeAdvertisingCommand (op_code = LE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST) {
_payload_, // placeholder (unimplemented)
}
packet LeRemoveDeviceFromPeriodicAdvertisingList : LeAdvertisingCommand (op_code = LE_REMOVE_DEVICE_FROM_PERIODIC_ADVERTISING_LIST) {
_payload_, // placeholder (unimplemented)
}
packet LeClearPeriodicAdvertisingList : LeAdvertisingCommand (op_code = LE_CLEAR_PERIODIC_ADVERTISING_LIST) {
_payload_, // placeholder (unimplemented)
}
packet LeReadPeriodicAdvertisingListSize : LeAdvertisingCommand (op_code = LE_READ_PERIODIC_ADVERTISING_LIST_SIZE) {
_payload_, // placeholder (unimplemented)
}
packet LeReadTransmitPower : LeAdvertisingCommand (op_code = LE_READ_TRANSMIT_POWER) {
_payload_, // placeholder (unimplemented)
}
packet LeReadRfPathCompensationPower : LeAdvertisingCommand (op_code = LE_READ_RF_PATH_COMPENSATION_POWER) {
_payload_, // placeholder (unimplemented)
}
packet LeWriteRfPathCompensationPower : LeAdvertisingCommand (op_code = LE_WRITE_RF_PATH_COMPENSATION_POWER) {
_payload_, // placeholder (unimplemented)
}
enum PrivacyMode : 8 {
NETWORK = 0,
DEVICE = 1,
}
packet LeSetPrivacyMode : LeSecurityCommand (op_code = LE_SET_PRIVACY_MODE) {
peer_identity_address_type : PeerAddressType,
peer_identity_address : Address,
privacy_mode : PrivacyMode,
}
packet LeSetPrivacyModeComplete : CommandComplete (command_op_code = LE_SET_PRIVACY_MODE) {
status : ErrorCode,
}
enum UseDebugKey : 8 {
USE_GENERATED_KEY = 0,
USE_DEBUG_KEY = 1,
}
packet LeGenerateDhkeyCommand : LeSecurityCommand (op_code = LE_GENERATE_DHKEY_COMMAND) {
remote_p_256_public_key : 8[64],
key_type : UseDebugKey,
}
packet LeGenerateDhkeyCommandStatus : CommandStatus (command_op_code = LE_GENERATE_DHKEY_COMMAND) {
}
// VENDOR_SPECIFIC
packet LeGetVendorCapabilities : VendorCommand (op_code = LE_GET_VENDOR_CAPABILITIES) {
}
struct VendorCapabilities {
is_supported : 8,
max_advt_instances: 8,
offloaded_resolution_of_private_address : 8,
total_scan_results_storage: 16,
max_irk_list_sz: 8,
filtering_support: 8,
max_filter: 8,
activity_energy_info_support: 8,
version_supported: 16,
total_num_of_advt_tracked: 16,
extended_scan_support: 8,
debug_logging_supported: 8,
le_address_generation_offloading_support: 8,
a2dp_source_offload_capability_mask: 32,
bluetooth_quality_report_support: 8
}
struct BaseVendorCapabilities {
max_advt_instances: 8,
offloaded_resolution_of_private_address : 8,
total_scan_results_storage: 16,
max_irk_list_sz: 8,
filtering_support: 8,
max_filter: 8,
activity_energy_info_support: 8,
}
packet LeGetVendorCapabilitiesComplete : CommandComplete (command_op_code = LE_GET_VENDOR_CAPABILITIES) {
status : ErrorCode,
base_vendor_capabilities : BaseVendorCapabilities,
_payload_,
}
packet LeGetVendorCapabilitiesComplete095 : LeGetVendorCapabilitiesComplete {
version_supported: 16,
total_num_of_advt_tracked: 16,
extended_scan_support: 8,
debug_logging_supported: 8,
_payload_,
}
packet LeGetVendorCapabilitiesComplete096 : LeGetVendorCapabilitiesComplete095 {
le_address_generation_offloading_support: 8,
_payload_,
}
packet LeGetVendorCapabilitiesComplete098 : LeGetVendorCapabilitiesComplete096 {
a2dp_source_offload_capability_mask: 32,
bluetooth_quality_report_support: 8
}
enum SubOcf : 8 {
SET_PARAM = 0x01,
SET_DATA = 0x02,
SET_SCAN_RESP = 0x03,
SET_RANDOM_ADDR = 0x04,
SET_ENABLE = 0x05,
}
packet LeMultiAdvt : LeAdvertisingCommand (op_code = LE_MULTI_ADVT) {
sub_cmd : SubOcf,
_body_,
}
packet LeMultiAdvtComplete : CommandComplete (command_op_code = LE_MULTI_ADVT) {
status : ErrorCode,
sub_cmd : SubOcf,
}
packet LeMultiAdvtParam : LeMultiAdvt (sub_cmd = SET_PARAM) {
interval_min : 16,
interval_max : 16,
type : AdvertisingEventType,
own_address_type : AddressType,
peer_address_type : PeerAddressType,
peer_address : Address,
channel_map : 8,
filter_policy : AdvertisingFilterPolicy,
_reserved_ : 6,
instance : 8,
tx_power : 8,
}
packet LeMultiAdvtParamComplete : LeMultiAdvtComplete (sub_cmd = SET_PARAM) {
}
packet LeMultiAdvtSetData : LeMultiAdvt (sub_cmd = SET_DATA) {
_size_(advertising_data) : 8,
advertising_data : GapData[],
_padding_[36], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size + 1 set
advertising_instance : 8,
}
packet LeMultiAdvtSetDataComplete : LeMultiAdvtComplete (sub_cmd = SET_DATA) {
}
packet LeMultiAdvtSetScanResp : LeMultiAdvt (sub_cmd = SET_SCAN_RESP) {
_size_(advertising_data) : 8,
advertising_data : GapData[],
_padding_[36], // Zero padding to 31 bytes of advertising_data + 1 size + 2 opcode + 1 total_size + 1 set
advertising_instance : 8,
}
packet LeMultiAdvtSetScanRespComplete : LeMultiAdvtComplete (sub_cmd = SET_SCAN_RESP) {
}
packet LeMultiAdvtSetRandomAddr : LeMultiAdvt (sub_cmd = SET_RANDOM_ADDR) {
random_address : Address,
advertising_instance : 8,
}
packet LeMultiAdvtSetRandomAddrComplete : LeMultiAdvtComplete (sub_cmd = SET_RANDOM_ADDR) {
}
packet LeMultiAdvtSetEnable : LeMultiAdvt (sub_cmd = SET_ENABLE) {
advertising_enable : Enable, // Default DISABLED
advertising_instance : 8,
}
packet LeMultiAdvtSetEnableComplete : LeMultiAdvtComplete (sub_cmd = SET_ENABLE) {
}
packet LeBatchScan : VendorCommand (op_code = LE_BATCH_SCAN) {
_payload_, // placeholder (unimplemented)
}
enum ApcfOpcode : 8 {
ENABLE = 0x00,
SET_FILTERING_PARAMETERS = 0x01,
BROADCASTER_ADDRESS = 0x02,
SERVICE_UUID = 0x03,
SERVICE_SOLICITATION_UUID = 0x04,
LOCAL_NAME = 0x05,
MANUFACTURER_DATA = 0x06,
SERVICE_DATA = 0x07,
}
packet LeAdvFilter : LeScanningCommand (op_code = LE_ADV_FILTER) {
apcf_opcode : ApcfOpcode,
_body_,
}
packet LeAdvFilterComplete : CommandComplete (command_op_code = LE_ADV_FILTER) {
status : ErrorCode,
apcf_opcode : ApcfOpcode,
}
packet LeTrackAdv : VendorCommand (op_code = LE_TRACK_ADV) {
_payload_, // placeholder (unimplemented)
}
packet LeEnergyInfo : VendorCommand (op_code = LE_ENERGY_INFO) {
_payload_, // placeholder (unimplemented)
}
packet LeExtendedScanParams : LeScanningCommand (op_code = LE_EXTENDED_SCAN_PARAMS) {
le_scan_type : LeScanType,
le_scan_interval : 32, // 0x0004-0x4000 Default 0x10 (10ms)
le_scan_window : 32, // Default 0x10 (10ms)
own_address_type : AddressType,
scanning_filter_policy : LeSetScanningFilterPolicy,
}
packet LeExtendedScanParamsComplete : CommandComplete (command_op_code = LE_EXTENDED_SCAN_PARAMS) {
status : ErrorCode,
}
packet ControllerDebugInfo : VendorCommand (op_code = CONTROLLER_DEBUG_INFO) {
_payload_, // placeholder (unimplemented)
}
packet ControllerA2DPOpcode : VendorCommand (op_code = CONTROLLER_A2DP_OPCODE) {
_payload_, // placeholder (unimplemented)
}
enum BqrReportAction : 8 {
ADD = 0x00,
DELETE = 0x01,
CLEAR = 0x02,
}
packet ControllerBqr : VendorCommand(op_code = CONTROLLER_BQR) {
bqr_report_action : BqrReportAction,
bqr_quality_event_mask : 32,
bqr_minimum_report_interval : 16,
}
packet ControllerBqrComplete : CommandComplete (command_op_code = CONTROLLER_BQR) {
status : ErrorCode,
current_quality_event_mask : 32
}
// HCI Event Packets
packet InquiryComplete : EventPacket (event_code = INQUIRY_COMPLETE){
status : ErrorCode,
}
struct InquiryResult {
bd_addr : Address,
page_scan_repetition_mode : PageScanRepetitionMode,
_reserved_ : 8,
_reserved_ : 8,
class_of_device : ClassOfDevice,
clock_offset : 15,
_reserved_ : 1,
}
packet InquiryResult : EventPacket (event_code = INQUIRY_RESULT){
_count_(inquiry_results) : 8,
inquiry_results : InquiryResult[],
}
enum LinkType : 8 {
SCO = 0x00,
ACL = 0x01,
}
packet ConnectionComplete : EventPacket (event_code = CONNECTION_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
bd_addr : Address,
link_type : LinkType,
encryption_enabled : Enable,
}
enum ConnectionRequestLinkType : 8 {
SCO = 0x00,
ACL = 0x01,
ESCO = 0x02,
}
packet ConnectionRequest : EventPacket (event_code = CONNECTION_REQUEST){
bd_addr : Address,
class_of_device : ClassOfDevice,
link_type : ConnectionRequestLinkType,
}
packet DisconnectionComplete : EventPacket (event_code = DISCONNECTION_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
reason : ErrorCode,
}
packet AuthenticationComplete : EventPacket (event_code = AUTHENTICATION_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet RemoteNameRequestComplete : EventPacket (event_code = REMOTE_NAME_REQUEST_COMPLETE){
status : ErrorCode,
bd_addr : Address,
remote_name : 8[248], // UTF-8 encoded user-friendly descriptive name
}
enum EncryptionEnabled : 8 {
OFF = 0x00,
ON = 0x01, // E0 for BR/EDR and AES-CCM for LE
BR_EDR_AES_CCM = 0x02,
}
packet EncryptionChange : EventPacket (event_code = ENCRYPTION_CHANGE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
encryption_enabled : EncryptionEnabled,
}
packet ChangeConnectionLinkKeyComplete : EventPacket (event_code = CHANGE_CONNECTION_LINK_KEY_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet MasterLinkKeyComplete : EventPacket (event_code = MASTER_LINK_KEY_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
key_flag : KeyFlag,
}
packet ReadRemoteSupportedFeaturesComplete : EventPacket (event_code = READ_REMOTE_SUPPORTED_FEATURES_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
lmp_features : 64,
}
packet ReadRemoteVersionInformationComplete : EventPacket (event_code = READ_REMOTE_VERSION_INFORMATION_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
version : 8,
manufacturer_name : 16,
sub_version : 16,
}
packet QosSetupComplete : EventPacket (event_code = QOS_SETUP_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
_reserved_ : 8,
service_type : ServiceType,
token_rate : 32, // Octets/s
peak_bandwidth : 32, // Octets/s
latency : 32, // Octets/s
delay_variation : 32, // microseconds
}
// Command Complete and Command Status Events are implemented above Commands.
packet HardwareError : EventPacket (event_code = HARDWARE_ERROR){
hardware_code : 8,
}
packet FlushOccurred : EventPacket (event_code = FLUSH_OCCURRED){
connection_handle : 12,
_reserved_ : 4,
}
packet RoleChange : EventPacket (event_code = ROLE_CHANGE){
status : ErrorCode,
bd_addr : Address,
new_role : Role,
}
packet NumberOfCompletedPackets : EventPacket (event_code = NUMBER_OF_COMPLETED_PACKETS){
_count_(completed_packets) : 8,
completed_packets : CompletedPackets[],
}
enum Mode : 8 {
ACTIVE = 0x00,
HOLD = 0x01,
SNIFF = 0x02,
}
packet ModeChange : EventPacket (event_code = MODE_CHANGE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
current_mode : Mode,
interval : 16, // 0x002 - 0xFFFE (1.25ms - 40.9s)
}
struct ZeroKeyAndAddress {
address : Address,
_fixed_ = 0 : 64,
_fixed_ = 0 : 64,
}
packet ReturnLinkKeys : EventPacket (event_code = RETURN_LINK_KEYS){
_count_(keys) : 8,
keys : ZeroKeyAndAddress[],
}
packet PinCodeRequest : EventPacket (event_code = PIN_CODE_REQUEST){
bd_addr : Address,
}
packet LinkKeyRequest : EventPacket (event_code = LINK_KEY_REQUEST){
bd_addr : Address,
}
enum KeyType : 8 {
COMBINATION = 0x00,
DEBUG_COMBINATION = 0x03,
UNAUTHENTICATED_P192 = 0x04,
AUTHENTICATED_P192 = 0x05,
CHANGED = 0x06,
UNAUTHENTICATED_P256 = 0x07,
AUTHENTICATED_P256 = 0x08,
}
packet LinkKeyNotification : EventPacket (event_code = LINK_KEY_NOTIFICATION){
bd_addr : Address,
link_key : 8[16],
key_type : KeyType,
}
packet LoopbackCommand : EventPacket (event_code = LOOPBACK_COMMAND){
_payload_, // Command packet, truncated if it was longer than 252 bytes
}
packet DataBufferOverflow : EventPacket (event_code = DATA_BUFFER_OVERFLOW){
link_type : LinkType,
}
packet MaxSlotsChange : EventPacket (event_code = MAX_SLOTS_CHANGE){
connection_handle : 12,
_reserved_ : 4,
lmp_max_slots : 8,
}
packet ReadClockOffsetComplete : EventPacket (event_code = READ_CLOCK_OFFSET_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
clock_offset : 15,
_reserved_ : 1,
}
packet ConnectionPacketTypeChanged : EventPacket (event_code = CONNECTION_PACKET_TYPE_CHANGED){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
packet_type : 16,
}
packet QosViolation : EventPacket (event_code = QOS_VIOLATION){
_payload_, // placeholder (unimplemented)
}
packet PageScanRepetitionModeChange : EventPacket (event_code = PAGE_SCAN_REPETITION_MODE_CHANGE){
_payload_, // placeholder (unimplemented)
}
packet FlowSpecificationComplete : EventPacket (event_code = FLOW_SPECIFICATION_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
_reserved_ : 8,
flow_direction : FlowDirection,
service_type : ServiceType,
token_rate : 32, // Octets/s
token_bucket_size : 32,
peak_bandwidth : 32, // Octets/s
access_latency : 32, // Octets/s
}
struct InquiryResultWithRssi {
address : Address,
page_scan_repetition_mode : PageScanRepetitionMode,
_reserved_ : 8,
class_of_device : ClassOfDevice,
clock_offset : 15,
_reserved_ : 1,
rssi : 8,
}
packet InquiryResultWithRssi : EventPacket (event_code = INQUIRY_RESULT_WITH_RSSI){
_count_(inquiry_results) : 8,
inquiry_results : InquiryResultWithRssi[],
}
packet ReadRemoteExtendedFeaturesComplete : EventPacket (event_code = READ_REMOTE_EXTENDED_FEATURES_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
page_number : 8,
maximum_page_number : 8,
extended_lmp_features : 64,
}
packet SynchronousConnectionComplete : EventPacket (event_code = SYNCHRONOUS_CONNECTION_COMPLETE){
_payload_, // placeholder (unimplemented)
}
packet SynchronousConnectionChanged : EventPacket (event_code = SYNCHRONOUS_CONNECTION_CHANGED){
_payload_, // placeholder (unimplemented)
}
packet SniffSubratingEvent : EventPacket (event_code = SNIFF_SUBRATING){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
maximum_transmit_latency : 16, // 0x000 - 0xFFFE (0s - 40.9s)
maximum_receive_latency : 16, // 0x000 - 0xFFFE (0s - 40.9s)
minimum_remote_timeout : 16, // 0x000 - 0xFFFE (0s - 40.9s)
minimum_local_timeout : 16, // 0x000 - 0xFFFE (0s - 40.9s)
}
packet ExtendedInquiryResult : EventPacket (event_code = EXTENDED_INQUIRY_RESULT) {
_fixed_ = 0x01 : 8,
address : Address,
page_scan_repetition_mode : PageScanRepetitionMode,
_reserved_ : 8,
class_of_device : ClassOfDevice,
clock_offset : 15,
_reserved_ : 1,
rssi : 8,
extended_inquiry_response : GapData[],
}
packet EncryptionKeyRefreshComplete : EventPacket (event_code = ENCRYPTION_KEY_REFRESH_COMPLETE){
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
}
packet IoCapabilityRequest : EventPacket (event_code = IO_CAPABILITY_REQUEST){
bd_addr : Address,
}
packet IoCapabilityResponse : EventPacket (event_code = IO_CAPABILITY_RESPONSE){
bd_addr : Address,
io_capability : IoCapability,
oob_data_present : OobDataPresent,
authentication_requirements : AuthenticationRequirements,
}
packet UserConfirmationRequest : EventPacket (event_code = USER_CONFIRMATION_REQUEST){
bd_addr : Address,
numeric_value : 20, // 0x00000-0xF423F (000000 - 999999)
_reserved_ : 12,
}
packet UserPasskeyRequest : EventPacket (event_code = USER_PASSKEY_REQUEST){
bd_addr : Address,
}
packet RemoteOobDataRequest : EventPacket (event_code = REMOTE_OOB_DATA_REQUEST){
bd_addr : Address,
}
packet SimplePairingComplete : EventPacket (event_code = SIMPLE_PAIRING_COMPLETE){
status : ErrorCode,
bd_addr : Address,
}
packet LinkSupervisionTimeoutChanged : EventPacket (event_code = LINK_SUPERVISION_TIMEOUT_CHANGED){
connection_handle : 12,
_reserved_ : 4,
link_supervision_timeout : 16, // 0x001-0xFFFF (0.625ms-40.9s)
}
packet EnhancedFlushComplete : EventPacket (event_code = ENHANCED_FLUSH_COMPLETE){
connection_handle : 12,
_reserved_ : 4,
}
packet UserPasskeyNotification : EventPacket (event_code = USER_PASSKEY_NOTIFICATION){
bd_addr : Address,
passkey : 20, // 0x00000-0xF423F (000000 - 999999)
_reserved_ : 12,
}
packet KeypressNotification : EventPacket (event_code = KEYPRESS_NOTIFICATION){
bd_addr : Address,
notification_type : KeypressNotificationType,
}
packet RemoteHostSupportedFeaturesNotification : EventPacket (event_code = REMOTE_HOST_SUPPORTED_FEATURES_NOTIFICATION){
bd_addr : Address,
host_supported_features : 64,
}
packet LeMetaEvent : EventPacket (event_code = LE_META_EVENT) {
subevent_code : SubeventCode,
_payload_,
}
packet NumberOfCompletedDataBlocks : EventPacket (event_code = NUMBER_OF_COMPLETED_DATA_BLOCKS){
_payload_, // placeholder (unimplemented)
}
// LE Events
enum MasterClockAccuracy : 8 {
PPM_500 = 0x00,
PPM_250 = 0x01,
PPM_150 = 0x02,
PPM_100 = 0x03,
PPM_75 = 0x04,
PPM_50 = 0x05,
PPM_30 = 0x06,
PPM_20 = 0x07,
}
packet LeConnectionComplete : LeMetaEvent (subevent_code = CONNECTION_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
role : Role,
peer_address_type : AddressType,
peer_address : Address,
conn_interval : 16, // 0x006 - 0x0C80 (7.5ms - 4000ms)
conn_latency : 16, // Number of connection events
supervision_timeout : 16, // 0x000A to 0x0C80 (100ms to 32s)
master_clock_accuracy : MasterClockAccuracy,
}
struct LeAdvertisingReport {
event_type : AdvertisingEventType,
address_type : AddressType,
address : Address,
_size_(advertising_data) : 8,
advertising_data : GapData[],
rssi : 8,
}
packet LeAdvertisingReport : LeMetaEvent (subevent_code = ADVERTISING_REPORT) {
_count_(advertising_reports) : 8,
advertising_reports : LeAdvertisingReport[],
}
packet LeConnectionUpdateComplete : LeMetaEvent (subevent_code = CONNECTION_UPDATE_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
conn_interval : 16, // 0x006 - 0x0C80 (7.5ms - 4000ms)
conn_latency : 16, // Number of connection events
supervision_timeout : 16, // 0x000A to 0x0C80 (100ms to 32s)
}
packet LeReadRemoteFeaturesComplete : LeMetaEvent (subevent_code = READ_REMOTE_FEATURES_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
le_features : 64,
}
packet LeLongTermKeyRequest : LeMetaEvent (subevent_code = LONG_TERM_KEY_REQUEST) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
random_number : 64,
encrypted_diversifier : 16,
}
packet LeRemoteConnectionParameterRequest : LeMetaEvent (subevent_code = REMOTE_CONNECTION_PARAMETER_REQUEST) {
connection_handle : 12,
_reserved_ : 4,
interval_min : 16, // 0x006 - 0x0C80 (7.5ms - 4s)
interval_max : 16, // 0x006 - 0x0C80 (7.5ms - 4s)
latency : 16, // Number of connection events (0x0000 to 0x01f3 (499)
timeout : 16, // 0x000A to 0x0C80 (100ms to 32s)
}
packet LeDataLengthChange : LeMetaEvent (subevent_code = DATA_LENGTH_CHANGE) {
connection_handle : 12,
_reserved_ : 4,
max_tx_octets : 16, // 0x001B - 0x00FB
max_tx_time : 16, // 0x0148 - 0x4290
max_rx_octets : 16, // 0x001B - 0x00FB
max_rx_time : 16, // 0x0148 - 0x4290
}
packet ReadLocalP256PublicKeyComplete : LeMetaEvent (subevent_code = READ_LOCAL_P256_PUBLIC_KEY_COMPLETE) {
status : ErrorCode,
local_p_256_public_key : 8[64],
}
packet GenerateDhKeyComplete : LeMetaEvent (subevent_code = GENERATE_DHKEY_COMPLETE) {
status : ErrorCode,
dh_key : 8[32],
}
packet LeEnhancedConnectionComplete : LeMetaEvent (subevent_code = ENHANCED_CONNECTION_COMPLETE) {
status : ErrorCode,
connection_handle : 12,
_reserved_ : 4,
role : Role,
peer_address_type : AddressType,
peer_address : Address,
local_resolvable_private_address : Address,
peer_resolvable_private_address : Address,
conn_interval : 16, // 0x006 - 0x0C80 (7.5ms - 4000ms)
conn_latency : 16, // Number of connection events
supervision_timeout : 16, // 0x000A to 0x0C80 (100ms to 32s)
master_clock_accuracy : MasterClockAccuracy,
}
enum DirectAdvertisingAddressType : 8 {
PUBLIC_DEVICE_ADDRESS = 0x00,
RANDOM_DEVICE_ADDRESS = 0x01,
PUBLIC_IDENTITY_ADDRESS = 0x02,
RANDOM_IDENTITY_ADDRESS = 0x03,
CONTROLLER_UNABLE_TO_RESOLVE = 0xFE,
NO_ADDRESS = 0xFF,
}
enum DirectAdvertisingEventType : 8 {
ADV_DIRECT_IND = 0x01,
}
enum DirectAddressType : 8 {
RANDOM_DEVICE_ADDRESS = 0x01,
}
struct LeDirectedAdvertisingReport {
event_type : DirectAdvertisingEventType,
address_type : DirectAdvertisingAddressType,
address : Address,
direct_address_type : DirectAddressType,
direct_address : Address,
rssi : 8,
}
packet LeDirectedAdvertisingReport : LeMetaEvent (subevent_code = DIRECTED_ADVERTISING_REPORT) {
_count_(advertising_reports) : 8,
advertising_reports : LeDirectedAdvertisingReport[],
}
packet LePhyUpdateComplete : LeMetaEvent (subevent_code = PHY_UPDATE_COMPLETE) {
_payload_, // placeholder (unimplemented)
}
enum DataStatus : 2 {
COMPLETE = 0x0,
CONTINUING = 0x1,
TRUNCATED = 0x2,
RESERVED = 0x3,
}
struct LeExtendedAdvertisingReport {
connectable : 1,
scannable : 1,
directed : 1,
scan_response : 1,
data_status : DataStatus,
_reserved_ : 10,
address_type : DirectAdvertisingAddressType,
address : Address,
primary_phy : PrimaryPhyType,
secondary_phy : SecondaryPhyType,
advertising_sid : 4, // SID subfield in the ADI field
_reserved_ : 4,
tx_power : 8,
rssi : 8, // -127 to +20 (0x7F means not available)
periodic_advertising_interval : 16, // 0x006 to 0xFFFF (7.5 ms to 82s)
direct_address_type : DirectAdvertisingAddressType,
direct_address : Address,
_size_(advertising_data) : 8,
advertising_data : GapData[],
}
packet LeExtendedAdvertisingReport : LeMetaEvent (subevent_code = EXTENDED_ADVERTISING_REPORT) {
_count_(advertising_reports) : 8,
advertising_reports : LeExtendedAdvertisingReport[],
}
packet LePeriodicAdvertisingSyncEstablished : LeMetaEvent (subevent_code = PERIODIC_ADVERTISING_SYNC_ESTABLISHED) {
_payload_, // placeholder (unimplemented)
}
packet LePeriodicAdvertisingReport : LeMetaEvent (subevent_code = PERIODIC_ADVERTISING_REPORT) {
_payload_, // placeholder (unimplemented)
}
packet LePeriodicAdvertisingSyncLost : LeMetaEvent (subevent_code = PERIODIC_ADVERTISING_SYNC_LOST) {
_payload_, // placeholder (unimplemented)
}
packet LeScanTimeout : LeMetaEvent (subevent_code = SCAN_TIMEOUT) {
}
packet LeAdvertisingSetTerminated : LeMetaEvent (subevent_code = ADVERTISING_SET_TERMINATED) {
status : ErrorCode,
advertising_handle : 8,
connection_handle : 12,
_reserved_ : 4,
num_completed_extended_advertising_events : 8,
}
packet LeScanRequestReceived : LeMetaEvent (subevent_code = SCAN_REQUEST_RECEIVED) {
advertising_handle : 8,
scanner_address_type : AddressType,
scanner_address : Address,
}
// Vendor specific events
packet VendorSpecificEvent : EventPacket (event_code = VENDOR_SPECIFIC) {
subevent_code : VseSubeventCode,
_payload_,
}
enum qualityReportId : 8 {
MONITOR_MODE = 0x01,
APPROACH_LSTO = 0x02,
A2DP_AUDIO_CHOPPY = 0x03,
SCO_VOICE_CHOPPY = 0x04,
ROOT_INFLAMMATION = 0x05,
LMP_LL_MESSAGE_TRACE = 0x11,
BT_SCHEDULING_TRACE = 0x12,
CONTROLLER_DBG_INFO = 0x13,
}
packet BqrEvent : VendorSpecificEvent (subevent_code = BQR_EVENT) {
quality_report_id : qualityReportId,
_payload_,
}
enum BqrPacketType : 8 {
TYPE_ID = 0x01,
TYPE_NULL = 0x02,
TYPE_POLL = 0x03,
TYPE_FHS = 0x04,
TYPE_HV1 = 0x05,
TYPE_HV2 = 0x06,
TYPE_HV3 = 0x07,
TYPE_DV = 0x08,
TYPE_EV3 = 0x09,
TYPE_EV4 = 0x0A,
TYPE_EV5 = 0x0B,
TYPE_2EV3 = 0x0C,
TYPE_2EV5 = 0x0D,
TYPE_3EV3 = 0x0E,
TYPE_3EV5 = 0x0F,
TYPE_DM1 = 0x10,
TYPE_DH1 = 0x11,
TYPE_DM3 = 0x12,
TYPE_DH3 = 0x13,
TYPE_DM5 = 0x14,
TYPE_DH5 = 0x15,
TYPE_AUX1 = 0x16,
TYPE_2DH1 = 0x17,
TYPE_2DH3 = 0x18,
TYPE_2DH5 = 0x19,
TYPE_3DH1 = 0x1A,
TYPE_3DH3 = 0x1B,
TYPE_3DH5 = 0x1C,
}
packet BqrLinkQualityEvent : BqrEvent {
packet_type : BqrPacketType,
connection_handle : 12,
_reserved_ : 4,
connection_role : Role,
tx_power_level : 8,
rssi : 8,
snr : 8,
unused_afh_channel_count : 8,
afh_select_unideal_channel_count : 8,
lsto : 16,
connection_piconet_clock : 32,
retransmission_count : 32,
no_rx_count : 32,
nak_count : 32,
last_tx_ack_timestamp : 32,
flow_off_count : 32,
last_flow_on_timestamp : 32,
buffer_overflow_bytes : 32,
buffer_underflow_bytes : 32,
_payload_,
}
packet BqrMonitorModeEvent : BqrLinkQualityEvent (quality_report_id = MONITOR_MODE) {
_payload_, // vendor specific parameter
}
packet BqrApproachLstoEvent : BqrLinkQualityEvent (quality_report_id = APPROACH_LSTO) {
_payload_, // vendor specific parameter
}
packet BqrA2dpAudioChoppyEvent : BqrLinkQualityEvent (quality_report_id = A2DP_AUDIO_CHOPPY) {
_payload_, // vendor specific parameter
}
packet BqrScoVoiceChoppyEvent : BqrLinkQualityEvent (quality_report_id = SCO_VOICE_CHOPPY) {
_payload_, // vendor specific parameter
}
packet BqrRootInflammationEvent : BqrEvent (quality_report_id = ROOT_INFLAMMATION) {
error_code : 8,
vendor_specific_error_code : 8,
_payload_, // vendor specific parameter
}
packet BqrLogDumpEvent : BqrEvent {
connection_handle : 12,
_reserved_ : 4,
_payload_,
}
packet BqrLmpLlMessageTraceEvent : BqrLogDumpEvent (quality_report_id = LMP_LL_MESSAGE_TRACE) {
_payload_, // vendor specific parameter
}
packet BqrBtSchedulingTraceEvent : BqrLogDumpEvent (quality_report_id = BT_SCHEDULING_TRACE) {
_payload_, // vendor specific parameter
}
packet BqrControllerDbgInfoEvent : BqrLogDumpEvent (quality_report_id = CONTROLLER_DBG_INFO) {
_payload_, // vendor specific parameter
}