tests/bluetooth/tester: Add support for auto connection establishment

autopts was updated to properly require support for Accept Filter List
in Auto Connection Establishment Procedure related tests. This patch
enabled support for it and adds required BTP support.

This was affecting following qualification test cases:
GAP/CONN/ACEP/BV-03-C
GAP/CONN/ACEP/BV-04-C

Signed-off-by: Szymon Janc <szymon.janc@codecoup.pl>
This commit is contained in:
Szymon Janc 2022-03-21 16:08:19 +01:00 committed by Carles Cufí
commit 573c0d59e0
3 changed files with 62 additions and 8 deletions

View file

@ -22,6 +22,7 @@ CONFIG_BT_DEVICE_NAME_GATT_WRITABLE=y
CONFIG_BT_EATT=y
CONFIG_BT_L2CAP_ECRED=y
CONFIG_BT_EATT_MAX=5
CONFIG_BT_FILTER_ACCEPT_LIST=y
CONFIG_BT_MESH=y
CONFIG_BT_MESH_RELAY=y

View file

@ -7,6 +7,7 @@
*/
#include <sys/util.h>
#include <bluetooth/addr.h>
#define BTP_MTU 1024
#define BTP_DATA_MAX_SIZE (BTP_MTU - sizeof(struct btp_hdr))
@ -281,6 +282,12 @@ struct gap_set_mitm {
uint8_t mitm;
} __packed;
#define GAP_SET_FILTER_LIST 0x1c
struct gap_set_filter_list {
uint8_t cnt;
bt_addr_le_t addr[0];
} __packed;
/* events */
#define GAP_EV_NEW_SETTINGS 0x80
struct gap_new_settings_ev {

View file

@ -254,6 +254,7 @@ static void supported_commands(uint8_t *data, uint16_t len)
tester_set_bit(cmds, GAP_OOB_SC_GET_LOCAL_DATA);
tester_set_bit(cmds, GAP_OOB_SC_SET_REMOTE_DATA);
#endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
tester_set_bit(cmds, GAP_SET_FILTER_LIST);
tester_send(BTP_SERVICE_ID_GAP, GAP_READ_SUPPORTED_COMMANDS,
CONTROLLER_INDEX, (uint8_t *) rp, sizeof(cmds));
@ -808,11 +809,14 @@ static void stop_discovery(const uint8_t *data, uint16_t len)
static void connect(const uint8_t *data, uint16_t len)
{
struct bt_conn *conn;
const bt_addr_le_t *addr = (const bt_addr_le_t *)data;
uint8_t status;
int err;
err = bt_conn_le_create((bt_addr_le_t *) data, BT_CONN_LE_CREATE_CONN,
if (bt_addr_le_cmp(addr, BT_ADDR_LE_ANY) != 0) {
struct bt_conn *conn;
err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN,
BT_LE_CONN_PARAM_DEFAULT, &conn);
if (err) {
LOG_ERR("Failed to create connection (%d)", err);
@ -821,6 +825,16 @@ static void connect(const uint8_t *data, uint16_t len)
}
bt_conn_unref(conn);
} else {
err = bt_conn_le_create_auto(BT_CONN_LE_CREATE_CONN,
BT_LE_CONN_PARAM_DEFAULT);
if (err) {
LOG_ERR("Failed to create auto connection (%d)", err);
status = BTP_STATUS_FAILED;
goto rsp;
}
}
status = BTP_STATUS_SUCCESS;
rsp:
@ -1176,6 +1190,35 @@ static void set_oob_legacy_data(const uint8_t *data, uint16_t len)
CONTROLLER_INDEX, BTP_STATUS_SUCCESS);
}
static void set_filter_list(const uint8_t *data, uint16_t len)
{
const struct gap_set_filter_list *cmd = (const void *) data;
uint8_t status;
int err;
if (len < sizeof(*cmd) ||
len != (sizeof(*cmd) + (cmd->cnt * sizeof(cmd->addr[0])))) {
status = BTP_STATUS_FAILED;
goto failed;
}
(void)bt_le_filter_accept_list_clear();
for (int i = 0; i < cmd->cnt; i++) {
err = bt_le_filter_accept_list_add(&cmd->addr[i]);
if (err < 0) {
status = BTP_STATUS_FAILED;
goto failed;
}
}
status = BTP_STATUS_SUCCESS;
failed:
tester_rsp(BTP_SERVICE_ID_GAP, GAP_SET_FILTER_LIST,
CONTROLLER_INDEX, status);
}
void tester_handle_gap(uint8_t opcode, uint8_t index, uint8_t *data,
uint16_t len)
{
@ -1274,6 +1317,9 @@ void tester_handle_gap(uint8_t opcode, uint8_t index, uint8_t *data,
set_oob_sc_remote_data(data, len);
return;
#endif /* !defined(CONFIG_BT_SMP_OOB_LEGACY_PAIR_ONLY) */
case GAP_SET_FILTER_LIST:
set_filter_list(data, len);
return;
default:
LOG_WRN("Unknown opcode: 0x%x", opcode);
tester_rsp(BTP_SERVICE_ID_GAP, opcode, index,