sm: introduce SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK to wait for IRK after receiving Pairing Request

This commit is contained in:
Matthias Ringwald 2020-12-07 11:15:26 +01:00
parent 7af5dcd58a
commit 212d735ee7
2 changed files with 21 additions and 6 deletions

View File

@ -1288,11 +1288,15 @@ static void sm_address_resolution_handle_event(address_resolution_event_t event)
if (sm_connection->sm_role) {
#ifdef ENABLE_LE_PERIPHERAL
// LTK request received before, IRK required -> start LTK calculation
// IRK required before, continue
if (sm_connection->sm_engine_state == SM_RESPONDER_PH0_RECEIVED_LTK_W4_IRK){
sm_connection->sm_engine_state = SM_RESPONDER_PH0_RECEIVED_LTK_REQUEST;
break;
}
if (sm_connection->sm_engine_state == SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK){
sm_connection->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
break;
}
bool trigger_security_request = (sm_connection->sm_pairing_requested != 0) || (sm_slave_request_security != 0);
sm_connection->sm_pairing_requested = 0;
#ifdef ENABLE_LE_PROACTIVE_AUTHENTICATION
@ -3781,6 +3785,9 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
return;
}
int have_ltk;
uint8_t ltk[16];
switch (sm_conn->sm_engine_state){
// a sm timeout requires a new physical connection
@ -3797,8 +3804,6 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
}
// IRK complete?
int have_ltk;
uint8_t ltk[16];
switch (sm_conn->sm_irk_lookup_state){
case IRK_LOOKUP_FAILED:
// start pairing
@ -3932,9 +3937,18 @@ static void sm_pdu_handler(uint8_t packet_type, hci_con_handle_t con_handle, uin
}
// store pairing request
(void)memcpy(&sm_conn->sm_m_preq, packet,
sizeof(sm_pairing_packet_t));
sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
(void)memcpy(&sm_conn->sm_m_preq, packet, sizeof(sm_pairing_packet_t));
// check if IRK completed
switch (sm_conn->sm_irk_lookup_state){
case IRK_LOOKUP_SUCCEEDED:
case IRK_LOOKUP_FAILED:
sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED;
break;
default:
sm_conn->sm_engine_state = SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK;
break;
}
break;
#endif

View File

@ -330,6 +330,7 @@ typedef enum {
SM_RESPONDER_PH0_SEND_LTK_REQUESTED_NEGATIVE_REPLY,
SM_RESPONDER_PH1_W4_PAIRING_REQUEST,
SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED,
SM_RESPONDER_PH1_PAIRING_REQUEST_RECEIVED_W4_IRK,
SM_RESPONDER_PH1_SEND_PAIRING_RESPONSE,
SM_RESPONDER_PH1_W4_PAIRING_CONFIRM,
SM_RESPONDER_PH2_W4_PAIRING_RANDOM,