File 0016-strongswan-5.3.3-ikev1-extrat-queuing-of-transactional-messages.patch of Package strongswan.22505

commit 3f56f73159d1e53004358f3f02d1a0c2fd67839f
Author: Tobias Brunner <tobias@strongswan.org>
Date:   Mon Sep 28 17:33:46 2015 +0200

    ikev1: Extract queueing of TRANSACTIONAL requests when MM is not complete yet

diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index 1a6f868..0b329e0 100644
--- a/src/libcharon/sa/ikev1/task_manager_v1.c
+++ b/src/libcharon/sa/ikev1/task_manager_v1.c
@@ -1262,6 +1262,29 @@ static status_t parse_message(private_task_manager_t *this, message_t *msg)
 	return status;
 }
 
+/**
+ * Queue the given message if possible
+ */
+static status_t queue_message(private_task_manager_t *this, message_t *msg)
+{
+	if (this->queued)
+	{
+		DBG1(DBG_IKE, "ignoring %N request, queue full",
+			 exchange_type_names, msg->get_exchange_type(msg));
+		return FAILED;
+	}
+	this->queued = message_create_from_packet(msg->get_packet(msg));
+	if (this->queued->parse_header(this->queued) != SUCCESS)
+	{
+		this->queued->destroy(this->queued);
+		this->queued = NULL;
+		return FAILED;
+	}
+	DBG1(DBG_IKE, "queueing %N request as tasks still active",
+		 exchange_type_names, msg->get_exchange_type(msg));
+	return SUCCESS;
+}
+
 METHOD(task_manager_t, process_message, status_t,
 	private_task_manager_t *this, message_t *msg)
 {
@@ -1372,25 +1395,12 @@ METHOD(task_manager_t, process_message, status_t,
 			return FAILED;
 		}
 
+		/* queue XAuth/Mode Config messages unless the Main Mode exchange we
+		 * initiated is complete */
 		if (msg->get_exchange_type(msg) == TRANSACTION &&
 			this->active_tasks->get_count(this->active_tasks))
-		{	/* main mode not yet complete, queue XAuth/Mode config tasks */
-			if (this->queued)
-			{
-				DBG1(DBG_IKE, "ignoring additional %N request, queue full",
-					 exchange_type_names, TRANSACTION);
-				return SUCCESS;
-			}
-			this->queued = message_create_from_packet(msg->get_packet(msg));
-			if (this->queued->parse_header(this->queued) != SUCCESS)
-			{
-				this->queued->destroy(this->queued);
-				this->queued = NULL;
-				return FAILED;
-			}
-			DBG1(DBG_IKE, "queueing %N request as tasks still active",
-				 exchange_type_names, TRANSACTION);
-			return SUCCESS;
+		{
+			return queue_message(this, msg);
 		}
 
 		msg->set_request(msg, TRUE);
openSUSE Build Service is sponsored by