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:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user