diff --git a/ble/att.c b/ble/att.c index 2405301d5..469f19935 100644 --- a/ble/att.c +++ b/ble/att.c @@ -928,6 +928,13 @@ static uint16_t handle_prepare_write_request(att_connection_t * att_connection, return request_len; } +/* + * @brief transcation queue of prepared writes, e.g., after disconnect + */ +void att_clear_transaction_queue(){ + (*att_write_callback)(0, ATT_TRANSACTION_MODE_CANCEL, 0, request_buffer + 3, request_len - 3, NULL); +} + // MARK: ATT_EXECUTE_WRITE_REQUEST 0x18 // NOTE: security has been verified by handle_prepare_write_request static uint16_t handle_execute_write_request(att_connection_t * att_connection, uint8_t * request_buffer, uint16_t request_len, @@ -941,7 +948,7 @@ static uint16_t handle_execute_write_request(att_connection_t * att_connection, if (request_buffer[1]) { // deliver queued errors if (att_prepare_write_error_code){ - (*att_write_callback)(0, ATT_TRANSACTION_MODE_CANCEL, 0, request_buffer + 3, request_len - 3, NULL); + att_clear_transaction_queue(); uint8_t error_code = att_prepare_write_error_code; uint16_t handle = att_prepare_write_error_handle; att_prepare_write_reset(); @@ -949,7 +956,7 @@ static uint16_t handle_execute_write_request(att_connection_t * att_connection, } (*att_write_callback)(0, ATT_TRANSACTION_MODE_EXECUTE, 0, request_buffer + 3, request_len - 3, NULL); } else { - (*att_write_callback)(0, ATT_TRANSACTION_MODE_CANCEL, 0, request_buffer + 3, request_len - 3, NULL); + att_clear_transaction_queue(); } response_buffer[0] = ATT_EXECUTE_WRITE_RESPONSE; return 1; diff --git a/ble/att.h b/ble/att.h index 361fea306..a678fc54a 100644 --- a/ble/att.h +++ b/ble/att.h @@ -224,6 +224,11 @@ uint16_t att_prepare_handle_value_indication(att_connection_t * att_connection, uint16_t value_len, uint8_t * response_buffer); +/* + * @brief transcation queue of prepared writes, e.g., after disconnect + */ +void att_clear_transaction_queue(); + #if defined __cplusplus } #endif diff --git a/ble/att_server.c b/ble/att_server.c index 2c0c75378..ffbc5a205 100644 --- a/ble/att_server.c +++ b/ble/att_server.c @@ -149,6 +149,7 @@ static void att_event_packet_handler (uint8_t packet_type, uint16_t channel, uin att_server_state = ATT_SERVER_IDLE; att_request_handle = 0; att_handle_value_indication_handle = 0; // reset error state + att_clear_transaction_queue(); break; case SM_IDENTITY_RESOLVING_STARTED: