From: Martin Willi Date: Tue, 13 Dec 2011 09:22:49 +0000 (+0100) Subject: Handle DELETE as responder as INFORMATIONAL subtask X-Git-Tag: 5.0.0~338^2~9^2~245 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=10e18713f17f3528667c7124d17174e55a1137c9;p=thirdparty%2Fstrongswan.git Handle DELETE as responder as INFORMATIONAL subtask --- diff --git a/src/libcharon/sa/task_manager_v1.c b/src/libcharon/sa/task_manager_v1.c index 89c664c8f9..f9df2564ee 100755 --- a/src/libcharon/sa/task_manager_v1.c +++ b/src/libcharon/sa/task_manager_v1.c @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -29,7 +28,6 @@ #include #include #include -#include #include #include diff --git a/src/libcharon/sa/tasks/informational.c b/src/libcharon/sa/tasks/informational.c index 08e5a7eb2c..c1a30e4eef 100644 --- a/src/libcharon/sa/tasks/informational.c +++ b/src/libcharon/sa/tasks/informational.c @@ -16,6 +16,9 @@ #include "informational.h" #include +#include +#include +#include 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); }