diff options
Diffstat (limited to 'src/charon/processing/jobs/inactivity_job.c')
-rw-r--r-- | src/charon/processing/jobs/inactivity_job.c | 150 |
1 files changed, 0 insertions, 150 deletions
diff --git a/src/charon/processing/jobs/inactivity_job.c b/src/charon/processing/jobs/inactivity_job.c deleted file mode 100644 index 13fc5e3d0..000000000 --- a/src/charon/processing/jobs/inactivity_job.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2010 Martin Willi - * Hochschule fuer Technik Rapperswil - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - */ - -#include "inactivity_job.h" - -#include <daemon.h> - -typedef struct private_inactivity_job_t private_inactivity_job_t; - -/** - * Private data of an inactivity_job_t object. - */ -struct private_inactivity_job_t { - - /** - * Public inactivity_job_t interface. - */ - inactivity_job_t public; - - /** - * Reqid of CHILD_SA to check - */ - u_int32_t reqid; - - /** - * Inactivity timeout - */ - u_int32_t timeout; - - /** - * Close IKE_SA if last remaining CHILD inactive? - */ - bool close_ike; -}; - -METHOD(job_t, destroy, void, - private_inactivity_job_t *this) -{ - free(this); -} - -METHOD(job_t, execute, void, - private_inactivity_job_t *this) -{ - ike_sa_t *ike_sa; - bool rescheduled = FALSE; - - ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager, - this->reqid, TRUE); - if (ike_sa) - { - iterator_t *iterator; - child_sa_t *child_sa; - u_int32_t delete = 0; - protocol_id_t proto = 0; - int children = 0; - status_t status = SUCCESS; - - iterator = ike_sa->create_child_sa_iterator(ike_sa); - while (iterator->iterate(iterator, (void**)&child_sa)) - { - if (child_sa->get_reqid(child_sa) == this->reqid) - { - time_t in, out, diff; - - child_sa->get_usestats(child_sa, TRUE, &in, NULL); - child_sa->get_usestats(child_sa, FALSE, &out, NULL); - - diff = time_monotonic(NULL) - max(in, out); - - if (diff >= this->timeout) - { - delete = child_sa->get_spi(child_sa, TRUE); - proto = child_sa->get_protocol(child_sa); - } - else - { - charon->scheduler->schedule_job(charon->scheduler, - &this->public.job_interface, this->timeout - diff); - rescheduled = TRUE; - } - } - children++; - } - iterator->destroy(iterator); - - if (delete) - { - if (children == 1 && this->close_ike) - { - DBG1(DBG_JOB, "deleting IKE_SA after %d seconds " - "of CHILD_SA inactivity", this->timeout); - status = ike_sa->delete(ike_sa); - } - else - { - DBG1(DBG_JOB, "deleting CHILD_SA after %d seconds " - "of inactivity", this->timeout); - status = ike_sa->delete_child_sa(ike_sa, proto, delete); - } - } - if (status == DESTROY_ME) - { - charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, - ike_sa); - } - else - { - charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa); - } - } - if (!rescheduled) - { - destroy(this); - } -} - -/** - * See header - */ -inactivity_job_t *inactivity_job_create(u_int32_t reqid, u_int32_t timeout, - bool close_ike) -{ - private_inactivity_job_t *this; - - INIT(this, - .public.job_interface = { - .execute = _execute, - .destroy = _destroy, - }, - .reqid = reqid, - .timeout = timeout, - .close_ike = close_ike, - ); - - return &this->public; -} - |