1 1.1 nat /* $NetBSD: hci_le.h,v 1.1 2024/03/13 07:22:16 nat Exp $ */ 2 1.1 nat 3 1.1 nat /*- 4 1.1 nat * Copyright (c) 2020 Nathanial Sloss <nathanialsloss (at) yahoo.com.au> 5 1.1 nat * All rights reserved. 6 1.1 nat * 7 1.1 nat * Redistribution and use in source and binary forms, with or without 8 1.1 nat * modification, are permitted provided that the following conditions 9 1.1 nat * are met: 10 1.1 nat * 1. Redistributions of source code must retain the above copyright 11 1.1 nat * notice, this list of conditions and the following disclaimer. 12 1.1 nat * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 nat * notice, this list of conditions and the following disclaimer in the 14 1.1 nat * documentation and/or other materials provided with the distribution. 15 1.1 nat * 16 1.1 nat * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 17 1.1 nat * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 18 1.1 nat * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 1.1 nat * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 20 1.1 nat * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 1.1 nat * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 1.1 nat * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 1.1 nat * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 1.1 nat * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 1.1 nat * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 1.1 nat * POSSIBILITY OF SUCH DAMAGE. 27 1.1 nat */ 28 1.1 nat 29 1.1 nat #define HCI_ADVERT_DATA_SIZE 31 /* advertising data size */ 30 1.1 nat #define HCI_SCAN_DATA_SIZE 31 /* scan resp. data size */ 31 1.1 nat 32 1.1 nat /* LE Event masks */ 33 1.1 nat #define HCI_LE_EVMSK_ALL 0x000000000000001f 34 1.1 nat #define HCI_LE_EVMSK_NONE 0x0000000000000000 35 1.1 nat #define HCI_LE_EVMSK_CON_COMPL 0x0000000000000001 36 1.1 nat #define HCI_LE_EVMSK_ADV_REPORT 0x0000000000000002 37 1.1 nat #define HCI_LE_EVMSK_CON_UPDATE_COMPL 0x0000000000000004 38 1.1 nat #define HCI_LE_EVMSK_READ_REMOTE_FEATURES_COMPL 0x0000000000000008 39 1.1 nat #define HCI_LE_EVMSK_LONG_TERM_KEY_REQ 0x0000000000000010 40 1.1 nat /* 0x0000000000000020 - 0x8000000000000000 - reserved for future use */ 41 1.1 nat 42 1.1 nat /************************************************************************** 43 1.1 nat ************************************************************************** 44 1.1 nat ** OGF 0x08 Bluetooth Low Energy (LE) Link commands 45 1.1 nat ************************************************************************** 46 1.1 nat **************************************************************************/ 47 1.1 nat 48 1.1 nat #define HCI_OGF_LE 0x08 49 1.1 nat 50 1.1 nat #define HCI_OCF_LE_SET_EVENT_MASK 0x0001 51 1.1 nat #define HCI_CMD_LE_SET_EVENT_MASK 0x2001 52 1.1 nat typedef struct { 53 1.1 nat uint8_t event_mask[HCI_EVENT_MASK_SIZE]; /* event_mask */ 54 1.1 nat } __packed hci_le_set_event_mask_cp; 55 1.1 nat 56 1.1 nat typedef hci_status_rp hci_le_set_event_mask_rp; 57 1.1 nat 58 1.1 nat #define HCI_OCF_LE_READ_BUFFER_SIZE 0x0002 59 1.1 nat #define HCI_CMD_LE_READ_BUFFER_SIZE 0x2002 60 1.1 nat /* No command parameter(s) */ 61 1.1 nat 62 1.1 nat typedef struct { 63 1.1 nat uint8_t status; /* status 0x00 = success */ 64 1.1 nat uint16_t le_data_pktlen; /* buffer len*/ 65 1.1 nat uint8_t le_num_pkts; /* no. acl data packets */ 66 1.1 nat } __packed hci_le_read_buffer_size_rp; 67 1.1 nat 68 1.1 nat #define HCI_OCF_LE_READ_LOCAL_FEATURES 0x0003 69 1.1 nat #define HCI_CMD_LE_READ_LOCAL_FEATURES 0x2003 70 1.1 nat /* No command parameter(s) */ 71 1.1 nat 72 1.1 nat typedef struct { 73 1.1 nat uint8_t status; /* status 0x00 = success */ 74 1.1 nat uint8_t features[HCI_FEATURES_SIZE]; /* le features */ 75 1.1 nat } __packed hci_le_read_local_features_rp; 76 1.1 nat 77 1.1 nat #define HCI_OCF_LE_SET_RND_ADDR 0x0005 78 1.1 nat #define HCI_CMD_LE_SET_RND_ADDR 0x2005 79 1.1 nat typedef struct { 80 1.1 nat bdaddr_t bdaddr; /* random local address */ 81 1.1 nat } __packed hci_le_set_rnd_addr_cp; 82 1.1 nat 83 1.1 nat typedef hci_status_rp hci_le_set_rnd_addr_rp; 84 1.1 nat /* XXX NS Finish defines. */ 85 1.1 nat #define HCI_OCF_LE_SET_ADVERT_PARAM 0x0006 86 1.1 nat #define HCI_CMD_LE_SET_ADVERT_PARAM 0x2006 87 1.1 nat typedef struct { 88 1.1 nat uint16_t min_interval; /* min interval * 0.625ms */ 89 1.1 nat uint16_t max_interval; /* max_interval * 0.625ms */ 90 1.1 nat uint8_t advert_type; 91 1.1 nat uint8_t own_address_type; 92 1.1 nat uint8_t direct_address_type; 93 1.1 nat bdaddr_t direct_address; /* remote address */ 94 1.1 nat uint8_t advert_channel_map; 95 1.1 nat uint8_t advert_filter_policy; 96 1.1 nat } __packed hci_le_set_advert_param_cp; 97 1.1 nat 98 1.1 nat typedef hci_status_rp hci_le_set_advert_param_rp; 99 1.1 nat 100 1.1 nat #define HCF_OCF_LE_READ_ADVERT_CHAN_TX_PWR 0x0007 101 1.1 nat #define HCF_CMD_LE_READ_ADVERT_CHAN_TX_PWR 0x2007 102 1.1 nat /* No command parameter(s) */ 103 1.1 nat 104 1.1 nat typedef struct { 105 1.1 nat uint8_t status; /* status 0x00 = success */ 106 1.1 nat int8_t tx_power_level; /* -20 - 10 dBm */ 107 1.1 nat } __packed hci_le_read_advert_chan_tx_pwr_rp; 108 1.1 nat 109 1.1 nat #define HCF_OCF_LE_SET_ADVERT_DATA 0x0008 110 1.1 nat #define HCF_CMD_LE_SET_ADVERT_DATA 0x2008 111 1.1 nat typedef struct { 112 1.1 nat uint8_t advert_data_len; /* 0x00 - 0x1f */ 113 1.1 nat uint8_t advert_data[HCI_ADVERT_DATA_SIZE]; /* def all 0's */ 114 1.1 nat } __packed hci_le_set_advert_data_cp; 115 1.1 nat 116 1.1 nat typedef hci_status_rp hci_le_set_advert_data_rp; 117 1.1 nat 118 1.1 nat #define HCF_OCF_LE_SET_SCAN_RESP_DATA 0x0009 119 1.1 nat #define HCF_CMD_LE_SET_SCAN_RESP_DATA 0x2009 120 1.1 nat typedef struct { 121 1.1 nat uint8_t scan_resp_data_len; /* 0x00 - 0x1f */ 122 1.1 nat uint8_t scan_resp_data[HCI_SCAN_DATA_SIZE]; /* def all 0's */ 123 1.1 nat } __packed hci_le_set_scan_resp_data_cp; 124 1.1 nat 125 1.1 nat typedef hci_status_rp hci_le_set_scan_resp_data_rp; 126 1.1 nat 127 1.1 nat #define HCF_OCF_LE_SET_ADVERT_ENABLE 0x000a 128 1.1 nat #define HCF_CMD_LE_SET_ADVERT_ENABLE 0x200A 129 1.1 nat typedef struct { 130 1.1 nat uint8_t advert_enable; /* 0x00 - disable 0x1 - enable */ 131 1.1 nat /* 0x2 - 0xff reserved */ 132 1.1 nat } __packed hci_le_set_advert_enable_cp; 133 1.1 nat 134 1.1 nat typedef hci_status_rp hci_le_set_advert_enable_rp; 135 1.1 nat 136 1.1 nat #define HCI_OCF_LE_SET_SCAN_PARAM 0x000b 137 1.1 nat #define HCI_CMD_LE_SET_SCAN_PARAM 0x200B 138 1.1 nat typedef struct { 139 1.1 nat uint8_t scan_type; 140 1.1 nat uint16_t scan_interval; /* min interval * 0.625ms */ 141 1.1 nat uint16_t scan_window; /* max_interval * 0.625ms */ 142 1.1 nat uint8_t own_address_type; 143 1.1 nat uint8_t scan_filter_policy; 144 1.1 nat } __packed hci_le_set_scan_param_cp; 145 1.1 nat 146 1.1 nat typedef hci_status_rp hci_le_set_scan_param_rp; 147 1.1 nat 148 1.1 nat #define HCF_OCF_LE_SET_SCAN_ENABLE 0x000c 149 1.1 nat #define HCF_CMD_LE_SET_SCAN_ENABLE 0x200C 150 1.1 nat typedef struct { 151 1.1 nat uint8_t scan_enable; /* 0x00 - disable 0x1 - enable */ 152 1.1 nat /* 0x2 - 0xff reserved */ 153 1.1 nat uint8_t filter_dup; /* 0x00 - no filtering 0x1 - filter */ 154 1.1 nat /* 0x2 - 0xff reserved */ 155 1.1 nat } __packed hci_le_set_scan_enable_cp; 156 1.1 nat 157 1.1 nat typedef hci_status_rp hci_le_set_scan_enable_rp; 158 1.1 nat 159 1.1 nat #define HCI_OCF_CREATE_CON_LE 0x000d 160 1.1 nat #define HCI_CMD_CREATE_CON_LE 0x200D 161 1.1 nat typedef struct { 162 1.1 nat uint16_t scan_interval; /* min interval * 0.625ms */ 163 1.1 nat uint16_t scan_window; /* max_interval * 0.625ms */ 164 1.1 nat uint8_t initiator_filter_policy; 165 1.1 nat uint8_t peer_address_type; 166 1.1 nat bdaddr_t peer_address; /* remote address */ 167 1.1 nat uint8_t own_address_type; 168 1.1 nat uint16_t con_interval_min; /* min interval * 1.25ms */ 169 1.1 nat uint16_t con_interval_max; /* max_interval * 1.25ms */ 170 1.1 nat uint16_t con_latency; /* 0x0 - 0x1f4 */ 171 1.1 nat uint16_t supervision_timo; /* timeout * 10ms */ 172 1.1 nat uint16_t min_ce_length; /* min length * 0.625ms */ 173 1.1 nat uint16_t max_ce_length; /* max length * 0.625ms */ 174 1.1 nat } __packed hci_create_con_le_cp; 175 1.1 nat /* No return parameter(s) */ 176 1.1 nat 177 1.1 nat #define HCI_OCF_CREATE_CON_LE_CANCEL 0x000e 178 1.1 nat #define HCI_CMD_CREATE_CON_LE_CANCEL 0x200E 179 1.1 nat /* No command parameter(s) */ 180 1.1 nat 181 1.1 nat typedef hci_status_rp hci_create_con_le_cancel_rp; 182 1.1 nat 183 1.1 nat #define HCI_OCF_LE_READ_WHITE_LIST_SIZE 0x000f 184 1.1 nat #define HCI_CMD_LE_READ_WHITE_LIST_SIZE 0x200F 185 1.1 nat /* No command parameter(s) */ 186 1.1 nat 187 1.1 nat typedef struct { 188 1.1 nat uint8_t status; /* status 0x00 = success */ 189 1.1 nat uint8_t white_list_size; /* 0x1 - 0xff */ 190 1.1 nat /* 0x0 reserved */ 191 1.1 nat } __packed hci_le_read_white_list_size_rp; 192 1.1 nat 193 1.1 nat #define HCI_OCF_LE_CLEAR_WHITE_LIST 0x0010 194 1.1 nat #define HCI_CMD_LE_CLEAR_WHITE_LIST 0x2010 195 1.1 nat /* No command parameter(s) */ 196 1.1 nat 197 1.1 nat typedef hci_status_rp hci_le_clear_white_list_rp; 198 1.1 nat 199 1.1 nat #define HCI_OCF_LE_ADD_DEV_TO_WHITE_LIST 0x0011 200 1.1 nat #define HCI_CMD_LE_ADD_DEV_TO_WHITE_LIST 0x2011 201 1.1 nat typedef struct { 202 1.1 nat uint8_t address_type; 203 1.1 nat bdaddr_t address; /* remote address */ 204 1.1 nat } __packed hci_le_add_dev_to_white_list_cp; 205 1.1 nat 206 1.1 nat typedef hci_status_rp hci_le_add_dev_to_white_list_rp; 207 1.1 nat 208 1.1 nat #define HCI_OCF_LE_REMOVE_DEV_FROM_WHITE_LIST 0x0012 209 1.1 nat #define HCI_CMD_LE_REMOVE_DEV_FROM_WHITE_LIST 0x2012 210 1.1 nat typedef struct { 211 1.1 nat uint8_t address_type; 212 1.1 nat bdaddr_t address; /* remote address */ 213 1.1 nat } __packed hci_le_remove_dev_from_white_list_cp; 214 1.1 nat 215 1.1 nat typedef hci_status_rp hci_le_remove_dev_from_white_list_rp; 216 1.1 nat 217 1.1 nat #define HCI_OCF_UPDATE_CON_LE 0x0013 218 1.1 nat #define HCI_CMD_UPDATE_CON_LE 0x2013 219 1.1 nat typedef struct { 220 1.1 nat uint16_t con_handle; /* handle 12 bits */ 221 1.1 nat uint16_t con_interval_min; /* min interval * 1.25ms */ 222 1.1 nat uint16_t con_interval_max; /* max_interval * 1.25ms */ 223 1.1 nat uint16_t con_latency; /* 0x0 - 0x1f4 */ 224 1.1 nat uint16_t supervision_timo; /* timeout * 10ms */ 225 1.1 nat uint16_t min_ce_length; /* min length * 0.625ms */ 226 1.1 nat uint16_t max_ce_length; /* max length * 0.625ms */ 227 1.1 nat } __packed hci_update_con_le_cp; 228 1.1 nat /* No return parameter(s) */ 229 1.1 nat 230 1.1 nat #define HCI_OCF_LE_SET_HOST_CHAN_CLASSIFICATION 0x0014 231 1.1 nat #define HCI_CMD_LE_SET_HOST_CHAN_CLASSIFICATION 0x2014 232 1.1 nat typedef struct { 233 1.1 nat uint8_t map[5]; 234 1.1 nat } __packed hci_le_set_host_chan_classification_cp; 235 1.1 nat 236 1.1 nat typedef hci_status_rp hci_le_set_host_chan_classification_rp; 237 1.1 nat 238 1.1 nat #define HCI_OCF_LE_READ_CHANNEL_MAP 0x0015 239 1.1 nat #define HCI_CMD_LE_READ_CHANNEL_MAP 0x2015 240 1.1 nat typedef struct { 241 1.1 nat uint16_t con_handle; /* connection handle */ 242 1.1 nat } __packed hci_le_read_channel_map_cp; 243 1.1 nat 244 1.1 nat typedef struct { 245 1.1 nat uint8_t status; /* status 0x00 = success */ 246 1.1 nat uint16_t con_handle; /* connection handle */ 247 1.1 nat uint8_t map[5]; /* LE channel map */ 248 1.1 nat } __packed hci_le_read_channel_map_rp; 249 1.1 nat 250 1.1 nat #define HCI_OCF_LE_READ_REMOTE_FEATURES 0x0016 251 1.1 nat #define HCI_CMD_LE_READ_REMOTE_FEATURES 0x2016 252 1.1 nat typedef struct { 253 1.1 nat uint16_t con_handle; /* connection handle */ 254 1.1 nat } __packed hci_le_read_remote_features_cp; 255 1.1 nat /* No return parameter(s) */ 256 1.1 nat 257 1.1 nat #define HCI_OCF_LE_ENCRYPT 0x0017 258 1.1 nat #define HCI_CMD_LE_ENCRYPT 0x2017 259 1.1 nat typedef struct { 260 1.1 nat uint8_t key[16]; 261 1.1 nat uint8_t plaintext_data[16]; 262 1.1 nat } __packed hci_le_encrypt_cp; 263 1.1 nat 264 1.1 nat typedef struct { 265 1.1 nat uint8_t status; /* status 0x00 = success */ 266 1.1 nat uint16_t enc_data[16]; 267 1.1 nat } __packed hci_le_encrypt_rp; 268 1.1 nat 269 1.1 nat #define HCI_OCF_LE_RAND 0x0018 270 1.1 nat #define HCI_CMD_LE_RAND 0x2018 271 1.1 nat /* No command parameter(s) */ 272 1.1 nat 273 1.1 nat typedef struct { 274 1.1 nat uint8_t status; /* status 0x00 = success */ 275 1.1 nat uint8_t rand_num[8]; 276 1.1 nat } __packed hci_le_rand_rp; 277 1.1 nat 278 1.1 nat #define HCI_OCF_LE_START_ENCRYPT 0x0019 279 1.1 nat #define HCI_CMD_LE_START_ENCRYPT 0x2019 280 1.1 nat typedef struct { 281 1.1 nat uint16_t con_handle; /* connection handle */ 282 1.1 nat uint8_t rand_num[8]; 283 1.1 nat uint16_t enc_diversifier; 284 1.1 nat uint8_t key[HCI_KEY_SIZE]; /* key */ 285 1.1 nat } __packed hci_le_start_encrypt_cp; 286 1.1 nat /* No return parameter(s) */ 287 1.1 nat 288 1.1 nat #define HCI_OCF_LE_LONG_TERM_KEY_REQ_REP 0x001a 289 1.1 nat #define HCI_CMD_LE_LONG_TERM_KEY_REQ_REP 0x201A 290 1.1 nat typedef struct { 291 1.1 nat uint16_t con_handle; /* connection handle */ 292 1.1 nat uint8_t key[HCI_KEY_SIZE]; /* key */ 293 1.1 nat } __packed hci_le_long_term_key_req_rep_cp; 294 1.1 nat 295 1.1 nat typedef struct { 296 1.1 nat uint8_t status; /* status 0x00 = success */ 297 1.1 nat uint16_t con_handle; /* connection handle */ 298 1.1 nat } __packed hci_le_long_term_key_req_rep_rp; 299 1.1 nat 300 1.1 nat #define HCI_OCF_LE_LONG_TERM_KEY_REQ_REP_NEG 0x001b 301 1.1 nat #define HCI_CMD_LE_LONG_TERM_KEY_REQ_REP_NEG 0x201B 302 1.1 nat typedef struct { 303 1.1 nat uint16_t con_handle; /* connection handle */ 304 1.1 nat } __packed hci_le_long_term_key_req_rep_neg_cp; 305 1.1 nat 306 1.1 nat typedef struct { 307 1.1 nat uint8_t status; /* status 0x00 = success */ 308 1.1 nat uint16_t con_handle; /* connection handle */ 309 1.1 nat } __packed hci_le_long_term_key_req_rep_neg_rp; 310 1.1 nat 311 1.1 nat /* XXX NS Read supported states */ 312 1.1 nat 313 1.1 nat #define HCI_OCF_LE_RECEIVER_TEST 0x001d 314 1.1 nat #define HCI_CMD_LE_RECEIVER_TEST 0x201D 315 1.1 nat typedef struct { 316 1.1 nat uint8_t rx_freq; /* 0x00 - 0x27 (2402 - 2480MHz) */ 317 1.1 nat } __packed hci_le_receiver_test_cp; 318 1.1 nat 319 1.1 nat typedef struct { 320 1.1 nat uint8_t status; /* status 0x00 = success */ 321 1.1 nat } __packed hci_le_receiver_test_rp; 322 1.1 nat 323 1.1 nat #define HCI_OCF_LE_TRANSMITTER_TEST 0x001e 324 1.1 nat #define HCI_CMD_LE_TRANSMITTER_TEST 0x201E 325 1.1 nat typedef struct { 326 1.1 nat uint8_t tx_freq; /* 0x00 - 0x27 (2402 - 2480MHz) */ 327 1.1 nat uint8_t test_len; /* 0x00 - 0x25 bytes */ 328 1.1 nat /* 0x26 - 0xff reserved */ 329 1.1 nat uint8_t payload; /* 0x00 - 0x02 mandatory */ 330 1.1 nat /* 0x03 - 0x07 opt. test patterns */ 331 1.1 nat /* 0x08 - 0xff reserved */ 332 1.1 nat } __packed hci_le_transmitter_test_cp; 333 1.1 nat 334 1.1 nat typedef struct { 335 1.1 nat uint8_t status; /* status 0x00 = success */ 336 1.1 nat } __packed hci_le_transmitter_test_rp; 337 1.1 nat 338 1.1 nat #define HCI_OCF_LE_TEST_END 0x001f 339 1.1 nat #define HCI_CMD_LE_TEST_END 0x201F 340 1.1 nat /* No command parameter(s) */ 341 1.1 nat 342 1.1 nat typedef struct { 343 1.1 nat uint8_t status; /* status 0x00 = success */ 344 1.1 nat uint16_t num_pkts; /* num pkts received */ 345 1.1 nat /* 0x0000 for tx test */ 346 1.1 nat } __packed hci_le_test_end_rp; 347 1.1 nat 348 1.1 nat /************************************************************************** 349 1.1 nat ************************************************************************** 350 1.1 nat ** Events and event parameters 351 1.1 nat ************************************************************************** 352 1.1 nat **************************************************************************/ 353 1.1 nat 354 1.1 nat #define HCI_LE_META_EVENT 0x3e 355 1.1 nat #define HCI_SUBEVT_CON_COMP 0x01 356 1.1 nat typedef struct { 357 1.1 nat uint8_t subevt_code; 358 1.1 nat uint8_t status; /* status 0x00 = success */ 359 1.1 nat uint16_t con_handle; /* handle 12 bits */ 360 1.1 nat uint8_t role; 361 1.1 nat uint8_t peer_address_type; 362 1.1 nat bdaddr_t peer_address; /* remote address */ 363 1.1 nat uint8_t own_address_type; 364 1.1 nat uint16_t con_interval; /* min interval * 1.25ms */ 365 1.1 nat uint16_t con_latency; /* 0x0 - 0x1f4 */ 366 1.1 nat uint8_t master_clk_accuracy; 367 1.1 nat } __packed hci_le_con_comp_ep; 368 1.1 nat 369