diff options
Diffstat (limited to 'src')
-rwxr-xr-x[-rw-r--r--] | src/libcharon/sa/tasks/quick_mode.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/libcharon/sa/tasks/quick_mode.c b/src/libcharon/sa/tasks/quick_mode.c index 0a625c31b..18895db09 100644..100755 --- a/src/libcharon/sa/tasks/quick_mode.c +++ b/src/libcharon/sa/tasks/quick_mode.c @@ -112,6 +112,11 @@ struct private_quick_mode_t { */ u_int64_t lifebytes; + /** + * Notify type in case of error + */ + notify_type_t notify_type; + /** states of quick mode */ enum { QM_INIT, @@ -514,6 +519,33 @@ 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) +{ + notify_payload_t *notify; + + notify = notify_payload_create_from_protocol_and_type(NOTIFY_V1, + PROTO_ESP, this->notify_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; +} + METHOD(task_t, build_i, status_t, private_quick_mode_t *this, message_t *message) { @@ -696,7 +728,7 @@ METHOD(task_t, process_r, status_t, if (!this->proposal) { DBG1(DBG_IKE, "no matching proposal found"); - return FAILED; + return set_notify_error(this, NO_PROPOSAL_CHOSEN); } this->spi_i = this->proposal->get_spi(this->proposal); |