Bluetooth: tester: GAP: Support BR connection

According to the connection type of connection, get the appropriate
peer address.

Signed-off-by: Lyle Zhu <lyle.zhu@nxp.com>
This commit is contained in:
Lyle Zhu 2025-03-04 11:07:46 +08:00 committed by Benjamin Cabé
commit d083825cee

View file

@ -102,7 +102,17 @@ static void le_connected(struct bt_conn *conn, uint8_t err)
char addr_str[BT_ADDR_LE_STR_LEN];
struct bt_conn_info info;
(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr_str, sizeof(addr_str));
(void)memset(addr_str, 0, sizeof(addr_str));
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr_str, sizeof(addr_str));
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
(void)bt_addr_to_str(bt_conn_get_dst_br(conn), addr_str, sizeof(addr_str));
} else {
LOG_WRN("Unsupported transport");
return;
}
LOG_DBG("%s: 0x%02x", addr_str, err);
if (err) {
@ -111,10 +121,17 @@ static void le_connected(struct bt_conn *conn, uint8_t err)
bt_conn_get_info(conn, &info);
bt_addr_le_copy(&ev.address, info.le.dst);
ev.interval = sys_cpu_to_le16(info.le.interval);
ev.latency = sys_cpu_to_le16(info.le.latency);
ev.timeout = sys_cpu_to_le16(info.le.timeout);
(void)memset(&ev, 0, sizeof(ev));
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
bt_addr_le_copy(&ev.address, info.le.dst);
ev.interval = sys_cpu_to_le16(info.le.interval);
ev.latency = sys_cpu_to_le16(info.le.latency);
ev.timeout = sys_cpu_to_le16(info.le.timeout);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, info.br.dst);
}
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_CONNECTED, &ev, sizeof(ev));
@ -130,13 +147,27 @@ static void le_connected(struct bt_conn *conn, uint8_t err)
static void le_disconnected(struct bt_conn *conn, uint8_t reason)
{
struct btp_gap_device_disconnected_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
char addr_str[BT_ADDR_LE_STR_LEN];
(void)bt_addr_le_to_str(bt_conn_get_dst(conn), addr_str, sizeof(addr_str));
LOG_DBG("%s: 0x%02x", addr_str, reason);
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
bt_addr_le_copy(&ev.address, addr);
addr = bt_conn_get_dst(conn);
(void)bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
(void)bt_addr_to_str(br_addr, addr_str, sizeof(addr_str));
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
LOG_DBG("%s: 0x%02x", addr_str, reason);
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_DEVICE_DISCONNECTED, &ev, sizeof(ev));
}
@ -158,6 +189,10 @@ static void le_param_updated(struct bt_conn *conn, uint16_t interval,
struct btp_gap_conn_param_update_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
if (!bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
return;
}
bt_addr_le_copy(&ev.address, addr);
ev.interval = sys_cpu_to_le16(interval);
ev.latency = sys_cpu_to_le16(latency);
@ -182,14 +217,31 @@ static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param)
static void le_security_changed(struct bt_conn *conn, bt_security_t level,
enum bt_security_err err)
{
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
struct btp_gap_sec_level_changed_ev sec_ev;
struct btp_gap_bond_lost_ev bond_ev;
struct bt_conn_info info;
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&sec_ev.address, addr);
bt_addr_le_copy(&bond_ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
sec_ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&sec_ev.address.a, br_addr);
bond_ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&bond_ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
switch (err) {
case BT_SECURITY_ERR_SUCCESS:
bt_addr_le_copy(&sec_ev.address, addr);
/* enum matches BTP values */
sec_ev.sec_level = level;
@ -206,8 +258,6 @@ static void le_security_changed(struct bt_conn *conn, bt_security_t level,
info.role == BT_CONN_ROLE_CENTRAL) {
LOG_DBG("Bond lost");
bt_addr_le_copy(&bond_ev.address, addr);
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_BOND_LOST,
&bond_ev, sizeof(bond_ev));
@ -1147,9 +1197,23 @@ static uint8_t disconnect(const void *cmd, uint16_t cmd_len,
static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
{
struct btp_gap_passkey_display_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
ev.passkey = sys_cpu_to_le32(passkey);
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_DISPLAY, &ev, sizeof(ev));
@ -1158,9 +1222,22 @@ static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
static void auth_passkey_entry(struct bt_conn *conn)
{
struct btp_gap_passkey_entry_req_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_ENTRY_REQ, &ev, sizeof(ev));
}
@ -1168,9 +1245,23 @@ static void auth_passkey_entry(struct bt_conn *conn)
static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey)
{
struct btp_gap_passkey_confirm_req_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
ev.passkey = sys_cpu_to_le32(passkey);
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PASSKEY_CONFIRM_REQ, &ev, sizeof(ev));
@ -1185,10 +1276,29 @@ enum bt_security_err auth_pairing_accept(struct bt_conn *conn,
const struct bt_conn_pairing_feat *const feat)
{
struct btp_gap_bond_lost_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
if (!bt_le_bond_exists(BT_ID_DEFAULT, addr)) {
return BT_SECURITY_ERR_SUCCESS;
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
if (!bt_le_bond_exists(BT_ID_DEFAULT, addr)) {
return BT_SECURITY_ERR_SUCCESS;
}
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
if (!bt_br_bond_exists(br_addr)) {
return BT_SECURITY_ERR_SUCCESS;
}
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return BTP_STATUS_FAILED;
}
/* If a peer is already bonded and tries to pair again then it means that
@ -1196,8 +1306,6 @@ enum bt_security_err auth_pairing_accept(struct bt_conn *conn,
*/
LOG_DBG("Bond lost");
bt_addr_le_copy(&ev.address, addr);
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_BOND_LOST, &ev, sizeof(ev));
return BT_SECURITY_ERR_SUCCESS;
@ -1206,9 +1314,23 @@ enum bt_security_err auth_pairing_accept(struct bt_conn *conn,
void auth_pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
{
struct btp_gap_bond_pairing_failed_ev ev;
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
if (bt_conn_is_type(conn, BT_CONN_TYPE_LE)) {
const bt_addr_le_t *addr;
addr = bt_conn_get_dst(conn);
bt_addr_le_copy(&ev.address, addr);
} else if (IS_ENABLED(CONFIG_BT_CLASSIC) && bt_conn_is_type(conn, BT_CONN_TYPE_BR)) {
const bt_addr_t *br_addr;
br_addr = bt_conn_get_dst_br(conn);
ev.address.type = BTP_BR_ADDRESS_TYPE;
bt_addr_copy(&ev.address.a, br_addr);
} else {
LOG_WRN("Unsupported transport");
return;
}
ev.reason = reason;
tester_event(BTP_SERVICE_ID_GAP, BTP_GAP_EV_PAIRING_FAILED, &ev, sizeof(ev));