clear prepared write queue on disconnect

This commit is contained in:
matthias.ringwald@gmail.com 2014-01-31 10:04:51 +00:00
parent 019dee48ea
commit b9ccc2858d
3 changed files with 15 additions and 2 deletions

View File

@ -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;

View File

@ -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

View File

@ -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: