1/* 2 * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com 3 * Copyright 2008 Mika Lindqvist, monni1995_at_gmail.com 4 * All rights reserved. Distributed under the terms of the MIT License. 5 */ 6#ifndef _BTHCI_EVENT_H_ 7#define _BTHCI_EVENT_H_ 8 9#include <bluetooth/bluetooth.h> 10#include <bluetooth/HCI/btHCI.h> 11 12#define HCI_EVENT_HDR_SIZE 2 13 14struct hci_event_header { 15 uint8 ecode; 16 uint8 elen; 17} __attribute__ ((packed)); 18 19 20/* ---- HCI Events ---- */ 21#define HCI_EVENT_INQUIRY_COMPLETE 0x01 22 23#define HCI_EVENT_INQUIRY_RESULT 0x02 24struct inquiry_info { 25 bdaddr_t bdaddr; 26 uint8 pscan_rep_mode; 27 uint8 pscan_period_mode; 28 uint8 pscan_mode; 29 uint8 dev_class[3]; 30 uint16 clock_offset; 31} __attribute__ ((packed)); 32 33#define HCI_EVENT_CONN_COMPLETE 0x03 34struct hci_ev_conn_complete { 35 uint8 status; 36 uint16 handle; 37 bdaddr_t bdaddr; 38 uint8 link_type; 39 uint8 encrypt_mode; 40} __attribute__ ((packed)); 41 42#define HCI_EVENT_CONN_REQUEST 0x04 43struct hci_ev_conn_request { 44 bdaddr_t bdaddr; 45 uint8 dev_class[3]; 46 uint8 link_type; 47} __attribute__ ((packed)); 48 49#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05 50struct hci_ev_disconnection_complete_reply { 51 uint8 status; 52 uint16 handle; 53 uint8 reason; 54} __attribute__ ((packed)); 55 56#define HCI_EVENT_AUTH_COMPLETE 0x06 57struct hci_ev_auth_complete { 58 uint8 status; 59 uint16 handle; 60} __attribute__ ((packed)); 61 62#define HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07 63struct hci_ev_remote_name_request_complete_reply { 64 uint8 status; 65 bdaddr_t bdaddr; 66 char remote_name[248]; 67} __attribute__ ((packed)); 68 69#define HCI_EVENT_ENCRYPT_CHANGE 0x08 70struct hci_ev_encrypt_change { 71 uint8 status; 72 uint16 handle; 73 uint8 encrypt; 74} __attribute__ ((packed)); 75 76#define HCI_EVENT_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 77struct hci_ev_change_conn_link_key_complete { 78 uint8 status; 79 uint16 handle; 80} __attribute__ ((packed)); 81 82#define HCI_EVENT_MASTER_LINK_KEY_COMPL 0x0a 83struct hci_ev_master_link_key_complete { 84 uint8 status; /* 0x00 - success */ 85 uint16 handle; /* Connection handle */ 86 uint8 key_flag; /* Key flag */ 87} __attribute__ ((packed)); 88 89#define HCI_EVENT_RMT_FEATURES 0x0B 90struct hci_ev_rmt_features { 91 uint8 status; 92 uint16 handle; 93 uint8 features[8]; 94} __attribute__ ((packed)); 95 96#define HCI_EVENT_RMT_VERSION 0x0C 97struct hci_ev_rmt_version { 98 uint8 status; 99 uint16 handle; 100 uint8 lmp_ver; 101 uint16 manufacturer; 102 uint16 lmp_subver; 103} __attribute__ ((packed)); 104 105#define HCI_EVENT_QOS_SETUP_COMPLETE 0x0D 106struct hci_qos { 107 uint8 service_type; 108 uint32 token_rate; 109 uint32 peak_bandwidth; 110 uint32 latency; 111 uint32 delay_variation; 112} __attribute__ ((packed)); 113struct hci_ev_qos_setup_complete { 114 uint8 status; 115 uint16 handle; 116 struct hci_qos qos; 117} __attribute__ ((packed)); 118 119#define HCI_EVENT_CMD_COMPLETE 0x0E 120struct hci_ev_cmd_complete { 121 uint8 ncmd; 122 uint16 opcode; 123} __attribute__ ((packed)); 124 125#define HCI_EVENT_CMD_STATUS 0x0F 126struct hci_ev_cmd_status { 127 uint8 status; 128 uint8 ncmd; 129 uint16 opcode; 130} __attribute__ ((packed)); 131 132#define HCI_EVENT_HARDWARE_ERROR 0x10 133struct hci_ev_hardware_error { 134 uint8 hardware_code; /* hardware error code */ 135} __attribute__ ((packed)) ; 136 137#define HCI_EVENT_FLUSH_OCCUR 0x11 138struct hci_ev_flush_occur { 139 uint16 handle; /* connection handle */ 140} __attribute__ ((packed)) ; 141 142#define HCI_EVENT_ROLE_CHANGE 0x12 143struct hci_ev_role_change { 144 uint8 status; 145 bdaddr_t bdaddr; 146 uint8 role; 147} __attribute__ ((packed)); 148 149#define HCI_EVENT_NUM_COMP_PKTS 0x13 150struct handle_and_number { 151 uint16 handle; 152 uint16 num_completed; 153} __attribute__ ((packed)); 154 155struct hci_ev_num_comp_pkts { 156 uint8 num_hndl; 157 // struct handle_and_number; hardcoded... 158} __attribute__ ((packed)); 159 160#define HCI_EVENT_MODE_CHANGE 0x14 161struct hci_ev_mode_change { 162 uint8 status; 163 uint16 handle; 164 uint8 mode; 165 uint16 interval; 166} __attribute__ ((packed)); 167 168#define HCI_EVENT_RETURN_LINK_KEYS 0x15 169struct link_key_info { 170 bdaddr_t bdaddr; 171 linkkey_t link_key; 172} __attribute__ ((packed)) ; 173struct hci_ev_return_link_keys { 174 uint8 num_keys; /* # of keys */ 175 struct link_key_info link_keys; /* As much as num_keys param */ 176} __attribute__ ((packed)) ; 177 178#define HCI_EVENT_PIN_CODE_REQ 0x16 179struct hci_ev_pin_code_req { 180 bdaddr_t bdaddr; 181} __attribute__ ((packed)); 182 183#define HCI_EVENT_LINK_KEY_REQ 0x17 184struct hci_ev_link_key_req { 185 bdaddr_t bdaddr; 186} __attribute__ ((packed)); 187 188#define HCI_EVENT_LINK_KEY_NOTIFY 0x18 189struct hci_ev_link_key_notify { 190 bdaddr_t bdaddr; 191 linkkey_t link_key; 192 uint8 key_type; 193} __attribute__ ((packed)); 194 195#define HCI_EVENT_LOOPBACK_COMMAND 0x19 196struct hci_ev_loopback_command { 197 uint8 command[0]; /* depends of command */ 198} __attribute__ ((packed)) ; 199 200#define HCI_EVENT_DATA_BUFFER_OVERFLOW 0x1a 201struct hci_ev_data_buffer_overflow { 202 uint8 link_type; /* Link type */ 203} __attribute__ ((packed)) ; 204 205#define HCI_EVENT_MAX_SLOT_CHANGE 0x1b 206struct hci_ev_max_slot_change { 207 uint16 handle; /* connection handle */ 208 uint8 lmp_max_slots; /* Max. # of slots allowed */ 209} __attribute__ ((packed)) ; 210 211#define HCI_EVENT_READ_CLOCK_OFFSET_COMPL 0x1c 212struct hci_ev_read_clock_offset_compl { 213 uint8 status; /* 0x00 - success */ 214 uint16 handle; /* Connection handle */ 215 uint16 clock_offset; /* Clock offset */ 216} __attribute__ ((packed)) ; 217 218#define HCI_EVENT_CON_PKT_TYPE_CHANGED 0x1d 219struct hci_ev_con_pkt_type_changed { 220 uint8 status; /* 0x00 - success */ 221 uint16 handle; /* connection handle */ 222 uint16 pkt_type; /* packet type */ 223} __attribute__ ((packed)); 224 225#define HCI_EVENT_QOS_VIOLATION 0x1e 226struct hci_ev_qos_violation { 227 uint16 handle; /* connection handle */ 228} __attribute__ ((packed)) ; 229 230#define HCI_EVENT_PAGE_SCAN_REP_MODE_CHANGE 0x20 231struct hci_ev_page_scan_rep_mode_change { 232 bdaddr_t bdaddr; /* destination address */ 233 uint8 page_scan_rep_mode; /* page scan repetition mode */ 234} __attribute__ ((packed)); 235 236/* Events Beyond Bluetooth 1.1 */ 237#define HCI_EVENT_FLOW_SPECIFICATION 0x21 238struct hci_ev_flow_specification { 239 uint8 status; 240 uint16 handle; 241 uint8 flags; 242 uint8 flow_direction; 243 uint8 service_type; 244 uint32 token_rate; 245 uint32 token_bucket_size; 246 uint32 peak_bandwidth; 247 uint32 access_latency; 248} __attribute__ ((packed)); 249 250#define HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22 251struct hci_ev_inquiry_info_with_rssi { 252 bdaddr_t bdaddr; 253 uint8 pscan_rep_mode; 254 uint8 pscan_period_mode; 255 uint8 dev_class[3]; 256 uint16 clock_offset; 257 int8 rssi; 258} __attribute__ ((packed)); 259 260#define HCI_EVENT_REMOTE_EXTENDED_FEATURES 0x23 261struct hci_ev_remote_extended_features { 262 uint8 status; 263 uint16 handle; 264 uint8 page_number; 265 uint8 maximun_page_number; 266 uint64 extended_lmp_features; 267} __attribute__ ((packed)); 268 269#define HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETED 0x2C 270struct hci_ev_sychronous_connection_completed { 271 uint8 status; 272 uint16 handle; 273 bdaddr_t bdaddr; 274 uint8 link_type; 275 uint8 transmission_interval; 276 uint8 retransmission_window; 277 uint16 rx_packet_length; 278 uint16 tx_packet_length; 279 uint8 air_mode; 280} __attribute__ ((packed)); 281 282#define HCI_EVENT_SYNCHRONOUS_CONNECTION_CHANGED 0x2D 283struct hci_ev_sychronous_connection_changed { 284 uint8 status; 285 uint16 handle; 286 uint8 transmission_interval; 287 uint8 retransmission_window; 288 uint16 rx_packet_length; 289 uint16 tx_packet_length; 290} __attribute__ ((packed)); 291 292// TODO: Define remaining Bluetooth 2.1 events structures 293#define HCI_EVENT_EXTENDED_INQUIRY_RESULT 0x2F 294 295#define HCI_EVENT_ENCRYPTION_KEY_REFRESH_COMPLETE 0x30 296 297#define HCI_EVENT_IO_CAPABILITY_REQUEST 0x31 298 299#define HCI_EVENT_IO_CAPABILITY_RESPONSE 0x32 300 301#define HCI_EVENT_USER_CONFIRMATION_REQUEST 0x33 302 303#define HCI_EVENT_USER_PASSKEY_REQUEST 0x34 304 305#define HCI_EVENT_OOB_DATA_REQUEST 0x35 306 307#define HCI_EVENT_SIMPLE_PAIRING_COMPLETE 0x36 308 309#define HCI_EVENT_LINK_SUPERVISION_TIMEOUT_CHANGED 0x38 310 311#define HCI_EVENT_ENHANCED_FLUSH_COMPLETE 0x39 312 313#define HCI_EVENT_KEYPRESS_NOTIFICATION 0x3C 314 315#define HCI_EVENT_REMOTE_HOST_SUPPORTED_FEATURES_NOTIFICATION 0x3D 316 317 318/* HAIKU Internal Events, not produced by the transport devices but 319 * by some entity of the Haiku Bluetooth Stack. 320 * The MSB 0xE is chosen for this purpose 321 */ 322 323#define HCI_HAIKU_EVENT_SERVER_QUITTING 0xE0 324#define HCI_HAIKU_EVENT_DEVICE_REMOVED 0xE1 325 326 327#endif // _BTHCI_EVENT_H_ 328