1 /* gap.c - Bluetooth GAP Tester */
2 
3 /*
4  * Copyright (c) 2015-2016 Intel Corporation
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 #include <stdint.h>
9 
10 #include <zephyr/bluetooth/audio/bap.h>
11 #include <zephyr/bluetooth/addr.h>
12 #include <zephyr/bluetooth/gap.h>
13 #include <zephyr/sys/atomic.h>
14 #include <zephyr/sys/util_macro.h>
15 #include <zephyr/types.h>
16 #include <string.h>
17 
18 #include <zephyr/toolchain.h>
19 #include <zephyr/bluetooth/bluetooth.h>
20 #include <zephyr/bluetooth/conn.h>
21 #include <zephyr/bluetooth/gatt.h>
22 #include <zephyr/bluetooth/hci.h>
23 
24 #include <zephyr/sys/byteorder.h>
25 #include <zephyr/net_buf.h>
26 
27 #include <hci_core.h>
28 
29 #include <zephyr/logging/log.h>
30 #define LOG_MODULE_NAME bttester_gap
31 LOG_MODULE_REGISTER(LOG_MODULE_NAME, CONFIG_BTTESTER_LOG_LEVEL);
32 
33 #include "btp/btp.h"
34 
35 #define CONTROLLER_NAME "btp_tester"
36 
37 #define BT_LE_AD_DISCOV_MASK (BT_LE_AD_LIMITED | BT_LE_AD_GENERAL)
38 #if defined(CONFIG_BT_EXT_ADV)
39 #define ADV_BUF_LEN (sizeof(struct btp_gap_device_found_ev) + 2 * CONFIG_BT_EXT_SCAN_BUF_SIZE)
40 #else
41 #define ADV_BUF_LEN (sizeof(struct btp_gap_device_found_ev) + 2 * 31)
42 #endif
43 
44 static atomic_t current_settings;
45 struct bt_conn_auth_cb cb;
46 static uint8_t oob_legacy_tk[16] = { 0 };
47 
48 static bool filter_list_in_use;
49 
50 static struct bt_le_oob oob_sc_local = { 0 };
51 static struct bt_le_oob oob_sc_remote = { 0 };
52 
53 /* connection parameters for rejection test */
54 #define REJECT_INTERVAL_MIN 0x0C80
55 #define REJECT_INTERVAL_MAX 0x0C80
56 #define REJECT_LATENCY 0x0000
57 #define REJECT_SUPERVISION_TIMEOUT 0x0C80
58 
59 static struct {
60 	bt_addr_le_t addr;
61 	bool supported;
62 } cars[CONFIG_BT_MAX_PAIRED];
63 
read_car_cb(struct bt_conn * conn,uint8_t err,struct bt_gatt_read_params * params,const void * data,uint16_t length)64 static uint8_t read_car_cb(struct bt_conn *conn, uint8_t err,
65 			  struct bt_gatt_read_params *params, const void *data,
66 			  uint16_t length)
67 {
68 	struct bt_conn_info info;
69 	bool supported = false;
70 
71 	if (!err && data && length == 1) {
72 		const uint8_t *tmp = data;
73 
74 		/* only 0 or 1 are valid values */
75 		if (tmp[0] == 1) {
76 			supported = true;
77 		}
78 	}
79 
80 	bt_conn_get_info(conn, &info);
81 
82 	for (int i = 0; i < CONFIG_BT_MAX_PAIRED; i++) {
83 		if (bt_addr_le_eq(info.le.dst, &cars[i].addr)) {
84 			cars[i].supported = supported;
85 			break;
86 		}
87 	}
88 
89 	return BT_GATT_ITER_STOP;
90 }
91 
92 static struct bt_gatt_read_params read_car_params = {
93 	.func = read_car_cb,
94 	.by_uuid.uuid = BT_UUID_CENTRAL_ADDR_RES,
95 	.by_uuid.start_handle = BT_ATT_FIRST_ATTRIBUTE_HANDLE,
96 	.by_uuid.end_handle = BT_ATT_LAST_ATTRIBUTE_HANDLE,
97 };
98 
le_connected(struct bt_conn * conn,uint8_t err)99 static void le_connected(struct bt_conn *conn, uint8_t err)
100 {
101 	struct btp_gap_device_connected_ev ev;
102 	char addr_str[BT_ADDR_LE_STR_LEN];
103 	struct bt_conn_info info;
104 
105 	(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr_str, sizeof(addr_str));
106 	LOG_DBG("%s: 0x%02x", addr_str, err);
107 
108 	if (err) {
109 		return;
110 	}
111 
112 	bt_conn_get_info(conn, &info);
113 
114 	bt_addr_le_copy(&ev.address, info.le.dst);
115 	ev.interval = sys_cpu_to_le16(info.le.interval);
116 	ev.latency = sys_cpu_to_le16(info.le.latency);
117 	ev.timeout = sys_cpu_to_le16(info.le.timeout);
118 
119 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_CONNECTED, &ev, sizeof(ev));
120 
121 	if (info.role == BT_CONN_ROLE_PERIPHERAL) {
122 		struct btp_gap_new_settings_ev sev;
123 
124 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
125 		sev.current_settings = sys_cpu_to_le32(current_settings);
126 		tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_NEW_SETTINGS, &sev, sizeof(sev));
127 	}
128 }
129 
le_disconnected(struct bt_conn * conn,uint8_t reason)130 static void le_disconnected(struct bt_conn *conn, uint8_t reason)
131 {
132 	struct btp_gap_device_disconnected_ev ev;
133 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
134 	char addr_str[BT_ADDR_LE_STR_LEN];
135 
136 	(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr_str, sizeof(addr_str));
137 	LOG_DBG("%s: 0x%02x", addr_str, reason);
138 
139 	bt_addr_le_copy(&ev.address, addr);
140 
141 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_DISCONNECTED, &ev, sizeof(ev));
142 }
143 
le_identity_resolved(struct bt_conn * conn,const bt_addr_le_t * rpa,const bt_addr_le_t * identity)144 static void le_identity_resolved(struct bt_conn *conn, const bt_addr_le_t *rpa,
145 				 const bt_addr_le_t *identity)
146 {
147 	struct btp_gap_identity_resolved_ev ev;
148 
149 	bt_addr_le_copy(&ev.address, rpa);
150 	bt_addr_le_copy(&ev.identity_address, identity);
151 
152 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_IDENTITY_RESOLVED, &ev, sizeof(ev));
153 }
154 
le_param_updated(struct bt_conn * conn,uint16_t interval,uint16_t latency,uint16_t timeout)155 static void le_param_updated(struct bt_conn *conn, uint16_t interval,
156 			     uint16_t latency, uint16_t timeout)
157 {
158 	struct btp_gap_conn_param_update_ev ev;
159 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
160 
161 	bt_addr_le_copy(&ev.address, addr);
162 	ev.interval = sys_cpu_to_le16(interval);
163 	ev.latency = sys_cpu_to_le16(latency);
164 	ev.timeout = sys_cpu_to_le16(timeout);
165 
166 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_CONN_PARAM_UPDATE, &ev, sizeof(ev));
167 }
168 
le_param_req(struct bt_conn * conn,struct bt_le_conn_param * param)169 static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param)
170 {
171 	/* reject update if all parameters match reject pattern */
172 	if ((param->interval_min == REJECT_INTERVAL_MIN) &&
173 			(param->interval_max == REJECT_INTERVAL_MAX) &&
174 			(param->latency == REJECT_LATENCY) &&
175 			(param->timeout == REJECT_SUPERVISION_TIMEOUT)) {
176 		return false;
177 	}
178 
179 	return true;
180 }
181 
le_security_changed(struct bt_conn * conn,bt_security_t level,enum bt_security_err err)182 static void le_security_changed(struct bt_conn *conn, bt_security_t level,
183 				enum bt_security_err err)
184 {
185 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
186 	struct btp_gap_sec_level_changed_ev sec_ev;
187 	struct btp_gap_bond_lost_ev bond_ev;
188 	struct bt_conn_info info;
189 
190 	switch (err) {
191 	case BT_SECURITY_ERR_SUCCESS:
192 		bt_addr_le_copy(&sec_ev.address, addr);
193 		/* enum matches BTP values */
194 		sec_ev.sec_level = level;
195 
196 		tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_SEC_LEVEL_CHANGED,
197 			     &sec_ev, sizeof(sec_ev));
198 		break;
199 	case BT_SECURITY_ERR_PIN_OR_KEY_MISSING:
200 		/* for central role this means that peer have no LTK when we
201 		 * started encryption procedure
202 		 *
203 		 * This means bond is lost and we restart pairing to re-bond
204 		 */
205 		if (bt_conn_get_info(conn, &info) == 0 &&
206 		    info.role == BT_CONN_ROLE_CENTRAL) {
207 			LOG_DBG("Bond lost");
208 
209 			bt_addr_le_copy(&bond_ev.address, addr);
210 
211 			tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_BOND_LOST,
212 				     &bond_ev, sizeof(bond_ev));
213 
214 			(void)bt_conn_set_security(conn, BT_SECURITY_L2 | BT_SECURITY_FORCE_PAIR);
215 		}
216 		break;
217 	default:
218 		break;
219 	}
220 }
221 
222 static struct bt_conn_cb conn_callbacks = {
223 	.connected = le_connected,
224 	.disconnected = le_disconnected,
225 	.identity_resolved = le_identity_resolved,
226 	.le_param_updated = le_param_updated,
227 	.le_param_req = le_param_req,
228 	.security_changed = le_security_changed,
229 };
230 
supported_commands(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)231 static uint8_t supported_commands(const void *cmd, uint16_t cmd_len,
232 				  void *rsp, uint16_t *rsp_len)
233 {
234 	struct btp_gap_read_supported_commands_rp *rp = rsp;
235 
236 	/* octet 0 */
237 	tester_set_bit(rp->data, BTP_GAP_READ_SUPPORTED_COMMANDS);
238 	tester_set_bit(rp->data, BTP_GAP_READ_CONTROLLER_INDEX_LIST);
239 	tester_set_bit(rp->data, BTP_GAP_READ_CONTROLLER_INFO);
240 	tester_set_bit(rp->data, BTP_GAP_SET_POWERED);
241 	tester_set_bit(rp->data, BTP_GAP_SET_CONNECTABLE);
242 
243 	/* octet 1 */
244 	tester_set_bit(rp->data, BTP_GAP_SET_DISCOVERABLE);
245 	tester_set_bit(rp->data, BTP_GAP_SET_BONDABLE);
246 	tester_set_bit(rp->data, BTP_GAP_START_ADVERTISING);
247 	tester_set_bit(rp->data, BTP_GAP_STOP_ADVERTISING);
248 	tester_set_bit(rp->data, BTP_GAP_START_DISCOVERY);
249 	tester_set_bit(rp->data, BTP_GAP_STOP_DISCOVERY);
250 	tester_set_bit(rp->data, BTP_GAP_CONNECT);
251 	tester_set_bit(rp->data, BTP_GAP_DISCONNECT);
252 
253 	/* octet 2 */
254 	tester_set_bit(rp->data, BTP_GAP_SET_IO_CAP);
255 	tester_set_bit(rp->data, BTP_GAP_PAIR);
256 	tester_set_bit(rp->data, BTP_GAP_PASSKEY_ENTRY);
257 	tester_set_bit(rp->data, BTP_GAP_PASSKEY_CONFIRM);
258 	tester_set_bit(rp->data, BTP_GAP_START_DIRECTED_ADV);
259 	tester_set_bit(rp->data, BTP_GAP_CONN_PARAM_UPDATE);
260 
261 	/* octet 3 */
262 	tester_set_bit(rp->data, BTP_GAP_OOB_LEGACY_SET_DATA);
263 	if (!IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
264 		tester_set_bit(rp->data, BTP_GAP_OOB_SC_GET_LOCAL_DATA);
265 		tester_set_bit(rp->data, BTP_GAP_OOB_SC_SET_REMOTE_DATA);
266 	}
267 
268 	tester_set_bit(rp->data, BTP_GAP_SET_MITM);
269 	tester_set_bit(rp->data, BTP_GAP_SET_FILTER_LIST);
270 	if (IS_ENABLED(CONFIG_BT_EXT_ADV)) {
271 		tester_set_bit(rp->data, BTP_GAP_SET_EXTENDED_ADVERTISING);
272 	}
273 
274 	*rsp_len = sizeof(*rp) + 4;
275 
276 	return BTP_STATUS_SUCCESS;
277 }
278 
controller_index_list(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)279 static uint8_t controller_index_list(const void *cmd, uint16_t cmd_len,
280 				     void *rsp, uint16_t *rsp_len)
281 {
282 	struct btp_gap_read_controller_index_list_rp *rp = rsp;
283 
284 	rp->num = 1U;
285 	rp->index[0] = BTP_INDEX;
286 
287 	*rsp_len = sizeof(*rp) + 1;
288 
289 	return BTP_STATUS_SUCCESS;
290 }
291 
controller_info(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)292 static uint8_t controller_info(const void *cmd, uint16_t cmd_len,
293 			       void *rsp, uint16_t *rsp_len)
294 {
295 	struct btp_gap_read_controller_info_rp *rp = rsp;
296 	uint32_t supported_settings;
297 	struct bt_le_oob oob_local = { 0 };
298 
299 	bt_le_oob_get_local(BT_ID_DEFAULT, &oob_local);
300 
301 	bt_addr_copy(&rp->address, &oob_local.addr.a);
302 
303 	/*
304 	 * Re-use the oob data read here in get_oob_sc_local_data()
305 	 */
306 	if (!IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
307 		oob_sc_local = oob_local;
308 	}
309 
310 	/*
311 	 * If privacy is used, the device uses random type address, otherwise
312 	 * static random or public type address is used.
313 	 */
314 	if (!IS_ENABLED(CONFIG_BT_PRIVACY)) {
315 		if (oob_local.addr.type == BT_ADDR_LE_RANDOM) {
316 			atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_STATIC_ADDRESS);
317 		}
318 	}
319 
320 	supported_settings = BIT(BTP_GAP_SETTINGS_POWERED);
321 	supported_settings |= BIT(BTP_GAP_SETTINGS_CONNECTABLE);
322 	supported_settings |= BIT(BTP_GAP_SETTINGS_BONDABLE);
323 	supported_settings |= BIT(BTP_GAP_SETTINGS_LE);
324 	supported_settings |= BIT(BTP_GAP_SETTINGS_ADVERTISING);
325 	supported_settings |= BIT(BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
326 
327 	rp->supported_settings = sys_cpu_to_le32(supported_settings);
328 	rp->current_settings = sys_cpu_to_le32(current_settings);
329 
330 	memcpy(rp->name, CONTROLLER_NAME, sizeof(CONTROLLER_NAME));
331 
332 	*rsp_len = sizeof(*rp);
333 
334 	return BTP_STATUS_SUCCESS;
335 }
336 
oob_config_str(int oob_config)337 static const char *oob_config_str(int oob_config)
338 {
339 	if (!IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
340 		return "no";
341 	}
342 
343 	switch (oob_config) {
344 	case BT_CONN_OOB_LOCAL_ONLY:
345 		return "Local";
346 	case BT_CONN_OOB_REMOTE_ONLY:
347 		return "Remote";
348 	case BT_CONN_OOB_BOTH_PEERS:
349 		return "Local and Remote";
350 	case BT_CONN_OOB_NO_DATA:
351 	default:
352 		return "no";
353 	}
354 }
355 
oob_data_request(struct bt_conn * conn,struct bt_conn_oob_info * oob_info)356 static void oob_data_request(struct bt_conn *conn,
357 			     struct bt_conn_oob_info *oob_info)
358 {
359 	struct bt_conn_info info;
360 	int err = bt_conn_get_info(conn, &info);
361 
362 	if (err) {
363 		return;
364 	}
365 
366 	char addr[BT_ADDR_LE_STR_LEN];
367 
368 	bt_addr_le_to_str(info.le.dst, addr, sizeof(addr));
369 
370 	switch (oob_info->type) {
371 	case BT_CONN_OOB_LE_SC:
372 	{
373 		if (IS_ENABLED(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)) {
374 			LOG_ERR("OOB LE SC not supported");
375 			break;
376 		}
377 
378 		LOG_DBG("Set %s OOB SC data for %s, ",
379 			oob_config_str(oob_info->lesc.oob_config),
380 			addr);
381 
382 		struct bt_le_oob_sc_data *oobd_local =
383 			oob_info->lesc.oob_config != BT_CONN_OOB_REMOTE_ONLY ?
384 				      &oob_sc_local.le_sc_data :
385 				      NULL;
386 
387 		struct bt_le_oob_sc_data *oobd_remote =
388 			oob_info->lesc.oob_config != BT_CONN_OOB_LOCAL_ONLY ?
389 				      &oob_sc_remote.le_sc_data :
390 				      NULL;
391 
392 		if (oobd_remote) {
393 			/* Assume that oob_sc_remote
394 			 * corresponds to the currently connected peer
395 			 */
396 			bt_addr_le_copy(&oob_sc_remote.addr, info.le.remote);
397 		}
398 
399 		if (oobd_local &&
400 		    !bt_addr_le_eq(info.le.local, &oob_sc_local.addr)) {
401 			bt_addr_le_to_str(info.le.local, addr, sizeof(addr));
402 			LOG_DBG("No OOB data available for local %s",
403 				addr);
404 			bt_conn_auth_cancel(conn);
405 			return;
406 		}
407 
408 		err = bt_le_oob_set_sc_data(conn, oobd_local, oobd_remote);
409 		if (err) {
410 			LOG_DBG("bt_le_oob_set_sc_data failed with: %d", err);
411 		}
412 
413 		break;
414 	}
415 
416 	case BT_CONN_OOB_LE_LEGACY:
417 		if (IS_ENABLED(CONFIG_BT_SMP_SC_PAIR_ONLY)) {
418 			LOG_ERR("OOB LE Legacy not supported");
419 			break;
420 		}
421 
422 		LOG_DBG("Legacy OOB TK requested from remote %s", addr);
423 
424 		err = bt_le_oob_set_legacy_tk(conn, oob_legacy_tk);
425 		if (err < 0) {
426 			LOG_ERR("Failed to set OOB TK: %d", err);
427 		}
428 
429 		break;
430 	default:
431 		LOG_ERR("Unhandled OOB type %d", oob_info->type);
432 		break;
433 	}
434 }
435 
436 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
get_oob_sc_local_data(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)437 static uint8_t get_oob_sc_local_data(const void *cmd, uint16_t cmd_len,
438 				     void *rsp, uint16_t *rsp_len)
439 {
440 	struct btp_gap_oob_sc_get_local_data_rp *rp = rsp;
441 
442 	cb.oob_data_request = oob_data_request;
443 
444 	memcpy(rp->conf, &oob_sc_local.le_sc_data.c[0], sizeof(rp->conf));
445 	memcpy(rp->rand, &oob_sc_local.le_sc_data.r[0], sizeof(rp->rand));
446 
447 	*rsp_len = sizeof(*rp);
448 	return BTP_STATUS_SUCCESS;
449 }
450 
set_oob_sc_remote_data(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)451 static uint8_t set_oob_sc_remote_data(const void *cmd, uint16_t cmd_len,
452 				      void *rsp, uint16_t *rsp_len)
453 {
454 	const struct btp_gap_oob_sc_set_remote_data_cmd *cp = cmd;
455 
456 	cb.oob_data_request = oob_data_request;
457 	bt_le_oob_set_sc_flag(true);
458 
459 	/* Note that the .addr field
460 	 * will be set by the oob_data_request callback
461 	 */
462 	memcpy(&oob_sc_remote.le_sc_data.r[0], cp->rand,
463 	       sizeof(oob_sc_remote.le_sc_data.r));
464 	memcpy(&oob_sc_remote.le_sc_data.c[0], cp->conf,
465 	       sizeof(oob_sc_remote.le_sc_data.c));
466 
467 	return BTP_STATUS_SUCCESS;
468 }
469 #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
470 
set_powered(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)471 static uint8_t set_powered(const void *cmd, uint16_t cmd_len,
472 					void *rsp, uint16_t *rsp_len)
473 {
474 	const struct btp_gap_set_powered_cmd *cp = cmd;
475 	struct btp_gap_set_powered_rp *rp = rsp;
476 	int err;
477 
478 	if (cp->powered) {
479 		err = bt_enable(NULL);
480 		if (err < 0) {
481 			LOG_ERR("Unable to enable Bluetooth: %d", err);
482 			return BTP_STATUS_FAILED;
483 		}
484 		bt_conn_cb_register(&conn_callbacks);
485 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_POWERED);
486 	} else {
487 		err = bt_disable();
488 		if (err < 0) {
489 			LOG_ERR("Unable to disable Bluetooth: %d", err);
490 			return BTP_STATUS_FAILED;
491 		}
492 		bt_conn_cb_unregister(&conn_callbacks);
493 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_POWERED);
494 	}
495 	rp->current_settings = sys_cpu_to_le32(current_settings);
496 
497 	*rsp_len = sizeof(*rp);
498 
499 	return BTP_STATUS_SUCCESS;
500 }
501 
set_connectable(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)502 static uint8_t set_connectable(const void *cmd, uint16_t cmd_len,
503 			       void *rsp, uint16_t *rsp_len)
504 {
505 	const struct btp_gap_set_connectable_cmd *cp = cmd;
506 	struct btp_gap_set_connectable_rp *rp = rsp;
507 
508 	if (cp->connectable) {
509 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_CONNECTABLE);
510 	} else {
511 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_CONNECTABLE);
512 	}
513 
514 	rp->current_settings = sys_cpu_to_le32(current_settings);
515 
516 	*rsp_len = sizeof(*rp);
517 
518 	return BTP_STATUS_SUCCESS;
519 }
520 
521 static uint8_t ad_flags = BT_LE_AD_NO_BREDR;
522 static struct bt_data ad[10] = {
523 	BT_DATA(BT_DATA_FLAGS, &ad_flags, sizeof(ad_flags)),
524 };
525 static struct bt_data sd[10];
526 
527 #if CONFIG_BT_EXT_ADV
528 static struct bt_le_ext_adv *ext_adv_sets[CONFIG_BT_EXT_ADV_MAX_ADV_SET];
529 #else
530 static struct bt_le_ext_adv *ext_adv_sets[1];
531 #endif
532 
tester_gap_ext_adv_get(uint8_t ext_adv_idx)533 struct bt_le_ext_adv *tester_gap_ext_adv_get(uint8_t ext_adv_idx)
534 {
535 	if (!IS_ENABLED(CONFIG_BT_EXT_ADV)) {
536 		return NULL;
537 	}
538 
539 	if (ext_adv_idx >= ARRAY_SIZE(ext_adv_sets)) {
540 		LOG_ERR("Invalid ext_adv_id: %d", ext_adv_idx);
541 		return NULL;
542 	}
543 
544 	return ext_adv_sets[ext_adv_idx];
545 }
546 
tester_gap_ext_adv_idx_free_get(void)547 static int tester_gap_ext_adv_idx_free_get(void)
548 {
549 	if (!IS_ENABLED(CONFIG_BT_EXT_ADV)) {
550 		return -ENOTSUP;
551 	}
552 
553 	for (int i = 0; i < ARRAY_SIZE(ext_adv_sets); i++) {
554 		if (ext_adv_sets[i] == NULL) {
555 			return i;
556 		}
557 	}
558 
559 	return -ENOMEM;
560 }
561 
tester_gap_start_ext_adv(struct bt_le_ext_adv * ext_adv)562 int tester_gap_start_ext_adv(struct bt_le_ext_adv *ext_adv)
563 {
564 	if (!IS_ENABLED(CONFIG_BT_EXT_ADV)) {
565 		return -ENOTSUP;
566 	}
567 
568 	int err;
569 
570 	if (ext_adv == NULL) {
571 		LOG_ERR("Invalid ext_adv");
572 		return -EINVAL;
573 	}
574 
575 	err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT);
576 	if (err != 0) {
577 		LOG_ERR("Failed to start advertising");
578 		return -EINVAL;
579 	}
580 
581 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
582 
583 	return 0;
584 }
585 
tester_gap_stop_ext_adv(struct bt_le_ext_adv * ext_adv)586 int tester_gap_stop_ext_adv(struct bt_le_ext_adv *ext_adv)
587 {
588 	if (!IS_ENABLED(CONFIG_BT_EXT_ADV)) {
589 		return -ENOTSUP;
590 	}
591 
592 	int err;
593 
594 	if (ext_adv == NULL) {
595 		LOG_ERR("Invalid ext_adv");
596 		return -EINVAL;
597 	}
598 
599 	err = bt_le_ext_adv_stop(ext_adv);
600 	if (err != 0) {
601 		LOG_ERR("Failed to stop advertising");
602 
603 		return -EINVAL;
604 	}
605 
606 	atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
607 
608 	return 0;
609 }
610 
set_discoverable(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)611 static uint8_t set_discoverable(const void *cmd, uint16_t cmd_len,
612 			       void *rsp, uint16_t *rsp_len)
613 {
614 	const struct btp_gap_set_discoverable_cmd *cp = cmd;
615 	struct btp_gap_set_discoverable_rp *rp = rsp;
616 
617 	switch (cp->discoverable) {
618 	case BTP_GAP_NON_DISCOVERABLE:
619 		ad_flags &= ~(BT_LE_AD_GENERAL | BT_LE_AD_LIMITED);
620 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_DISCOVERABLE);
621 		break;
622 	case BTP_GAP_GENERAL_DISCOVERABLE:
623 		ad_flags &= ~BT_LE_AD_LIMITED;
624 		ad_flags |= BT_LE_AD_GENERAL;
625 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_DISCOVERABLE);
626 		break;
627 	case BTP_GAP_LIMITED_DISCOVERABLE:
628 		ad_flags &= ~BT_LE_AD_GENERAL;
629 		ad_flags |= BT_LE_AD_LIMITED;
630 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_DISCOVERABLE);
631 		break;
632 	default:
633 		return BTP_STATUS_FAILED;
634 	}
635 
636 	rp->current_settings = sys_cpu_to_le32(current_settings);
637 
638 	*rsp_len = sizeof(*rp);
639 	return BTP_STATUS_SUCCESS;
640 }
641 
set_bondable(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)642 static uint8_t set_bondable(const void *cmd, uint16_t cmd_len,
643 			    void *rsp, uint16_t *rsp_len)
644 {
645 	const struct btp_gap_set_bondable_cmd *cp = cmd;
646 	struct btp_gap_set_bondable_rp *rp = rsp;
647 
648 	LOG_DBG("bondable: %d", cp->bondable);
649 
650 	if (cp->bondable) {
651 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_BONDABLE);
652 	} else {
653 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_BONDABLE);
654 	}
655 
656 	bt_set_bondable(cp->bondable);
657 
658 	rp->current_settings = sys_cpu_to_le32(current_settings);
659 	*rsp_len = sizeof(*rp);
660 	return BTP_STATUS_SUCCESS;
661 }
662 
tester_gap_create_adv_instance(struct bt_le_adv_param * param,uint8_t own_addr_type,const struct bt_data * ad,size_t ad_len,const struct bt_data * sd,size_t sd_len,uint32_t * settings,struct bt_le_ext_adv ** ext_adv)663 int tester_gap_create_adv_instance(struct bt_le_adv_param *param,
664 				   uint8_t own_addr_type, const struct bt_data *ad, size_t ad_len,
665 				   const struct bt_data *sd, size_t sd_len, uint32_t *settings,
666 				   struct bt_le_ext_adv **ext_adv)
667 {
668 	int err = 0;
669 
670 	if (settings != NULL) {
671 		atomic_set(&current_settings, *settings);
672 	}
673 
674 	if (atomic_test_bit(&current_settings, BTP_GAP_SETTINGS_CONNECTABLE)) {
675 		param->options |= BT_LE_ADV_OPT_CONN;
676 
677 		if (filter_list_in_use) {
678 			param->options |= BT_LE_ADV_OPT_FILTER_CONN;
679 		}
680 	}
681 
682 	if (filter_list_in_use) {
683 		param->options |= BT_LE_ADV_OPT_FILTER_SCAN_REQ;
684 	}
685 
686 	switch (own_addr_type) {
687 	case BTP_GAP_ADDR_TYPE_IDENTITY:
688 		param->options |= BT_LE_ADV_OPT_USE_IDENTITY;
689 		break;
690 	case BTP_GAP_ADDR_TYPE_RESOLVABLE_PRIVATE:
691 		if (!IS_ENABLED(CONFIG_BT_PRIVACY)) {
692 			return -EINVAL;
693 		}
694 
695 		/* RPA usage is controlled via privacy settings */
696 		if (!atomic_test_bit(&current_settings, BTP_GAP_SETTINGS_PRIVACY)) {
697 			return -EINVAL;
698 		}
699 		break;
700 	case BTP_GAP_ADDR_TYPE_NON_RESOLVABLE_PRIVATE:
701 		if (!IS_ENABLED(CONFIG_BT_PRIVACY)) {
702 			return -EINVAL;
703 		}
704 
705 		/* NRPA is used only for non-connectable advertising */
706 		if (atomic_test_bit(&current_settings, BTP_GAP_SETTINGS_CONNECTABLE)) {
707 			return -EINVAL;
708 		}
709 		break;
710 	default:
711 		return -EINVAL;
712 	}
713 
714 	if (IS_ENABLED(CONFIG_BT_EXT_ADV) && atomic_test_bit(&current_settings,
715 	    BTP_GAP_SETTINGS_EXTENDED_ADVERTISING)) {
716 
717 		param->options |= BT_LE_ADV_OPT_EXT_ADV;
718 		if (*ext_adv) {
719 			err = bt_le_ext_adv_stop(*ext_adv);
720 			if (err != 0) {
721 				return err;
722 			}
723 
724 			err = bt_le_ext_adv_delete(*ext_adv);
725 			if (err != 0) {
726 				return err;
727 			}
728 
729 			*ext_adv = NULL;
730 		}
731 
732 		int index = tester_gap_ext_adv_idx_free_get();
733 
734 		if (index < 0) {
735 			LOG_ERR("No free ext_adv index");
736 			return -ENOMEM;
737 		}
738 
739 		/* Set the set_id to be matching the index of the ext_adv set */
740 		param->sid = index;
741 
742 		err = bt_le_ext_adv_create(param, NULL, &ext_adv_sets[index]);
743 		if (err != 0) {
744 			return BTP_STATUS_FAILED;
745 		}
746 
747 		err = bt_le_ext_adv_set_data(ext_adv_sets[index], ad, ad_len, sd_len ?
748 					     sd : NULL, sd_len);
749 
750 		*ext_adv = ext_adv_sets[index];
751 	}
752 
753 	return err;
754 }
755 
start_advertising(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)756 static uint8_t start_advertising(const void *cmd, uint16_t cmd_len,
757 				 void *rsp, uint16_t *rsp_len)
758 {
759 	const struct btp_gap_start_advertising_cmd *cp = cmd;
760 	struct btp_gap_start_advertising_rp *rp = rsp;
761 	struct bt_le_adv_param param =
762 		BT_LE_ADV_PARAM_INIT(0, BT_GAP_ADV_FAST_INT_MIN_2, BT_GAP_ADV_FAST_INT_MAX_2, NULL);
763 	uint8_t own_addr_type;
764 	uint32_t duration;
765 	uint8_t adv_len;
766 	uint8_t sd_len;
767 	int err;
768 	int i;
769 
770 	/* This command is very unfortunate since after variable data there is
771 	 * additional 5 bytes (4 bytes for duration, 1 byte for own address
772 	 * type.
773 	 */
774 	if ((cmd_len < sizeof(*cp)) ||
775 	    (cmd_len != sizeof(*cp) + cp->adv_data_len + cp->scan_rsp_len +
776 			    sizeof(duration) + sizeof(own_addr_type))) {
777 		return BTP_STATUS_FAILED;
778 	}
779 
780 	/* currently ignored */
781 	duration = sys_get_le32(cp->adv_sr_data + cp->adv_data_len + cp->scan_rsp_len);
782 	(void)duration;
783 	own_addr_type = cp->adv_sr_data[cp->adv_data_len + cp->scan_rsp_len + sizeof(duration)];
784 
785 	for (i = 0, adv_len = 1U; i < cp->adv_data_len; adv_len++) {
786 		if (adv_len >= ARRAY_SIZE(ad)) {
787 			LOG_ERR("ad[] Out of memory");
788 			return BTP_STATUS_FAILED;
789 		}
790 
791 		ad[adv_len].type = cp->adv_sr_data[i++];
792 		ad[adv_len].data_len = cp->adv_sr_data[i++];
793 		ad[adv_len].data = &cp->adv_sr_data[i];
794 		i += ad[adv_len].data_len;
795 	}
796 
797 	for (sd_len = 0U; i < cp->adv_data_len + cp->scan_rsp_len; sd_len++) {
798 		if (sd_len >= ARRAY_SIZE(sd)) {
799 			LOG_ERR("sd[] Out of memory");
800 			return BTP_STATUS_FAILED;
801 		}
802 
803 		sd[sd_len].type = cp->adv_sr_data[i++];
804 		sd[sd_len].data_len = cp->adv_sr_data[i++];
805 		sd[sd_len].data = &cp->adv_sr_data[i];
806 		i += sd[sd_len].data_len;
807 	}
808 
809 	struct bt_le_ext_adv *ext_adv = NULL;
810 
811 	err = tester_gap_create_adv_instance(&param, own_addr_type, ad, adv_len, sd,
812 					     sd_len, NULL, &ext_adv);
813 	if (err != 0) {
814 		return BTP_STATUS_FAILED;
815 	}
816 
817 	if (IS_ENABLED(CONFIG_BT_EXT_ADV) &&
818 	    atomic_test_bit(&current_settings, BTP_GAP_SETTINGS_EXTENDED_ADVERTISING)) {
819 		err = bt_le_ext_adv_start(ext_adv, BT_LE_EXT_ADV_START_DEFAULT);
820 	} else {
821 		err = bt_le_adv_start(&param, ad, adv_len, sd_len ? sd : NULL, sd_len);
822 	}
823 
824 	/* BTP API don't allow to set empty scan response data. */
825 	if (err < 0) {
826 		LOG_ERR("Failed to start advertising");
827 
828 		return BTP_STATUS_FAILED;
829 	}
830 
831 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
832 	rp->current_settings = sys_cpu_to_le32(current_settings);
833 
834 	*rsp_len = sizeof(*rp);
835 	return BTP_STATUS_SUCCESS;
836 }
837 
start_directed_advertising(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)838 static uint8_t start_directed_advertising(const void *cmd, uint16_t cmd_len,
839 					  void *rsp, uint16_t *rsp_len)
840 {
841 	const struct btp_gap_start_directed_adv_cmd *cp = cmd;
842 	struct btp_gap_start_directed_adv_rp *rp = rsp;
843 	struct bt_le_adv_param adv_param;
844 	uint16_t options = sys_le16_to_cpu(cp->options);
845 
846 	adv_param = *BT_LE_ADV_CONN_DIR(&cp->address);
847 
848 	if (!(options & BTP_GAP_START_DIRECTED_ADV_HD)) {
849 		adv_param.options |= BT_LE_ADV_OPT_DIR_MODE_LOW_DUTY;
850 		adv_param.interval_max = BT_GAP_ADV_FAST_INT_MAX_2;
851 		adv_param.interval_min = BT_GAP_ADV_FAST_INT_MIN_2;
852 	}
853 
854 	if (IS_ENABLED(CONFIG_BT_PRIVACY) && (options & BTP_GAP_START_DIRECTED_ADV_PEER_RPA)) {
855 		/* check if peer supports Central Address Resolution */
856 		for (int i = 0; i < CONFIG_BT_MAX_PAIRED; i++) {
857 			if (bt_addr_le_eq(&cp->address, &cars[i].addr)) {
858 				if (cars[i].supported) {
859 					adv_param.options |= BT_LE_ADV_OPT_DIR_ADDR_RPA;
860 				}
861 			}
862 		}
863 	}
864 
865 	if (bt_le_adv_start(&adv_param, NULL, 0, NULL, 0) < 0) {
866 		LOG_ERR("Failed to start advertising");
867 		return BTP_STATUS_FAILED;
868 	}
869 
870 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
871 	rp->current_settings = sys_cpu_to_le32(current_settings);
872 
873 	*rsp_len = sizeof(*rp);
874 	return BTP_STATUS_SUCCESS;
875 }
876 
stop_advertising(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)877 static uint8_t stop_advertising(const void *cmd, uint16_t cmd_len,
878 				void *rsp, uint16_t *rsp_len)
879 {
880 	struct btp_gap_stop_advertising_rp *rp = rsp;
881 	int err;
882 
883 	err = bt_le_adv_stop();
884 	if (err < 0) {
885 		tester_rsp(BTP_SERVICE_ID_GAP, BTP_GAP_STOP_ADVERTISING, BTP_STATUS_FAILED);
886 		LOG_ERR("Failed to stop advertising: %d", err);
887 		return BTP_STATUS_FAILED;
888 	}
889 
890 	atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING);
891 	rp->current_settings = sys_cpu_to_le32(current_settings);
892 
893 	*rsp_len = sizeof(*rp);
894 	return BTP_STATUS_SUCCESS;
895 }
896 
get_ad_flags(struct net_buf_simple * buf_ad)897 static uint8_t get_ad_flags(struct net_buf_simple *buf_ad)
898 {
899 	uint8_t len, i;
900 
901 	/* Parse advertisement to get flags */
902 	for (i = 0U; i < buf_ad->len; i += len - 1) {
903 		len = buf_ad->data[i++];
904 		if (!len) {
905 			break;
906 		}
907 
908 		/* Check if field length is correct */
909 		if (len > (buf_ad->len - i) || (buf_ad->len - i) < 1) {
910 			break;
911 		}
912 
913 		switch (buf_ad->data[i++]) {
914 		case BT_DATA_FLAGS:
915 			return buf_ad->data[i];
916 		default:
917 			break;
918 		}
919 	}
920 
921 	return 0;
922 }
923 
924 static uint8_t discovery_flags;
925 static struct net_buf_simple *adv_buf = NET_BUF_SIMPLE(ADV_BUF_LEN);
926 
store_adv(const bt_addr_le_t * addr,int8_t rssi,struct net_buf_simple * buf_ad)927 static void store_adv(const bt_addr_le_t *addr, int8_t rssi,
928 		      struct net_buf_simple *buf_ad)
929 {
930 	struct btp_gap_device_found_ev *ev;
931 
932 	/* cleanup */
933 	net_buf_simple_init(adv_buf, 0);
934 
935 	ev = net_buf_simple_add(adv_buf, sizeof(*ev));
936 
937 	bt_addr_le_copy(&ev->address, addr);
938 	ev->rssi = rssi;
939 	ev->flags = BTP_GAP_DEVICE_FOUND_FLAG_AD | BTP_GAP_DEVICE_FOUND_FLAG_RSSI;
940 	ev->eir_data_len = buf_ad->len;
941 	memcpy(net_buf_simple_add(adv_buf, buf_ad->len), buf_ad->data, buf_ad->len);
942 }
943 
device_found(const bt_addr_le_t * addr,int8_t rssi,uint8_t evtype,struct net_buf_simple * buf_ad)944 static void device_found(const bt_addr_le_t *addr, int8_t rssi, uint8_t evtype,
945 			 struct net_buf_simple *buf_ad)
946 {
947 	/* if General/Limited Discovery - parse Advertising data to get flags */
948 	if (!(discovery_flags & BTP_GAP_DISCOVERY_FLAG_LE_OBSERVE) &&
949 	    (evtype != BT_GAP_ADV_TYPE_SCAN_RSP)) {
950 		uint8_t flags = get_ad_flags(buf_ad);
951 
952 		/* ignore non-discoverable devices */
953 		if (!(flags & BT_LE_AD_DISCOV_MASK)) {
954 			LOG_DBG("Non discoverable, skipping");
955 			return;
956 		}
957 
958 		/* if Limited Discovery - ignore general discoverable devices */
959 		if ((discovery_flags & BTP_GAP_DISCOVERY_FLAG_LIMITED) &&
960 		    !(flags & BT_LE_AD_LIMITED)) {
961 			LOG_DBG("General discoverable, skipping");
962 			return;
963 		}
964 	}
965 
966 	/* attach Scan Response data */
967 	if (evtype == BT_GAP_ADV_TYPE_SCAN_RSP) {
968 		struct btp_gap_device_found_ev *ev;
969 		bt_addr_le_t a;
970 
971 		/* skip if there is no pending advertisement */
972 		if (!adv_buf->len) {
973 			LOG_INF("No pending advertisement, skipping");
974 			return;
975 		}
976 
977 		ev = (void *) adv_buf->data;
978 
979 		bt_addr_le_copy(&a, &ev->address);
980 
981 		/*
982 		 * in general, the Scan Response comes right after the
983 		 * Advertisement, but if not if send stored event and ignore
984 		 * this one
985 		 */
986 		if (!bt_addr_le_eq(addr, &a)) {
987 			LOG_INF("Address does not match, skipping");
988 			goto done;
989 		}
990 
991 		ev->eir_data_len += buf_ad->len;
992 		ev->flags |= BTP_GAP_DEVICE_FOUND_FLAG_SD;
993 
994 		memcpy(net_buf_simple_add(adv_buf, buf_ad->len), buf_ad->data, buf_ad->len);
995 
996 		goto done;
997 	}
998 
999 	/*
1000 	 * if there is another pending advertisement, send it and store the
1001 	 * current one
1002 	 */
1003 	if (adv_buf->len) {
1004 		tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_FOUND,
1005 			    adv_buf->data, adv_buf->len);
1006 		net_buf_simple_reset(adv_buf);
1007 	}
1008 
1009 	store_adv(addr, rssi, buf_ad);
1010 
1011 	/* if Active Scan and scannable event - wait for Scan Response */
1012 	if ((discovery_flags & BTP_GAP_DISCOVERY_FLAG_LE_ACTIVE_SCAN) &&
1013 	    (evtype == BT_GAP_ADV_TYPE_ADV_IND ||
1014 	     evtype == BT_GAP_ADV_TYPE_ADV_SCAN_IND)) {
1015 		LOG_DBG("Waiting for scan response");
1016 		return;
1017 	}
1018 done:
1019 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_FOUND,
1020 		    adv_buf->data, adv_buf->len);
1021 	net_buf_simple_reset(adv_buf);
1022 }
1023 
start_discovery(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1024 static uint8_t start_discovery(const void *cmd, uint16_t cmd_len,
1025 			       void *rsp, uint16_t *rsp_len)
1026 {
1027 	const struct btp_gap_start_discovery_cmd *cp = cmd;
1028 
1029 	/* only LE scan is supported */
1030 	if (cp->flags & BTP_GAP_DISCOVERY_FLAG_BREDR) {
1031 		LOG_WRN("BR/EDR not supported");
1032 		return BTP_STATUS_FAILED;
1033 	}
1034 
1035 	if (bt_le_scan_start(cp->flags & BTP_GAP_DISCOVERY_FLAG_LE_ACTIVE_SCAN ?
1036 			     BT_LE_SCAN_ACTIVE : BT_LE_SCAN_PASSIVE,
1037 			     device_found) < 0) {
1038 		LOG_ERR("Failed to start scanning");
1039 		return BTP_STATUS_FAILED;
1040 	}
1041 
1042 	net_buf_simple_init(adv_buf, 0);
1043 	discovery_flags = cp->flags;
1044 
1045 	return BTP_STATUS_SUCCESS;
1046 }
1047 
stop_discovery(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1048 static uint8_t stop_discovery(const void *cmd, uint16_t cmd_len,
1049 			      void *rsp, uint16_t *rsp_len)
1050 {
1051 	int err;
1052 
1053 	err = bt_le_scan_stop();
1054 	if (err < 0) {
1055 		LOG_ERR("Failed to stop scanning: %d", err);
1056 		return BTP_STATUS_FAILED;
1057 	}
1058 
1059 	return BTP_STATUS_SUCCESS;
1060 }
1061 
connect(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1062 static uint8_t connect(const void *cmd, uint16_t cmd_len,
1063 		       void *rsp, uint16_t *rsp_len)
1064 {
1065 	struct bt_le_conn_param conn_param;
1066 
1067 	if (IS_ENABLED(CONFIG_BT_BAP_UNICAST) || IS_ENABLED(CONFIG_BT_BAP_BROADCAST_ASSISTANT)) {
1068 		conn_param = *BT_BAP_CONN_PARAM_RELAXED;
1069 	} else {
1070 		conn_param = *BT_LE_CONN_PARAM_DEFAULT;
1071 	}
1072 
1073 	const struct btp_gap_connect_cmd *cp = cmd;
1074 	int err;
1075 
1076 	if (!bt_addr_le_eq(&cp->address, BT_ADDR_LE_ANY)) {
1077 		struct bt_conn *conn = NULL;
1078 
1079 		err = bt_conn_le_create(&cp->address, BT_CONN_LE_CREATE_CONN, &conn_param, &conn);
1080 		if (err) {
1081 			LOG_ERR("Failed to create connection (%d)", err);
1082 			return BTP_STATUS_FAILED;
1083 		}
1084 
1085 		bt_conn_unref(conn);
1086 	} else {
1087 		err = bt_conn_le_create_auto(BT_CONN_LE_CREATE_CONN, &conn_param);
1088 		if (err) {
1089 			LOG_ERR("Failed to create auto connection (%d)", err);
1090 			return BTP_STATUS_FAILED;
1091 		}
1092 	}
1093 
1094 	return BTP_STATUS_SUCCESS;
1095 }
1096 
disconnect(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1097 static uint8_t disconnect(const void *cmd, uint16_t cmd_len,
1098 			  void *rsp, uint16_t *rsp_len)
1099 {
1100 	const struct btp_gap_disconnect_cmd *cp = cmd;
1101 	struct bt_conn *conn;
1102 	uint8_t status;
1103 
1104 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1105 	if (!conn) {
1106 		LOG_ERR("Unknown connection");
1107 		return BTP_STATUS_FAILED;
1108 	}
1109 
1110 	if (bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN)) {
1111 		LOG_ERR("Failed to disconnect");
1112 		status = BTP_STATUS_FAILED;
1113 	} else {
1114 		status = BTP_STATUS_SUCCESS;
1115 	}
1116 
1117 	bt_conn_unref(conn);
1118 
1119 	return status;
1120 }
1121 
auth_passkey_display(struct bt_conn * conn,unsigned int passkey)1122 static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
1123 {
1124 	struct btp_gap_passkey_display_ev ev;
1125 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
1126 
1127 	bt_addr_le_copy(&ev.address, addr);
1128 	ev.passkey = sys_cpu_to_le32(passkey);
1129 
1130 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_DISPLAY, &ev, sizeof(ev));
1131 }
1132 
auth_passkey_entry(struct bt_conn * conn)1133 static void auth_passkey_entry(struct bt_conn *conn)
1134 {
1135 	struct btp_gap_passkey_entry_req_ev ev;
1136 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
1137 
1138 	bt_addr_le_copy(&ev.address, addr);
1139 
1140 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_ENTRY_REQ, &ev, sizeof(ev));
1141 }
1142 
auth_passkey_confirm(struct bt_conn * conn,unsigned int passkey)1143 static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey)
1144 {
1145 	struct btp_gap_passkey_confirm_req_ev ev;
1146 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
1147 
1148 	bt_addr_le_copy(&ev.address, addr);
1149 	ev.passkey = sys_cpu_to_le32(passkey);
1150 
1151 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_CONFIRM_REQ, &ev, sizeof(ev));
1152 }
1153 
auth_cancel(struct bt_conn * conn)1154 static void auth_cancel(struct bt_conn *conn)
1155 {
1156 	/* TODO */
1157 }
1158 
auth_pairing_accept(struct bt_conn * conn,const struct bt_conn_pairing_feat * const feat)1159 enum bt_security_err auth_pairing_accept(struct bt_conn *conn,
1160 					 const struct bt_conn_pairing_feat *const feat)
1161 {
1162 	struct btp_gap_bond_lost_ev ev;
1163 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
1164 
1165 	if (!bt_le_bond_exists(BT_ID_DEFAULT, addr)) {
1166 		return BT_SECURITY_ERR_SUCCESS;
1167 	}
1168 
1169 	/* If a peer is already bonded and tries to pair again then it means that
1170 	 * the it has lost its bond information.
1171 	 */
1172 	LOG_DBG("Bond lost");
1173 
1174 	bt_addr_le_copy(&ev.address, addr);
1175 
1176 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_BOND_LOST, &ev, sizeof(ev));
1177 
1178 	return BT_SECURITY_ERR_SUCCESS;
1179 }
1180 
auth_pairing_failed(struct bt_conn * conn,enum bt_security_err reason)1181 void auth_pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
1182 {
1183 	struct btp_gap_bond_pairing_failed_ev ev;
1184 	const bt_addr_le_t *addr = bt_conn_get_dst(conn);
1185 
1186 	bt_addr_le_copy(&ev.address, addr);
1187 	ev.reason = reason;
1188 
1189 	tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PAIRING_FAILED, &ev, sizeof(ev));
1190 }
1191 
auth_pairing_complete(struct bt_conn * conn,bool bonded)1192 static void auth_pairing_complete(struct bt_conn *conn, bool bonded)
1193 {
1194 	if (IS_ENABLED(CONFIG_BT_PRIVACY) && bonded) {
1195 		/* Read peer's Central Address Resolution if bonded */
1196 		bt_gatt_read(conn, &read_car_params);
1197 	}
1198 }
1199 
1200 static struct bt_conn_auth_info_cb auth_info_cb = {
1201 	.pairing_failed = auth_pairing_failed,
1202 	.pairing_complete = auth_pairing_complete,
1203 };
1204 
set_io_cap(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1205 static uint8_t set_io_cap(const void *cmd, uint16_t cmd_len,
1206 			  void *rsp, uint16_t *rsp_len)
1207 {
1208 	const struct btp_gap_set_io_cap_cmd *cp = cmd;
1209 
1210 	/* Reset io cap requirements */
1211 	(void)memset(&cb, 0, sizeof(cb));
1212 	bt_conn_auth_cb_register(NULL);
1213 
1214 	LOG_DBG("io_cap: %d", cp->io_cap);
1215 
1216 	switch (cp->io_cap) {
1217 	case BTP_GAP_IO_CAP_DISPLAY_ONLY:
1218 		cb.cancel = auth_cancel;
1219 		cb.passkey_display = auth_passkey_display;
1220 		break;
1221 	case BTP_GAP_IO_CAP_KEYBOARD_DISPLAY:
1222 		cb.cancel = auth_cancel;
1223 		cb.passkey_display = auth_passkey_display;
1224 		cb.passkey_entry = auth_passkey_entry;
1225 		cb.passkey_confirm = auth_passkey_confirm;
1226 		break;
1227 	case BTP_GAP_IO_CAP_NO_INPUT_OUTPUT:
1228 		cb.cancel = auth_cancel;
1229 		break;
1230 	case BTP_GAP_IO_CAP_KEYBOARD_ONLY:
1231 		cb.cancel = auth_cancel;
1232 		cb.passkey_entry = auth_passkey_entry;
1233 		break;
1234 	case BTP_GAP_IO_CAP_DISPLAY_YESNO:
1235 		cb.cancel = auth_cancel;
1236 		cb.passkey_display = auth_passkey_display;
1237 		cb.passkey_confirm = auth_passkey_confirm;
1238 		break;
1239 	default:
1240 		LOG_WRN("Unhandled io_cap: 0x%x", cp->io_cap);
1241 		return BTP_STATUS_FAILED;
1242 	}
1243 
1244 	cb.pairing_accept = auth_pairing_accept;
1245 
1246 	if (bt_conn_auth_cb_register(&cb)) {
1247 		return BTP_STATUS_FAILED;
1248 	}
1249 
1250 	return BTP_STATUS_SUCCESS;
1251 }
1252 
pair(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1253 static uint8_t pair(const void *cmd, uint16_t cmd_len,
1254 		    void *rsp, uint16_t *rsp_len)
1255 {
1256 	const struct btp_gap_pair_cmd *cp = cmd;
1257 	struct bt_conn *conn;
1258 	int err;
1259 
1260 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1261 	if (!conn) {
1262 		LOG_ERR("Unknown connection");
1263 		return BTP_STATUS_FAILED;
1264 	}
1265 
1266 	err = bt_conn_set_security(conn, BT_SECURITY_L2);
1267 	if (err < 0) {
1268 		LOG_ERR("Failed to set security: %d", err);
1269 		bt_conn_unref(conn);
1270 		return BTP_STATUS_FAILED;
1271 	}
1272 
1273 	bt_conn_unref(conn);
1274 	return BTP_STATUS_SUCCESS;
1275 }
1276 
unpair(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1277 static uint8_t unpair(const void *cmd, uint16_t cmd_len,
1278 		      void *rsp, uint16_t *rsp_len)
1279 {
1280 	const struct btp_gap_unpair_cmd *cp = cmd;
1281 	struct bt_conn *conn;
1282 	int err;
1283 
1284 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1285 	if (!conn) {
1286 		LOG_INF("Unknown connection");
1287 		goto keys;
1288 	}
1289 
1290 	err = bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
1291 
1292 	bt_conn_unref(conn);
1293 
1294 	if (err < 0) {
1295 		LOG_ERR("Failed to disconnect: %d", err);
1296 		return BTP_STATUS_FAILED;
1297 	}
1298 keys:
1299 	err = bt_unpair(BT_ID_DEFAULT, &cp->address);
1300 	if (err < 0) {
1301 		return BTP_STATUS_FAILED;
1302 	}
1303 
1304 	return BTP_STATUS_SUCCESS;
1305 }
1306 
passkey_entry(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1307 static uint8_t passkey_entry(const void *cmd, uint16_t cmd_len,
1308 			     void *rsp, uint16_t *rsp_len)
1309 {
1310 	const struct btp_gap_passkey_entry_cmd *cp = cmd;
1311 	struct bt_conn *conn;
1312 	int err;
1313 
1314 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1315 	if (!conn) {
1316 		LOG_ERR("Unknown connection");
1317 		return BTP_STATUS_FAILED;
1318 	}
1319 
1320 	err = bt_conn_auth_passkey_entry(conn, sys_le32_to_cpu(cp->passkey));
1321 	bt_conn_unref(conn);
1322 
1323 	if (err < 0) {
1324 		LOG_ERR("Failed to enter passkey: %d", err);
1325 		return BTP_STATUS_FAILED;
1326 	}
1327 
1328 	return BTP_STATUS_SUCCESS;
1329 }
1330 
passkey_confirm(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1331 static uint8_t passkey_confirm(const void *cmd, uint16_t cmd_len,
1332 			       void *rsp, uint16_t *rsp_len)
1333 {
1334 	const struct btp_gap_passkey_confirm_cmd *cp = cmd;
1335 	struct bt_conn *conn;
1336 	int err;
1337 
1338 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1339 	if (!conn) {
1340 		LOG_ERR("Unknown connection");
1341 		return BTP_STATUS_FAILED;
1342 	}
1343 
1344 	if (cp->match) {
1345 		err = bt_conn_auth_passkey_confirm(conn);
1346 		if (err < 0) {
1347 			LOG_ERR("Failed to confirm passkey: %d", err);
1348 		}
1349 	} else {
1350 		err = bt_conn_auth_cancel(conn);
1351 		if (err < 0) {
1352 			LOG_ERR("Failed to cancel auth: %d", err);
1353 		}
1354 	}
1355 
1356 	bt_conn_unref(conn);
1357 
1358 	if (err < 0) {
1359 		return BTP_STATUS_FAILED;
1360 	}
1361 
1362 	return BTP_STATUS_SUCCESS;
1363 }
1364 
conn_param_update(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1365 static uint8_t conn_param_update(const void *cmd, uint16_t cmd_len,
1366 				 void *rsp, uint16_t *rsp_len)
1367 {
1368 	const struct btp_gap_conn_param_update_cmd *cp = cmd;
1369 	struct bt_le_conn_param param = {
1370 		.interval_min = sys_le16_to_cpu(cp->interval_min),
1371 		.interval_max = sys_le16_to_cpu(cp->interval_max),
1372 		.latency = sys_le16_to_cpu(cp->latency),
1373 		.timeout = sys_le16_to_cpu(cp->timeout),
1374 	};
1375 	struct bt_conn *conn;
1376 	int err;
1377 
1378 	conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, &cp->address);
1379 	if (!conn) {
1380 		LOG_ERR("Unknown connection");
1381 		return BTP_STATUS_FAILED;
1382 	}
1383 
1384 	err = bt_conn_le_param_update(conn, &param);
1385 	bt_conn_unref(conn);
1386 
1387 	if (err < 0) {
1388 		LOG_ERR("Failed to update params: %d", err);
1389 		return BTP_STATUS_FAILED;
1390 	}
1391 	return BTP_STATUS_SUCCESS;
1392 }
1393 
set_mitm(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1394 static uint8_t set_mitm(const void *cmd, uint16_t cmd_len,
1395 			void *rsp, uint16_t *rsp_len)
1396 {
1397 	/* TODO verify if can be done in runtime */
1398 	LOG_WRN("Use CONFIG_BT_SMP_ENFORCE_MITM instead");
1399 
1400 	return BTP_STATUS_SUCCESS;
1401 }
1402 
set_oob_legacy_data(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1403 static uint8_t set_oob_legacy_data(const void *cmd, uint16_t cmd_len,
1404 				   void *rsp, uint16_t *rsp_len)
1405 {
1406 	const struct btp_gap_oob_legacy_set_data_cmd *cp = cmd;
1407 
1408 	memcpy(oob_legacy_tk, cp->oob_data, 16);
1409 
1410 	bt_le_oob_set_legacy_flag(true);
1411 	cb.oob_data_request = oob_data_request;
1412 
1413 	return BTP_STATUS_SUCCESS;
1414 }
1415 
set_filter_list(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1416 static uint8_t set_filter_list(const void *cmd, uint16_t cmd_len,
1417 			       void *rsp, uint16_t *rsp_len)
1418 {
1419 	const struct btp_gap_set_filter_list *cp = cmd;
1420 	int err;
1421 
1422 	if ((cmd_len < sizeof(*cp)) ||
1423 	    (cmd_len != sizeof(*cp) + (cp->cnt * sizeof(cp->addr[0])))) {
1424 		return BTP_STATUS_FAILED;
1425 	}
1426 
1427 	(void)bt_le_filter_accept_list_clear();
1428 
1429 	for (int i = 0; i < cp->cnt; i++) {
1430 		err = bt_le_filter_accept_list_add(&cp->addr[i]);
1431 		if (err < 0) {
1432 			return BTP_STATUS_FAILED;
1433 		}
1434 	}
1435 
1436 	filter_list_in_use = cp->cnt != 0;
1437 
1438 	return BTP_STATUS_SUCCESS;
1439 }
1440 
1441 #if defined(CONFIG_BT_EXT_ADV)
set_extended_advertising(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1442 static uint8_t set_extended_advertising(const void *cmd, uint16_t cmd_len, void *rsp,
1443 					uint16_t *rsp_len)
1444 {
1445 	const struct btp_gap_set_extended_advertising_cmd *cp = cmd;
1446 	struct btp_gap_set_extended_advertising_rp *rp = rsp;
1447 
1448 	LOG_DBG("ext adv settings: %u", cp->settings);
1449 
1450 	if (cp->settings != 0) {
1451 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
1452 	} else {
1453 		atomic_clear_bit(&current_settings, BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
1454 	}
1455 
1456 	rp->current_settings = sys_cpu_to_le32(current_settings);
1457 
1458 	*rsp_len = sizeof(*rp);
1459 	return BTP_STATUS_SUCCESS;
1460 }
1461 #endif /* defined(CONFIG_BT_EXT_ADV) */
1462 
1463 static struct bt_le_per_adv_sync *pa_sync;
1464 
tester_gap_padv_get(void)1465 struct bt_le_per_adv_sync *tester_gap_padv_get(void)
1466 {
1467 	if (!IS_ENABLED(CONFIG_BT_PER_ADV)) {
1468 		return NULL;
1469 	}
1470 
1471 	return pa_sync;
1472 }
1473 
pa_sync_synced_cb(struct bt_le_per_adv_sync * sync,struct bt_le_per_adv_sync_synced_info * info)1474 static void pa_sync_synced_cb(struct bt_le_per_adv_sync *sync,
1475 			      struct bt_le_per_adv_sync_synced_info *info)
1476 {
1477 	LOG_DBG("");
1478 
1479 	if (sync == pa_sync) {
1480 		struct btp_gap_ev_periodic_sync_established_ev ev;
1481 
1482 		bt_addr_le_copy(&ev.address, info->addr);
1483 		ev.sync_handle = sys_cpu_to_le16(sync->handle);
1484 		ev.status = 0;
1485 
1486 		tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PERIODIC_SYNC_ESTABLISHED,
1487 			     &ev, sizeof(ev));
1488 	}
1489 }
1490 
pa_sync_terminated_cb(struct bt_le_per_adv_sync * sync,const struct bt_le_per_adv_sync_term_info * info)1491 static void pa_sync_terminated_cb(struct bt_le_per_adv_sync *sync,
1492 				  const struct bt_le_per_adv_sync_term_info *info)
1493 {
1494 	LOG_DBG("");
1495 
1496 	if (sync == pa_sync) {
1497 		struct btp_gap_ev_periodic_sync_lost_ev ev;
1498 
1499 		LOG_DBG("PA sync lost with reason %u", info->reason);
1500 		pa_sync = NULL;
1501 
1502 		ev.sync_handle = sys_cpu_to_le16(sync->handle);
1503 		ev.reason = info->reason;
1504 
1505 		tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PERIODIC_SYNC_LOST,
1506 			     &ev, sizeof(ev));
1507 	}
1508 }
1509 
1510 static struct bt_le_per_adv_sync_cb pa_sync_cb = {
1511 	.synced = pa_sync_synced_cb,
1512 	.term = pa_sync_terminated_cb,
1513 };
1514 
1515 #if defined(CONFIG_BT_PER_ADV)
1516 static struct bt_data padv[10];
1517 
tester_gap_padv_configure(struct bt_le_ext_adv * ext_adv,const struct bt_le_per_adv_param * param)1518 int tester_gap_padv_configure(struct bt_le_ext_adv *ext_adv,
1519 			      const struct bt_le_per_adv_param *param)
1520 {
1521 	int err;
1522 	struct bt_le_adv_param ext_adv_param =
1523 		BT_LE_ADV_PARAM_INIT(0, param->interval_min, param->interval_max, NULL);
1524 
1525 	if (ext_adv == NULL) {
1526 		current_settings = BIT(BTP_GAP_SETTINGS_DISCOVERABLE) |
1527 				   BIT(BTP_GAP_SETTINGS_EXTENDED_ADVERTISING);
1528 		err = tester_gap_create_adv_instance(&ext_adv_param,
1529 						     BTP_GAP_ADDR_TYPE_IDENTITY, ad, 1, NULL, 0,
1530 						     NULL, &ext_adv);
1531 		if (err != 0) {
1532 			return -EINVAL;
1533 		}
1534 	}
1535 
1536 	/* Set periodic advertising parameters and the required
1537 	 * bit in AD Flags of extended advertising.
1538 	 */
1539 	err = bt_le_per_adv_set_param(ext_adv, param);
1540 	if (err != 0) {
1541 		LOG_DBG("Failed to set periodic advertising parameters (err %d)\n", err);
1542 	}
1543 
1544 	return err;
1545 }
1546 
padv_configure(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1547 static uint8_t padv_configure(const void *cmd, uint16_t cmd_len,
1548 			      void *rsp, uint16_t *rsp_len)
1549 {
1550 	int err;
1551 	uint32_t options = BT_LE_PER_ADV_OPT_NONE;
1552 	const struct btp_gap_padv_configure_cmd *cp = cmd;
1553 	struct btp_gap_padv_configure_rp *rp = rsp;
1554 
1555 	if (cp->flags & BTP_GAP_PADV_INCLUDE_TX_POWER) {
1556 		options |= BT_LE_PER_ADV_OPT_USE_TX_POWER;
1557 	}
1558 
1559 	struct bt_le_ext_adv *ext_adv = tester_gap_ext_adv_get(0);
1560 
1561 	err = tester_gap_padv_configure(ext_adv,
1562 					BT_LE_PER_ADV_PARAM(sys_le16_to_cpu(cp->interval_min),
1563 					sys_le16_to_cpu(cp->interval_max), options));
1564 	if (err) {
1565 		return BTP_STATUS_FAILED;
1566 	}
1567 
1568 	rp->current_settings = sys_cpu_to_le32(current_settings);
1569 
1570 	*rsp_len = sizeof(*rp);
1571 
1572 	return BTP_STATUS_SUCCESS;
1573 }
1574 
tester_gap_padv_start(struct bt_le_ext_adv * ext_adv)1575 int tester_gap_padv_start(struct bt_le_ext_adv *ext_adv)
1576 {
1577 	int err;
1578 
1579 	if (ext_adv == NULL) {
1580 		return -EINVAL;
1581 	}
1582 
1583 	if (!atomic_test_bit(&current_settings, BTP_GAP_SETTINGS_ADVERTISING)) {
1584 		err = tester_gap_start_ext_adv(ext_adv);
1585 		if (err != 0) {
1586 			return -EINVAL;
1587 		}
1588 	}
1589 
1590 	/* Enable Periodic Advertising */
1591 	err = bt_le_per_adv_start(ext_adv);
1592 	if (err != 0) {
1593 		LOG_DBG("Failed to start periodic advertising data: %d", err);
1594 	}
1595 
1596 	return err;
1597 }
1598 
padv_start(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1599 static uint8_t padv_start(const void *cmd, uint16_t cmd_len,
1600 			  void *rsp, uint16_t *rsp_len)
1601 {
1602 	int err;
1603 	struct btp_gap_padv_start_rp *rp = rsp;
1604 
1605 	struct bt_le_ext_adv *ext_adv = tester_gap_ext_adv_get(0);
1606 
1607 	err = tester_gap_padv_start(ext_adv);
1608 
1609 	if (err) {
1610 		return BTP_STATUS_FAILED;
1611 	}
1612 
1613 	rp->current_settings = sys_cpu_to_le32(current_settings);
1614 
1615 	*rsp_len = sizeof(*rp);
1616 
1617 	return BTP_STATUS_SUCCESS;
1618 }
1619 
tester_gap_padv_stop(struct bt_le_ext_adv * ext_adv)1620 int tester_gap_padv_stop(struct bt_le_ext_adv *ext_adv)
1621 {
1622 	int err;
1623 
1624 	if (ext_adv == NULL) {
1625 		/* Ext adv not yet created */
1626 		return -ESRCH;
1627 	}
1628 
1629 	/* Enable Periodic Advertising */
1630 	err = bt_le_per_adv_stop(ext_adv);
1631 	if (err != 0) {
1632 		LOG_DBG("Failed to stop periodic advertising data: %d", err);
1633 	}
1634 
1635 	return err;
1636 }
1637 
padv_stop(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1638 static uint8_t padv_stop(const void *cmd, uint16_t cmd_len,
1639 			 void *rsp, uint16_t *rsp_len)
1640 {
1641 	int err;
1642 	struct btp_gap_padv_stop_rp *rp = rsp;
1643 	struct bt_le_ext_adv *ext_adv = tester_gap_ext_adv_get(0);
1644 
1645 	err = tester_gap_padv_stop(ext_adv);
1646 
1647 	if (err) {
1648 		return BTP_STATUS_FAILED;
1649 	}
1650 
1651 	rp->current_settings = sys_cpu_to_le32(current_settings);
1652 
1653 	*rsp_len = sizeof(*rp);
1654 
1655 	return BTP_STATUS_SUCCESS;
1656 }
1657 
tester_gap_padv_set_data(struct bt_le_ext_adv * ext_adv,struct bt_data * per_ad,uint8_t ad_len)1658 int tester_gap_padv_set_data(struct bt_le_ext_adv *ext_adv, struct bt_data *per_ad, uint8_t ad_len)
1659 {
1660 	int err;
1661 
1662 	if (ext_adv == NULL) {
1663 		return -EINVAL;
1664 	}
1665 
1666 	/* Set Periodic Advertising data */
1667 	err = bt_le_per_adv_set_data(ext_adv, per_ad, ad_len);
1668 	if (err != 0) {
1669 		LOG_DBG("Failed to set periodic advertising data: %d", err);
1670 	}
1671 
1672 	return err;
1673 }
1674 
padv_set_data(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1675 static uint8_t padv_set_data(const void *cmd, uint16_t cmd_len,
1676 			     void *rsp, uint16_t *rsp_len)
1677 {
1678 	int err;
1679 	const struct btp_gap_padv_set_data_cmd *cp = cmd;
1680 
1681 	uint8_t padv_len = 0U;
1682 
1683 	for (uint8_t i = 0; i < cp->data_len; padv_len++) {
1684 		if (padv_len >= ARRAY_SIZE(padv)) {
1685 			LOG_ERR("padv[] Out of memory");
1686 			return BTP_STATUS_FAILED;
1687 		}
1688 
1689 		padv[padv_len].data_len = cp->data[i++] - 1;
1690 		padv[padv_len].type = cp->data[i++];
1691 		padv[padv_len].data = &cp->data[i];
1692 		i += padv[padv_len].data_len;
1693 	}
1694 
1695 	struct bt_le_ext_adv *ext_adv = tester_gap_ext_adv_get(0);
1696 
1697 	err = tester_gap_padv_set_data(ext_adv, padv, padv_len);
1698 
1699 	return BTP_STATUS_VAL(err);
1700 }
1701 #endif /* defined(CONFIG_BT_PER_ADV) */
1702 
tester_gap_padv_create_sync(struct bt_le_per_adv_sync_param * create_params)1703 int tester_gap_padv_create_sync(struct bt_le_per_adv_sync_param *create_params)
1704 {
1705 	if (!IS_ENABLED(CONFIG_BT_PER_ADV_SYNC)) {
1706 		return -ENOTSUP;
1707 	}
1708 
1709 	int err;
1710 
1711 	if (pa_sync != NULL) {
1712 		return -EBUSY;
1713 	}
1714 
1715 	err = bt_le_per_adv_sync_create(create_params, &pa_sync);
1716 
1717 	if (err != 0) {
1718 		LOG_DBG("Unable to sync to PA: %d", err);
1719 	}
1720 
1721 	return err;
1722 }
1723 
tester_gap_padv_stop_sync(void)1724 int tester_gap_padv_stop_sync(void)
1725 {
1726 	if (!IS_ENABLED(CONFIG_BT_PER_ADV_SYNC)) {
1727 		return -ENOTSUP;
1728 	}
1729 
1730 	int err;
1731 
1732 	if (pa_sync == NULL) {
1733 		return -EALREADY;
1734 	}
1735 
1736 	err = bt_le_per_adv_sync_delete(pa_sync);
1737 	if (err != 0) {
1738 		LOG_DBG("Unable to stop sync to PA: %d", err);
1739 	}
1740 
1741 	return err;
1742 }
1743 
1744 #if defined(CONFIG_BT_PER_ADV)
padv_create_sync(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)1745 static uint8_t padv_create_sync(const void *cmd, uint16_t cmd_len,
1746 				void *rsp, uint16_t *rsp_len)
1747 {
1748 	int err;
1749 	const struct btp_gap_padv_create_sync_cmd *cp = cmd;
1750 	struct bt_le_per_adv_sync_param create_params = {0};
1751 
1752 	bt_addr_le_copy(&create_params.addr, &cp->address);
1753 	create_params.options = BT_LE_PER_ADV_SYNC_OPT_NONE;
1754 	create_params.sid = cp->advertiser_sid;
1755 	create_params.skip = sys_le16_to_cpu(cp->skip);
1756 	create_params.timeout = sys_le16_to_cpu(cp->sync_timeout);
1757 
1758 	if (cp->flags & BTP_GAP_PADV_CREATE_SYNC_FLAG_REPORTS_DISABLED) {
1759 		create_params.options |= BT_LE_PER_ADV_SYNC_OPT_REPORTING_INITIALLY_DISABLED;
1760 	}
1761 
1762 	if (cp->flags & BTP_GAP_PADV_CREATE_SYNC_FLAG_FILTER_DUPLICATES) {
1763 		create_params.options |= BT_LE_PER_ADV_SYNC_OPT_FILTER_DUPLICATE;
1764 	}
1765 
1766 	err = tester_gap_padv_create_sync(&create_params);
1767 
1768 	return BTP_STATUS_VAL(err);
1769 }
1770 #endif /* defined(CONFIG_BT_PER_ADV) */
1771 
1772 static const struct btp_handler handlers[] = {
1773 	{
1774 		.opcode = BTP_GAP_READ_SUPPORTED_COMMANDS,
1775 		.index = BTP_INDEX_NONE,
1776 		.expect_len = 0,
1777 		.func = supported_commands,
1778 	},
1779 	{
1780 		.opcode = BTP_GAP_READ_CONTROLLER_INDEX_LIST,
1781 		.index = BTP_INDEX_NONE,
1782 		.expect_len = 0,
1783 		.func = controller_index_list,
1784 	},
1785 	{
1786 		.opcode = BTP_GAP_READ_CONTROLLER_INFO,
1787 		.expect_len = 0,
1788 		.func = controller_info,
1789 	},
1790 	{
1791 		.opcode = BTP_GAP_SET_POWERED,
1792 		.expect_len = sizeof(struct btp_gap_set_powered_cmd),
1793 		.func = set_powered,
1794 	},
1795 	{
1796 		.opcode = BTP_GAP_SET_CONNECTABLE,
1797 		.expect_len = sizeof(struct btp_gap_set_connectable_cmd),
1798 		.func = set_connectable,
1799 	},
1800 	{
1801 		.opcode = BTP_GAP_SET_DISCOVERABLE,
1802 		.expect_len = sizeof(struct btp_gap_set_discoverable_cmd),
1803 		.func = set_discoverable,
1804 	},
1805 	{
1806 		.opcode = BTP_GAP_SET_BONDABLE,
1807 		.expect_len = sizeof(struct btp_gap_set_bondable_cmd),
1808 		.func = set_bondable,
1809 	},
1810 	{
1811 		.opcode = BTP_GAP_START_ADVERTISING,
1812 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
1813 		.func = start_advertising,
1814 	},
1815 	{
1816 		.opcode = BTP_GAP_START_DIRECTED_ADV,
1817 		.expect_len = sizeof(struct btp_gap_start_directed_adv_cmd),
1818 		.func = start_directed_advertising,
1819 	},
1820 	{
1821 		.opcode = BTP_GAP_STOP_ADVERTISING,
1822 		.expect_len = 0,
1823 		.func = stop_advertising,
1824 	},
1825 	{
1826 		.opcode = BTP_GAP_START_DISCOVERY,
1827 		.expect_len = sizeof(struct btp_gap_start_discovery_cmd),
1828 		.func = start_discovery,
1829 	},
1830 	{
1831 		.opcode = BTP_GAP_STOP_DISCOVERY,
1832 		.expect_len = 0,
1833 		.func = stop_discovery,
1834 	},
1835 	{
1836 		.opcode = BTP_GAP_CONNECT,
1837 		.expect_len = sizeof(struct btp_gap_connect_cmd),
1838 		.func = connect,
1839 	},
1840 	{
1841 		.opcode = BTP_GAP_DISCONNECT,
1842 		.expect_len = sizeof(struct btp_gap_disconnect_cmd),
1843 		.func = disconnect,
1844 	},
1845 	{
1846 		.opcode = BTP_GAP_SET_IO_CAP,
1847 		.expect_len = sizeof(struct btp_gap_set_io_cap_cmd),
1848 		.func = set_io_cap,
1849 	},
1850 	{
1851 		.opcode = BTP_GAP_PAIR,
1852 		.expect_len = sizeof(struct btp_gap_pair_cmd),
1853 		.func = pair,
1854 	},
1855 	{
1856 		.opcode = BTP_GAP_UNPAIR,
1857 		.expect_len = sizeof(struct btp_gap_unpair_cmd),
1858 		.func = unpair,
1859 	},
1860 	{
1861 		.opcode = BTP_GAP_PASSKEY_ENTRY,
1862 		.expect_len = sizeof(struct btp_gap_passkey_entry_cmd),
1863 		.func = passkey_entry,
1864 	},
1865 	{
1866 		.opcode = BTP_GAP_PASSKEY_CONFIRM,
1867 		.expect_len = sizeof(struct btp_gap_passkey_confirm_cmd),
1868 		.func = passkey_confirm,
1869 	},
1870 	{
1871 		.opcode = BTP_GAP_CONN_PARAM_UPDATE,
1872 		.expect_len = sizeof(struct btp_gap_conn_param_update_cmd),
1873 		.func = conn_param_update,
1874 	},
1875 	{
1876 		.opcode = BTP_GAP_SET_MITM,
1877 		.expect_len = sizeof(struct btp_gap_set_mitm),
1878 		.func = set_mitm,
1879 	},
1880 	{
1881 		.opcode = BTP_GAP_OOB_LEGACY_SET_DATA,
1882 		.expect_len = sizeof(struct btp_gap_oob_legacy_set_data_cmd),
1883 		.func = set_oob_legacy_data,
1884 	},
1885 #if !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY)
1886 	{
1887 		.opcode = BTP_GAP_OOB_SC_GET_LOCAL_DATA,
1888 		.expect_len = 0,
1889 		.func = get_oob_sc_local_data,
1890 	},
1891 	{
1892 		.opcode = BTP_GAP_OOB_SC_SET_REMOTE_DATA,
1893 		.expect_len = sizeof(struct btp_gap_oob_sc_set_remote_data_cmd),
1894 		.func = set_oob_sc_remote_data,
1895 	},
1896 #endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
1897 	{
1898 		.opcode = BTP_GAP_SET_FILTER_LIST,
1899 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
1900 		.func = set_filter_list,
1901 	},
1902 #if defined(CONFIG_BT_EXT_ADV)
1903 	{
1904 		.opcode = BTP_GAP_SET_EXTENDED_ADVERTISING,
1905 		.expect_len = sizeof(struct btp_gap_set_extended_advertising_cmd),
1906 		.func = set_extended_advertising,
1907 	},
1908 #if defined(CONFIG_BT_PER_ADV)
1909 	{
1910 		.opcode = BTP_GAP_PADV_CONFIGURE,
1911 		.expect_len = sizeof(struct btp_gap_padv_configure_cmd),
1912 		.func = padv_configure,
1913 	},
1914 	{
1915 		.opcode = BTP_GAP_PADV_START,
1916 		.expect_len = sizeof(struct btp_gap_padv_start_cmd),
1917 		.func = padv_start,
1918 	},
1919 	{
1920 		.opcode = BTP_GAP_PADV_STOP,
1921 		.expect_len = sizeof(struct btp_gap_padv_stop_cmd),
1922 		.func = padv_stop,
1923 	},
1924 	{
1925 		.opcode = BTP_GAP_PADV_SET_DATA,
1926 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
1927 		.func = padv_set_data,
1928 	},
1929 	{
1930 		.opcode = BTP_GAP_PADV_CREATE_SYNC,
1931 		.expect_len = sizeof(struct btp_gap_padv_create_sync_cmd),
1932 		.func = padv_create_sync,
1933 	},
1934 #endif /* defined(CONFIG_BT_PER_ADV) */
1935 #endif /* defined(CONFIG_BT_EXT_ADV) */
1936 };
1937 
tester_init_gap(void)1938 uint8_t tester_init_gap(void)
1939 {
1940 	int err;
1941 
1942 	(void)memset(&cb, 0, sizeof(cb));
1943 	bt_conn_auth_cb_register(NULL);
1944 	cb.pairing_accept = auth_pairing_accept;
1945 	if (bt_conn_auth_cb_register(&cb)) {
1946 		return BTP_STATUS_FAILED;
1947 	}
1948 
1949 	err = bt_enable(NULL);
1950 	if (err < 0) {
1951 		LOG_ERR("Unable to enable Bluetooth: %d", err);
1952 		return BTP_STATUS_FAILED;
1953 	}
1954 
1955 	atomic_clear(&current_settings);
1956 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_POWERED);
1957 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_CONNECTABLE);
1958 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_BONDABLE);
1959 	atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_LE);
1960 	if (IS_ENABLED(CONFIG_BT_PRIVACY)) {
1961 		atomic_set_bit(&current_settings, BTP_GAP_SETTINGS_PRIVACY);
1962 	}
1963 
1964 	bt_conn_cb_register(&conn_callbacks);
1965 	bt_conn_auth_info_cb_register(&auth_info_cb);
1966 
1967 	if (IS_ENABLED(CONFIG_BT_PER_ADV)) {
1968 		bt_le_per_adv_sync_cb_register(&pa_sync_cb);
1969 	}
1970 
1971 	tester_register_command_handlers(BTP_SERVICE_ID_GAP, handlers,
1972 					 ARRAY_SIZE(handlers));
1973 
1974 	return BTP_STATUS_SUCCESS;
1975 }
1976 
tester_unregister_gap(void)1977 uint8_t tester_unregister_gap(void)
1978 {
1979 	return BTP_STATUS_SUCCESS;
1980 }
1981