@@ -127,6 +127,7 @@ static void supported_commands(u8_t *data, u16_t len)
127
127
tester_set_bit (cmds , GAP_SET_IO_CAP );
128
128
tester_set_bit (cmds , GAP_PAIR );
129
129
tester_set_bit (cmds , GAP_PASSKEY_ENTRY );
130
+ tester_set_bit (cmds , GAP_PASSKEY_CONFIRM );
130
131
tester_set_bit (cmds , GAP_CONN_PARAM_UPDATE );
131
132
132
133
tester_send (BTP_SERVICE_ID_GAP , GAP_READ_SUPPORTED_COMMANDS ,
@@ -571,6 +572,19 @@ static void auth_passkey_entry(struct bt_conn *conn)
571
572
CONTROLLER_INDEX , (u8_t * ) & ev , sizeof (ev ));
572
573
}
573
574
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
+
574
588
static void auth_cancel (struct bt_conn * conn )
575
589
{
576
590
/* TODO */
@@ -585,6 +599,8 @@ static void set_io_cap(const u8_t *data, u16_t len)
585
599
(void )memset (& cb , 0 , sizeof (cb ));
586
600
bt_conn_auth_cb_register (NULL );
587
601
602
+ LOG_DBG ("io_cap: %d" , cmd -> io_cap );
603
+
588
604
switch (cmd -> io_cap ) {
589
605
case GAP_IO_CAP_DISPLAY_ONLY :
590
606
cb .cancel = auth_cancel ;
@@ -594,6 +610,7 @@ static void set_io_cap(const u8_t *data, u16_t len)
594
610
cb .cancel = auth_cancel ;
595
611
cb .passkey_display = auth_passkey_display ;
596
612
cb .passkey_entry = auth_passkey_entry ;
613
+ cb .passkey_confirm = auth_passkey_confirm ;
597
614
break ;
598
615
case GAP_IO_CAP_NO_INPUT_OUTPUT :
599
616
cb .cancel = auth_cancel ;
@@ -699,7 +716,7 @@ static void passkey_entry(const u8_t *data, u16_t len)
699
716
700
717
err = bt_conn_auth_passkey_entry (conn , sys_le32_to_cpu (cmd -> passkey ));
701
718
if (err < 0 ) {
702
- LOG_ERR ("Failed to enter passeky : %d" , err );
719
+ LOG_ERR ("Failed to enter passkey : %d" , err );
703
720
}
704
721
705
722
bt_conn_unref (conn );
@@ -710,6 +727,41 @@ static void passkey_entry(const u8_t *data, u16_t len)
710
727
status );
711
728
}
712
729
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
+
713
765
static void conn_param_update (const u8_t * data , u16_t len )
714
766
{
715
767
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,
817
869
case GAP_PASSKEY_ENTRY :
818
870
passkey_entry (data , len );
819
871
return ;
872
+ case GAP_PASSKEY_CONFIRM :
873
+ passkey_confirm (data , len );
874
+ return ;
820
875
case GAP_CONN_PARAM_UPDATE :
821
876
conn_param_update (data , len );
822
877
return ;
0 commit comments