Skip to content

Commit 3c69dff

Browse files
carlescufijhedberg
authored andcommitted
Bluetooth: tester: Implement the GAP_PASSKEY_CONFIRM command
Implement the BTP GAP command and event for passkey confirmation. This also allows us to set the passkey_confirm auth callback which enables the keyboard/display IO capabilities. Signed-off-by: Carles Cufi <[email protected]>
1 parent c3f5677 commit 3c69dff

File tree

1 file changed

+56
-1
lines changed
  • tests/bluetooth/tester/src

1 file changed

+56
-1
lines changed

tests/bluetooth/tester/src/gap.c

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ static void supported_commands(u8_t *data, u16_t len)
127127
tester_set_bit(cmds, GAP_SET_IO_CAP);
128128
tester_set_bit(cmds, GAP_PAIR);
129129
tester_set_bit(cmds, GAP_PASSKEY_ENTRY);
130+
tester_set_bit(cmds, GAP_PASSKEY_CONFIRM);
130131
tester_set_bit(cmds, GAP_CONN_PARAM_UPDATE);
131132

132133
tester_send(BTP_SERVICE_ID_GAP, GAP_READ_SUPPORTED_COMMANDS,
@@ -571,6 +572,19 @@ static void auth_passkey_entry(struct bt_conn *conn)
571572
CONTROLLER_INDEX, (u8_t *) &ev, sizeof(ev));
572573
}
573574

575+
static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey)
576+
{
577+
struct gap_passkey_confirm_req_ev ev;
578+
const bt_addr_le_t *addr = bt_conn_get_dst(conn);
579+
580+
memcpy(ev.address, addr->a.val, sizeof(ev.address));
581+
ev.address_type = addr->type;
582+
ev.passkey = sys_cpu_to_le32(passkey);
583+
584+
tester_send(BTP_SERVICE_ID_GAP, GAP_EV_PASSKEY_CONFIRM_REQ,
585+
CONTROLLER_INDEX, (u8_t *) &ev, sizeof(ev));
586+
}
587+
574588
static void auth_cancel(struct bt_conn *conn)
575589
{
576590
/* TODO */
@@ -585,6 +599,8 @@ static void set_io_cap(const u8_t *data, u16_t len)
585599
(void)memset(&cb, 0, sizeof(cb));
586600
bt_conn_auth_cb_register(NULL);
587601

602+
LOG_DBG("io_cap: %d", cmd->io_cap);
603+
588604
switch (cmd->io_cap) {
589605
case GAP_IO_CAP_DISPLAY_ONLY:
590606
cb.cancel = auth_cancel;
@@ -594,6 +610,7 @@ static void set_io_cap(const u8_t *data, u16_t len)
594610
cb.cancel = auth_cancel;
595611
cb.passkey_display = auth_passkey_display;
596612
cb.passkey_entry = auth_passkey_entry;
613+
cb.passkey_confirm = auth_passkey_confirm;
597614
break;
598615
case GAP_IO_CAP_NO_INPUT_OUTPUT:
599616
cb.cancel = auth_cancel;
@@ -699,7 +716,7 @@ static void passkey_entry(const u8_t *data, u16_t len)
699716

700717
err = bt_conn_auth_passkey_entry(conn, sys_le32_to_cpu(cmd->passkey));
701718
if (err < 0) {
702-
LOG_ERR("Failed to enter passeky: %d", err);
719+
LOG_ERR("Failed to enter passkey: %d", err);
703720
}
704721

705722
bt_conn_unref(conn);
@@ -710,6 +727,41 @@ static void passkey_entry(const u8_t *data, u16_t len)
710727
status);
711728
}
712729

730+
static void passkey_confirm(const u8_t *data, u16_t len)
731+
{
732+
const struct gap_passkey_confirm_cmd *cmd = (void *) data;
733+
struct bt_conn *conn;
734+
u8_t status;
735+
int err;
736+
737+
conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, (bt_addr_le_t *)data);
738+
if (!conn) {
739+
LOG_ERR("Unknown connection");
740+
status = BTP_STATUS_FAILED;
741+
goto rsp;
742+
}
743+
744+
if (cmd->match) {
745+
err = bt_conn_auth_passkey_confirm(conn);
746+
if (err < 0) {
747+
LOG_ERR("Failed to confirm passkey: %d", err);
748+
}
749+
} else {
750+
err = bt_conn_auth_cancel(conn);
751+
if (err < 0) {
752+
LOG_ERR("Failed to cancel auth: %d", err);
753+
}
754+
}
755+
756+
bt_conn_unref(conn);
757+
status = err < 0 ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
758+
759+
rsp:
760+
tester_rsp(BTP_SERVICE_ID_GAP, GAP_PASSKEY_CONFIRM, CONTROLLER_INDEX,
761+
status);
762+
}
763+
764+
713765
static void conn_param_update(const u8_t *data, u16_t len)
714766
{
715767
const struct gap_conn_param_update_cmd *cmd = (void *) data;
@@ -817,6 +869,9 @@ void tester_handle_gap(u8_t opcode, u8_t index, u8_t *data,
817869
case GAP_PASSKEY_ENTRY:
818870
passkey_entry(data, len);
819871
return;
872+
case GAP_PASSKEY_CONFIRM:
873+
passkey_confirm(data, len);
874+
return;
820875
case GAP_CONN_PARAM_UPDATE:
821876
conn_param_update(data, len);
822877
return;

0 commit comments

Comments
 (0)