Handle DELETE as responder as INFORMATIONAL subtask
authorMartin Willi <martin@revosec.ch>
Tue, 13 Dec 2011 09:22:49 +0000 (10:22 +0100)
committerMartin Willi <martin@revosec.ch>
Tue, 20 Mar 2012 16:31:19 +0000 (17:31 +0100)
src/libcharon/sa/task_manager_v1.c
src/libcharon/sa/tasks/informational.c

index 89c664c..f9df256 100755 (executable)
@@ -19,7 +19,6 @@
 #include <math.h>
 
 #include <daemon.h>
-#include <sa/tasks/child_delete.h>
 #include <sa/tasks/main_mode.h>
 #include <sa/tasks/quick_mode.h>
 #include <sa/tasks/xauth.h>
@@ -29,7 +28,6 @@
 #include <sa/tasks/ike_vendor_v1.h>
 #include <sa/tasks/ike_cert_pre_v1.h>
 #include <sa/tasks/ike_cert_post_v1.h>
-#include <encoding/payloads/delete_payload.h>
 #include <processing/jobs/retransmit_job.h>
 #include <processing/jobs/delete_ike_sa_job.h>
 
index 08e5a7e..c1a30e4 100644 (file)
@@ -16,6 +16,9 @@
 #include "informational.h"
 
 #include <daemon.h>
+#include <sa/tasks/ike_delete.h>
+#include <sa/tasks/child_delete.h>
+#include <encoding/payloads/delete_payload.h>
 
 typedef struct private_informational_t private_informational_t;
 
@@ -38,6 +41,11 @@ struct private_informational_t {
         * Notify payload to send
         */
        notify_payload_t *notify;
+
+       /**
+        * Delete subtask
+        */
+       task_t *del;
 };
 
 METHOD(task_t, build_i, status_t,
@@ -52,6 +60,7 @@ METHOD(task_t, process_r, status_t,
        private_informational_t *this, message_t *message)
 {
        enumerator_t *enumerator;
+       delete_payload_t *delete;
        notify_payload_t *notify;
        notify_type_t type;
        payload_t *payload;
@@ -85,7 +94,17 @@ METHOD(task_t, process_r, status_t,
                                }
                                continue;
                        case DELETE_V1:
-                               /* TODO-IKEv1: handle delete */
+                               delete = (delete_payload_t*)payload;
+                               if (delete->get_protocol_id(delete) == PROTO_IKE)
+                               {
+                                       this->del = (task_t*)ike_delete_create(this->ike_sa, FALSE);
+                               }
+                               else
+                               {
+                                       this->del = (task_t*)child_delete_create(this->ike_sa,
+                                                                                                                        PROTO_NONE, 0);
+                               }
+                               break;
                        default:
                                continue;
                }
@@ -93,12 +112,20 @@ METHOD(task_t, process_r, status_t,
        }
        enumerator->destroy(enumerator);
 
+       if (status == SUCCESS)
+       {
+               return this->del->process(this->del, message);
+       }
        return status;
 }
 
 METHOD(task_t, build_r, status_t,
        private_informational_t *this, message_t *message)
 {
+       if (this->del)
+       {
+               return this->del->build(this->del, message);
+       }
        return FAILED;
 }
 
@@ -124,6 +151,7 @@ METHOD(task_t, destroy, void,
        private_informational_t *this)
 {
        DESTROY_IF(this->notify);
+       DESTROY_IF(this->del);
        free(this);
 }