1 /* gap.h - Bluetooth tester headers */
2 
3 /*
4  * Copyright (c) 2015-2016 Intel Corporation
5  * Copyright (c) 2022 Codecoup
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  */
9 
10 #include <stddef.h>
11 #include <stdint.h>
12 
13 #include <zephyr/bluetooth/addr.h>
14 
15 /* GAP Service */
16 /* commands */
17 #define BTP_GAP_READ_SUPPORTED_COMMANDS		0x01
18 struct btp_gap_read_supported_commands_rp {
19 	uint8_t data[0];
20 } __packed;
21 
22 #define BTP_GAP_READ_CONTROLLER_INDEX_LIST	0x02
23 struct btp_gap_read_controller_index_list_rp {
24 	uint8_t num;
25 	uint8_t index[];
26 } __packed;
27 
28 #define BTP_GAP_SETTINGS_POWERED		0
29 #define BTP_GAP_SETTINGS_CONNECTABLE		1
30 #define BTP_GAP_SETTINGS_FAST_CONNECTABLE	2
31 #define BTP_GAP_SETTINGS_DISCOVERABLE		3
32 #define BTP_GAP_SETTINGS_BONDABLE		4
33 #define BTP_GAP_SETTINGS_LINK_SEC_3		5
34 #define BTP_GAP_SETTINGS_SSP			6
35 #define BTP_GAP_SETTINGS_BREDR			7
36 #define BTP_GAP_SETTINGS_HS			8
37 #define BTP_GAP_SETTINGS_LE			9
38 #define BTP_GAP_SETTINGS_ADVERTISING		10
39 #define BTP_GAP_SETTINGS_SC			11
40 #define BTP_GAP_SETTINGS_DEBUG_KEYS		12
41 #define BTP_GAP_SETTINGS_PRIVACY		13
42 #define BTP_GAP_SETTINGS_CONTROLLER_CONFIG	14
43 #define BTP_GAP_SETTINGS_STATIC_ADDRESS		15
44 #define BTP_GAP_SETTINGS_SC_ONLY		16
45 #define BTP_GAP_SETTINGS_EXTENDED_ADVERTISING	17
46 
47 #define BTP_GAP_READ_CONTROLLER_INFO		0x03
48 struct btp_gap_read_controller_info_rp {
49 	bt_addr_t  address;
50 	uint32_t supported_settings;
51 	uint32_t current_settings;
52 	uint8_t  cod[3];
53 	uint8_t  name[249];
54 	uint8_t  short_name[11];
55 } __packed;
56 
57 #define BTP_GAP_RESET				0x04
58 struct btp_gap_reset_rp {
59 	uint32_t current_settings;
60 } __packed;
61 
62 #define BTP_GAP_SET_POWERED			0x05
63 struct btp_gap_set_powered_cmd {
64 	uint8_t powered;
65 } __packed;
66 struct btp_gap_set_powered_rp {
67 	uint32_t current_settings;
68 } __packed;
69 
70 #define BTP_GAP_SET_CONNECTABLE			0x06
71 struct btp_gap_set_connectable_cmd {
72 	uint8_t connectable;
73 } __packed;
74 struct btp_gap_set_connectable_rp {
75 	uint32_t current_settings;
76 } __packed;
77 
78 #define BTP_GAP_SET_FAST_CONNECTABLE		0x07
79 struct btp_gap_set_fast_connectable_cmd {
80 	uint8_t fast_connectable;
81 } __packed;
82 struct btp_gap_set_fast_connectable_rp {
83 	uint32_t current_settings;
84 } __packed;
85 
86 #define BTP_GAP_NON_DISCOVERABLE		0x00
87 #define BTP_GAP_GENERAL_DISCOVERABLE		0x01
88 #define BTP_GAP_LIMITED_DISCOVERABLE		0x02
89 
90 #define BTP_GAP_SET_DISCOVERABLE		0x08
91 struct btp_gap_set_discoverable_cmd {
92 	uint8_t discoverable;
93 } __packed;
94 struct btp_gap_set_discoverable_rp {
95 	uint32_t current_settings;
96 } __packed;
97 
98 #define BTP_GAP_SET_BONDABLE			0x09
99 struct btp_gap_set_bondable_cmd {
100 	uint8_t bondable;
101 } __packed;
102 struct btp_gap_set_bondable_rp {
103 	uint32_t current_settings;
104 } __packed;
105 
106 #define BTP_GAP_ADDR_TYPE_IDENTITY			0
107 #define BTP_GAP_ADDR_TYPE_RESOLVABLE_PRIVATE		1
108 #define BTP_GAP_ADDR_TYPE_NON_RESOLVABLE_PRIVATE	2
109 
110 #define BTP_GAP_START_ADVERTISING		0x0a
111 struct btp_gap_start_advertising_cmd {
112 	uint8_t adv_data_len;
113 	uint8_t scan_rsp_len;
114 	uint8_t adv_sr_data[];
115 /*
116  * This command is very unfortunate because it has two fields after variable
117  * data. Those needs to be handled explicitly by handler.
118  * uint32_t duration;
119  * uint8_t own_addr_type;
120  */
121 } __packed;
122 struct btp_gap_start_advertising_rp {
123 	uint32_t current_settings;
124 } __packed;
125 
126 #define BTP_GAP_STOP_ADVERTISING		0x0b
127 struct btp_gap_stop_advertising_rp {
128 	uint32_t current_settings;
129 } __packed;
130 
131 #define BTP_GAP_DISCOVERY_FLAG_LE		0x01
132 #define BTP_GAP_DISCOVERY_FLAG_BREDR		0x02
133 #define BTP_GAP_DISCOVERY_FLAG_LIMITED		0x04
134 #define BTP_GAP_DISCOVERY_FLAG_LE_ACTIVE_SCAN	0x08
135 #define BTP_GAP_DISCOVERY_FLAG_LE_OBSERVE	0x10
136 #define BTP_GAP_DISCOVERY_FLAG_OWN_ID_ADDR	0x20
137 #define BTP_GAP_DISCOVERY_FLAG_USE_FILTER_LIST	0x40
138 
139 #define BTP_GAP_START_DISCOVERY			0x0c
140 struct btp_gap_start_discovery_cmd {
141 	uint8_t flags;
142 } __packed;
143 
144 #define BTP_GAP_STOP_DISCOVERY			0x0d
145 
146 #define BTP_GAP_CONNECT				0x0e
147 struct btp_gap_connect_cmd {
148 	bt_addr_le_t address;
149 	uint8_t own_addr_type;
150 } __packed;
151 
152 #define BTP_GAP_DISCONNECT			0x0f
153 struct btp_gap_disconnect_cmd {
154 	bt_addr_le_t address;
155 } __packed;
156 
157 #define BTP_GAP_IO_CAP_DISPLAY_ONLY		0
158 #define BTP_GAP_IO_CAP_DISPLAY_YESNO		1
159 #define BTP_GAP_IO_CAP_KEYBOARD_ONLY		2
160 #define BTP_GAP_IO_CAP_NO_INPUT_OUTPUT		3
161 #define BTP_GAP_IO_CAP_KEYBOARD_DISPLAY		4
162 
163 #define BTP_GAP_SET_IO_CAP			0x10
164 struct btp_gap_set_io_cap_cmd {
165 	uint8_t io_cap;
166 } __packed;
167 
168 #define BTP_GAP_PAIR				0x11
169 struct btp_gap_pair_cmd {
170 	bt_addr_le_t address;
171 } __packed;
172 
173 #define BTP_GAP_UNPAIR				0x12
174 struct btp_gap_unpair_cmd {
175 	bt_addr_le_t address;
176 } __packed;
177 
178 #define BTP_GAP_PASSKEY_ENTRY			0x13
179 struct btp_gap_passkey_entry_cmd {
180 	bt_addr_le_t address;
181 	uint32_t passkey;
182 } __packed;
183 
184 #define BTP_GAP_PASSKEY_CONFIRM			0x14
185 struct btp_gap_passkey_confirm_cmd {
186 	bt_addr_le_t address;
187 	uint8_t match;
188 } __packed;
189 
190 #define BTP_GAP_START_DIRECTED_ADV_HD		BIT(0)
191 #define BTP_GAP_START_DIRECTED_ADV_OWN_ID	BIT(1)
192 #define BTP_GAP_START_DIRECTED_ADV_PEER_RPA	BIT(2)
193 
194 #define BTP_GAP_START_DIRECTED_ADV		0x15
195 struct btp_gap_start_directed_adv_cmd {
196 	bt_addr_le_t address;
197 	uint16_t options;
198 } __packed;
199 struct btp_gap_start_directed_adv_rp {
200 	uint32_t current_settings;
201 } __packed;
202 
203 #define BTP_GAP_CONN_PARAM_UPDATE		0x16
204 struct btp_gap_conn_param_update_cmd {
205 	bt_addr_le_t address;
206 	uint16_t interval_min;
207 	uint16_t interval_max;
208 	uint16_t latency;
209 	uint16_t timeout;
210 } __packed;
211 
212 #define BTP_GAP_PAIRING_CONSENT			0x17
213 struct btp_gap_pairing_consent_cmd {
214 	bt_addr_le_t address;
215 	uint8_t consent;
216 } __packed;
217 
218 #define BTP_GAP_OOB_LEGACY_SET_DATA		0x18
219 struct btp_gap_oob_legacy_set_data_cmd {
220 	uint8_t oob_data[16];
221 } __packed;
222 
223 #define BTP_GAP_OOB_SC_GET_LOCAL_DATA		0x19
224 struct btp_gap_oob_sc_get_local_data_rp {
225 	uint8_t rand[16];
226 	uint8_t conf[16];
227 } __packed;
228 
229 #define BTP_GAP_OOB_SC_SET_REMOTE_DATA		0x1a
230 struct btp_gap_oob_sc_set_remote_data_cmd {
231 	uint8_t rand[16];
232 	uint8_t conf[16];
233 } __packed;
234 
235 #define BTP_GAP_SET_MITM			0x1b
236 struct btp_gap_set_mitm {
237 	uint8_t mitm;
238 } __packed;
239 
240 #define BTP_GAP_SET_FILTER_LIST			0x1c
241 struct btp_gap_set_filter_list {
242 	uint8_t cnt;
243 	bt_addr_le_t addr[];
244 } __packed;
245 
246 #define BTP_GAP_SET_PRIVACY			0x1d
247 #define BTP_GAP_SET_SC_ONLY			0x1e
248 #define BTP_GAP_SET_SC				0x1f
249 #define BTP_GAP_SET_MIN_ENC_KEY_SIZE		0x20
250 
251 #define BTP_GAP_SET_EXTENDED_ADVERTISING	0x21
252 struct btp_gap_set_extended_advertising_cmd {
253 	uint8_t settings;
254 } __packed;
255 struct btp_gap_set_extended_advertising_rp {
256 	uint32_t current_settings;
257 } __packed;
258 
259 #define BTP_GAP_PADV_CONFIGURE			0x22
260 /* bitmap of flags*/
261 #define BTP_GAP_PADV_INCLUDE_TX_POWER		BIT(0)
262 struct btp_gap_padv_configure_cmd {
263 	uint8_t flags;
264 	uint16_t interval_min;
265 	uint16_t interval_max;
266 } __packed;
267 struct btp_gap_padv_configure_rp {
268 	uint32_t current_settings;
269 } __packed;
270 
271 #define BTP_GAP_PADV_START			0x23
272 struct btp_gap_padv_start_cmd {
273 	uint8_t flags;
274 } __packed;
275 struct btp_gap_padv_start_rp {
276 	uint32_t current_settings;
277 } __packed;
278 
279 #define BTP_GAP_PADV_STOP			0x24
280 struct btp_gap_padv_stop_cmd {
281 } __packed;
282 struct btp_gap_padv_stop_rp {
283 	uint32_t current_settings;
284 } __packed;
285 
286 #define BTP_GAP_PADV_SET_DATA			0x25
287 struct btp_gap_padv_set_data_cmd {
288 	uint16_t data_len;
289 	uint8_t data[];
290 } __packed;
291 
292 #define BTP_GAP_PADV_CREATE_SYNC_FLAG_REPORTS_DISABLED	0x01
293 #define BTP_GAP_PADV_CREATE_SYNC_FLAG_FILTER_DUPLICATES	0x02
294 
295 #define BTP_GAP_PADV_CREATE_SYNC		0x26
296 struct btp_gap_padv_create_sync_cmd {
297 	bt_addr_le_t address;
298 	uint8_t advertiser_sid;
299 	uint16_t skip;
300 	uint16_t sync_timeout;
301 	uint8_t flags;
302 } __packed;
303 
304 #define BTP_GAP_PADV_SYNC_TRANSFER_SET_INFO	0x27
305 struct btp_gap_padv_sync_transfer_set_info_cmd {
306 	bt_addr_le_t address;
307 	uint16_t service_data;
308 } __packed;
309 
310 #define BTP_GAP_PADV_SYNC_TRANSFER_START	0x28
311 struct btp_gap_padv_sync_transfer_start_cmd {
312 	uint16_t sync_handle;
313 	bt_addr_le_t address;
314 	uint16_t service_data;
315 } __packed;
316 
317 #define BTP_GAP_PADV_SYNC_TRANSFER_RECV_FLAG_REPORTS_DISABLED	0x01
318 
319 #define BTP_GAP_PADV_SYNC_TRANSFER_RECV		0x29
320 struct btp_gap_padv_sync_transfer_recv_cmd {
321 	bt_addr_le_t address;
322 	uint16_t skip;
323 	uint16_t sync_timeout;
324 	uint8_t flags;
325 } __packed;
326 
327 #define BTP_GAP_PAIR_V2_MODE_1			0x01
328 #define BTP_GAP_PAIR_V2_MODE_2			0x02
329 #define BTP_GAP_PAIR_V2_MODE_3			0x03
330 #define BTP_GAP_PAIR_V2_MODE_4			0x04
331 #define BTP_GAP_PAIR_V2_MODE_ANY		0xFF
332 
333 #define BTP_GAP_PAIR_V2_LEVEL_0			0x00
334 #define BTP_GAP_PAIR_V2_LEVEL_1			0x01
335 #define BTP_GAP_PAIR_V2_LEVEL_2			0x02
336 #define BTP_GAP_PAIR_V2_LEVEL_3			0x03
337 #define BTP_GAP_PAIR_V2_LEVEL_4			0x04
338 #define BTP_GAP_PAIR_V2_LEVEL_ANY		0xFF
339 
340 #define BTP_GAP_PAIR_V2_FLAG_FORCE_PAIR		BIT(0)
341 
342 #define BTP_GAP_PAIR_V2				0x2A
343 struct btp_gap_pair_v2_cmd {
344 	bt_addr_le_t address;
345 	uint8_t mode;
346 	uint8_t level;
347 	uint8_t flags;
348 } __packed;
349 
350 #define BTP_GAP_SET_RPA_TIMEOUT                 0x30
351 struct btp_gap_set_rpa_timeout_cmd {
352 	uint16_t rpa_timeout;
353 } __packed;
354 
355 /* events */
356 #define BTP_GAP_EV_NEW_SETTINGS			0x80
357 struct btp_gap_new_settings_ev {
358 	uint32_t current_settings;
359 } __packed;
360 
361 #define BTP_GAP_DEVICE_FOUND_FLAG_RSSI		0x01
362 #define BTP_GAP_DEVICE_FOUND_FLAG_AD		0x02
363 #define BTP_GAP_DEVICE_FOUND_FLAG_SD		0x04
364 
365 #define BTP_GAP_EV_DEVICE_FOUND			0x81
366 struct btp_gap_device_found_ev {
367 	bt_addr_le_t address;
368 	int8_t   rssi;
369 	uint8_t  flags;
370 	uint16_t eir_data_len;
371 	uint8_t  eir_data[];
372 } __packed;
373 
374 #define BTP_GAP_EV_DEVICE_CONNECTED		0x82
375 struct btp_gap_device_connected_ev {
376 	bt_addr_le_t address;
377 	uint16_t interval;
378 	uint16_t latency;
379 	uint16_t timeout;
380 } __packed;
381 
382 #define BTP_GAP_EV_DEVICE_DISCONNECTED		0x83
383 struct btp_gap_device_disconnected_ev {
384 	bt_addr_le_t address;
385 } __packed;
386 
387 #define BTP_GAP_EV_PASSKEY_DISPLAY		0x84
388 struct btp_gap_passkey_display_ev {
389 	bt_addr_le_t address;
390 	uint32_t passkey;
391 } __packed;
392 
393 #define BTP_GAP_EV_PASSKEY_ENTRY_REQ		0x85
394 struct btp_gap_passkey_entry_req_ev {
395 	bt_addr_le_t address;
396 } __packed;
397 
398 #define BTP_GAP_EV_PASSKEY_CONFIRM_REQ		0x86
399 struct btp_gap_passkey_confirm_req_ev {
400 	bt_addr_le_t address;
401 	uint32_t passkey;
402 } __packed;
403 
404 #define BTP_GAP_EV_IDENTITY_RESOLVED		0x87
405 struct btp_gap_identity_resolved_ev {
406 	bt_addr_le_t address;
407 	bt_addr_le_t identity_address;
408 } __packed;
409 
410 #define BTP_GAP_EV_CONN_PARAM_UPDATE		0x88
411 struct btp_gap_conn_param_update_ev {
412 	bt_addr_le_t address;
413 	uint16_t interval;
414 	uint16_t latency;
415 	uint16_t timeout;
416 } __packed;
417 
418 #define BTP_GAP_SEC_LEVEL_UNAUTH_ENC		0x01
419 #define BTP_GAP_SEC_LEVEL_AUTH_ENC		0x02
420 #define BTP_GAP_SEC_LEVEL_AUTH_SC		0x03
421 
422 #define BTP_GAP_EV_SEC_LEVEL_CHANGED		0x89
423 struct btp_gap_sec_level_changed_ev {
424 	bt_addr_le_t address;
425 	uint8_t sec_level;
426 } __packed;
427 
428 #define BTP_GAP_EV_PAIRING_CONSENT_REQ		0x8a
429 struct btp_gap_pairing_consent_req_ev {
430 	bt_addr_le_t address;
431 } __packed;
432 
433 #define BTP_GAP_EV_BOND_LOST			0x8b
434 struct btp_gap_bond_lost_ev {
435 	bt_addr_le_t address;
436 } __packed;
437 
438 #define BTP_GAP_EV_PAIRING_FAILED		0x8c
439 struct btp_gap_bond_pairing_failed_ev {
440 	bt_addr_le_t address;
441 	uint8_t reason;
442 } __packed;
443 
444 #define BTP_GAP_EV_PERIODIC_SYNC_ESTABLISHED	0x8d
445 struct btp_gap_ev_periodic_sync_established_ev {
446 	bt_addr_le_t address;
447 	uint16_t sync_handle;
448 	uint8_t status;
449 } __packed;
450 
451 #define BTP_GAP_EV_PERIODIC_SYNC_LOST		0x8e
452 struct btp_gap_ev_periodic_sync_lost_ev {
453 	uint16_t sync_handle;
454 	uint8_t reason;
455 } __packed;
456 
457 #define BTP_GAP_EV_PERIODIC_REPORT		0x8f
458 struct btp_gap_ev_periodic_report_ev {
459 	uint16_t sync_handle;
460 	uint8_t tx_power;
461 	uint8_t rssi;
462 	uint8_t cte_type;
463 	uint8_t data_status;
464 	uint8_t data_len;
465 	uint8_t data[];
466 } __packed;
467 
468 #define BTP_GAP_EV_PERIODIC_TRANSFER_RECEIVED	0x90
469 struct btp_gap_ev_periodic_transfer_received_ev {
470 	bt_addr_le_t adv_address;
471 	uint16_t sync_handle;
472 	uint8_t status;
473 	bt_addr_le_t peer_address;
474 } __packed;
475 
476 #define BTP_GAP_EV_ENCRYPTION_CHANGE		0x91
477 struct btp_gap_encryption_change_ev {
478 	bt_addr_le_t address;
479 	uint8_t enabled;
480 	uint8_t key_size;
481 } __packed;
482 
483 #if defined(CONFIG_BT_EXT_ADV)
484 struct bt_le_per_adv_param;
485 struct bt_le_per_adv_sync_param;
486 struct bt_le_adv_param;
487 struct bt_data;
488 struct bt_le_ext_adv *tester_gap_ext_adv_get(uint8_t ext_adv_idx);
489 struct bt_le_per_adv_sync *tester_gap_padv_get(void);
490 int tester_gap_create_adv_instance(struct bt_le_adv_param *param, uint8_t own_addr_type,
491 				   const struct bt_data *ad, size_t ad_len,
492 				   const struct bt_data *sd, size_t sd_len,
493 				   uint32_t *settings, struct bt_le_ext_adv **ext_adv);
494 int tester_gap_stop_ext_adv(struct bt_le_ext_adv *ext_adv);
495 int tester_gap_start_ext_adv(struct bt_le_ext_adv *ext_adv);
496 int tester_gap_padv_configure(struct bt_le_ext_adv *ext_adv,
497 			      const struct bt_le_per_adv_param *param);
498 int tester_gap_padv_set_data(struct bt_le_ext_adv *ext_adv, struct bt_data *per_ad, uint8_t ad_len);
499 int tester_gap_padv_start(struct bt_le_ext_adv *ext_adv);
500 int tester_gap_padv_stop(struct bt_le_ext_adv *ext_adv);
501 int tester_gap_padv_create_sync(struct bt_le_per_adv_sync_param *create_params);
502 int tester_gap_padv_stop_sync(void);
503 #endif /* defined(CONFIG_BT_EXT_ADV) */
504