diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c index 3f0e982a5..781d6b22b 100644 --- a/src/libcharon/sa/ikev2/task_manager_v2.c +++ b/src/libcharon/sa/ikev2/task_manager_v2.c @@ -103,6 +103,12 @@ struct private_task_manager_t { */ u_int retransmitted; + /** + * TRUE if any retransmits have been sent for this message (counter is + * reset if deferred) + */ + bool retransmit_sent; + /** * packet(s) for retransmission */ @@ -394,6 +400,7 @@ METHOD(task_manager_t, retransmit, status_t, this->initiating.retransmitted, message_id); charon->bus->alert(charon->bus, ALERT_RETRANSMIT_SEND, packet, this->initiating.retransmitted); + this->initiating.retransmit_sent = TRUE; } if (!mobike) { @@ -635,6 +642,7 @@ METHOD(task_manager_t, initiate, status_t, message->set_exchange_type(message, exchange); this->initiating.type = exchange; this->initiating.retransmitted = 0; + this->initiating.retransmit_sent = FALSE; this->initiating.deferred = FALSE; enumerator = array_create_enumerator(this->active_tasks); @@ -755,7 +763,7 @@ static status_t process_response(private_task_manager_t *this, } enumerator->destroy(enumerator); - if (this->initiating.retransmitted > 1) + if (this->initiating.retransmit_sent) { packet_t *packet = NULL; array_get(this->initiating.packets, 0, &packet);