1 /*
2  * Copyright (c) 2025 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <stddef.h>
8 #include <stdint.h>
9 #include <zephyr/bluetooth/addr.h>
10 #include <zephyr/bluetooth/att.h>
11 #include <zephyr/bluetooth/bluetooth.h>
12 #include <zephyr/bluetooth/conn.h>
13 #include <zephyr/bluetooth/gatt.h>
14 #include <zephyr/kernel.h>
15 #include <zephyr/logging/log_core.h>
16 #include <zephyr/logging/log.h>
17 #include <zephyr/sys/__assert.h>
18 
19 LOG_MODULE_REGISTER(bt_testlib_att, LOG_LEVEL_DBG);
20 
21 static uint8_t exchange_mtu_err;
22 static K_MUTEX_DEFINE(exchange_mtu_lock);
23 static K_CONDVAR_DEFINE(exchange_mtu_done);
24 
bt_testlib_att_exchange_mtu_cb(struct bt_conn * conn,uint8_t err,struct bt_gatt_exchange_params * params)25 static void bt_testlib_att_exchange_mtu_cb(struct bt_conn *conn, uint8_t err,
26 					   struct bt_gatt_exchange_params *params)
27 {
28 	char addr[BT_ADDR_LE_STR_LEN];
29 
30 	k_mutex_lock(&exchange_mtu_lock, K_FOREVER);
31 
32 	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
33 
34 	LOG_DBG("MTU exchange %s (%s)", err == 0U ? "successful" : "failed", addr);
35 
36 	exchange_mtu_err = err;
37 
38 	k_condvar_signal(&exchange_mtu_done);
39 
40 	k_mutex_unlock(&exchange_mtu_lock);
41 }
42 
bt_testlib_att_exchange_mtu(struct bt_conn * conn)43 int bt_testlib_att_exchange_mtu(struct bt_conn *conn)
44 {
45 	int err;
46 	struct bt_gatt_exchange_params exchange_mtu_params;
47 
48 	__ASSERT_NO_MSG(conn != NULL);
49 
50 	k_mutex_lock(&exchange_mtu_lock, K_FOREVER);
51 
52 	exchange_mtu_err = 0;
53 
54 	exchange_mtu_params.func = bt_testlib_att_exchange_mtu_cb;
55 
56 	err = bt_gatt_exchange_mtu(conn, &exchange_mtu_params);
57 	if (err != 0) {
58 		LOG_ERR("Failed to exchange MTU (err %d)", err);
59 
60 		k_mutex_unlock(&exchange_mtu_lock);
61 
62 		return err;
63 	}
64 
65 	k_condvar_wait(&exchange_mtu_done, &exchange_mtu_lock, K_FOREVER);
66 
67 	err = exchange_mtu_err;
68 
69 	k_mutex_unlock(&exchange_mtu_lock);
70 
71 	return err;
72 }
73