Use informational task in quick mode to send notifies
authorMartin Willi <martin@revosec.ch>
Mon, 12 Dec 2011 17:13:10 +0000 (18:13 +0100)
committerMartin Willi <martin@revosec.ch>
Tue, 20 Mar 2012 16:31:18 +0000 (17:31 +0100)
src/libcharon/sa/tasks/quick_mode.c

index 18895db..92a526e 100755 (executable)
@@ -24,6 +24,7 @@
 #include <encoding/payloads/ke_payload.h>
 #include <encoding/payloads/id_payload.h>
 #include <encoding/payloads/payload.h>
+#include <sa/tasks/informational.h>
 
 typedef struct private_quick_mode_t private_quick_mode_t;
 
@@ -519,31 +520,21 @@ static void apply_lifetimes(private_quick_mode_t *this, sa_payload_t *sa_payload
        }
 }
 
-METHOD(task_t, build_notify_error, status_t,
-       private_quick_mode_t *this, message_t *message)
+/**
+ * Set the task ready to build notify error message
+ */
+static status_t send_notify(private_quick_mode_t *this, notify_type_t type)
 {
        notify_payload_t *notify;
 
        notify = notify_payload_create_from_protocol_and_type(NOTIFY_V1,
-                                               PROTO_ESP, this->notify_type);
-
+                                                                                                                 PROTO_ESP, type);
        notify->set_spi(notify, this->spi_i);
 
-       message->add_payload(message, (payload_t*)notify);
-
-       return SUCCESS;
-}
-
-/**
- * Set the task ready to build notify error message
- */
-static status_t set_notify_error(private_quick_mode_t *this,
-                                                                                                                                notify_type_t type)
-{
-       this->notify_type = type;
-       /* The task will be destroyed after build */
-       this->public.task.build = _build_notify_error;
-       return FAILED_SEND_ERROR;
+       this->ike_sa->queue_task(this->ike_sa,
+                                               (task_t*)informational_create(this->ike_sa, notify));
+       /* cancel all active/passive tasks in favour of informational */
+       return ALREADY_DONE;
 }
 
 METHOD(task_t, build_i, status_t,
@@ -727,8 +718,9 @@ METHOD(task_t, process_r, status_t,
 
                        if (!this->proposal)
                        {
-                               DBG1(DBG_IKE, "no matching proposal found");
-                               return set_notify_error(this, NO_PROPOSAL_CHOSEN);
+                               DBG1(DBG_IKE, "no matching proposal found, sending %N",
+                                        notify_type_names, NO_PROPOSAL_CHOSEN);
+                               return send_notify(this, NO_PROPOSAL_CHOSEN);
                        }
                        this->spi_i = this->proposal->get_spi(this->proposal);