job management:

moved job code from thread_pool to job, jobs have an "execute" method now
  added two new jobs: delete_child_sa & rekey_child_sa
kernel interface:
  listens now for ACQUIRE & EXPIRE
  supports hard and soft lifetimes
  fires jobs for delete and rekey child sa
ike sa manager:
  can checkout IKE SAs by requid of owned CHILD SAs
we have now the infrastructure to do the rekeying... :-)
This commit is contained in:
Martin Willi
2006-05-31 14:23:15 +00:00
parent 6f2aba1322
commit 32b6500fbf
31 changed files with 930 additions and 739 deletions
+46 -18
View File
@@ -25,7 +25,7 @@
#include "initiate_ike_sa_job.h"
#include <daemon.h>
typedef struct private_initiate_ike_sa_job_t private_initiate_ike_sa_job_t;
@@ -42,9 +42,13 @@ struct private_initiate_ike_sa_job_t {
* associated connection object to initiate
*/
connection_t *connection;
/**
* logger
*/
logger_t *logger;
};
/**
* Implements initiate_ike_sa_job_t.get_type.
*/
@@ -54,20 +58,46 @@ static job_type_t get_type(private_initiate_ike_sa_job_t *this)
}
/**
* Implements initiate_ike_sa_job_t.get_configuration_name.
* Implementation of job_t.execute.
*/
static connection_t *get_connection(private_initiate_ike_sa_job_t *this)
static status_t execute(private_initiate_ike_sa_job_t *this)
{
return this->connection;
}
/*
* Initiatie an IKE_SA:
* - is defined by a name of a configuration
* - create an empty IKE_SA via manager
* - call initiate_connection on this sa
*/
ike_sa_t *ike_sa;
status_t status;
job_t *delete_job;
this->logger->log(this->logger, CONTROL|LEVEL2, "Creating and checking out IKE SA");
charon->ike_sa_manager->create_and_checkout(charon->ike_sa_manager, &ike_sa);
status = ike_sa->initiate_connection(ike_sa, this->connection->clone(this->connection));
if (status != SUCCESS)
{
this->logger->log(this->logger, ERROR, "Initiation returned %s, going to delete IKE_SA.",
mapping_find(status_m, status));
charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, ike_sa);
return DESTROY_ME;
}
this->logger->log(this->logger, CONTROL|LEVEL3, "Create Job to delete half open IKE_SA.");
delete_job = (job_t *) delete_half_open_ike_sa_job_create(ike_sa->get_id(ike_sa));
charon->event_queue->add_relative(charon->event_queue, delete_job,
charon->configuration->get_half_open_ike_sa_timeout(charon->configuration));
/**
* Implements job_t.destroy.
*/
static void destroy_all(private_initiate_ike_sa_job_t *this)
{
this->connection->destroy(this->connection);
free(this);
this->logger->log(this->logger, CONTROL|LEVEL2, "Checking in IKE SA");
status = charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
if (status != SUCCESS)
{
this->logger->log(this->logger, ERROR, "Could not checkin IKE_SA (%s)",
mapping_find(status_m, status));
}
return DESTROY_ME;
}
/**
@@ -75,6 +105,7 @@ static void destroy_all(private_initiate_ike_sa_job_t *this)
*/
static void destroy(private_initiate_ike_sa_job_t *this)
{
this->connection->destroy(this->connection);
free(this);
}
@@ -87,15 +118,12 @@ initiate_ike_sa_job_t *initiate_ike_sa_job_create(connection_t *connection)
/* interface functions */
this->public.job_interface.get_type = (job_type_t (*) (job_t *)) get_type;
this->public.job_interface.destroy_all = (void (*) (job_t *)) destroy_all;
this->public.job_interface.execute = (status_t (*) (job_t *)) execute;
this->public.job_interface.destroy = (void (*) (job_t *)) destroy;
/* public functions */
this->public.get_connection = (connection_t* (*)(initiate_ike_sa_job_t *)) get_connection;
this->public.destroy = (void (*)(initiate_ike_sa_job_t *)) destroy;
/* private variables */
this->connection = connection;
this->logger = logger_manager->get_logger(logger_manager, WORKER);
return &(this->public);
}