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