xref: /netbsd-src/sys/netbt/hci_le.h (revision 1a2ee0e95285bfc53e0b167d6bb5e77a88037c64)
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