aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/queues
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/queues')
-rw-r--r--src/charon/queues/jobs/acquire_job.c4
-rw-r--r--src/charon/queues/jobs/delete_child_sa_job.c4
-rw-r--r--src/charon/queues/jobs/delete_ike_sa_job.c43
-rw-r--r--src/charon/queues/jobs/incoming_packet_job.c34
-rw-r--r--src/charon/queues/jobs/initiate_job.c21
-rw-r--r--src/charon/queues/jobs/initiate_job.h4
-rw-r--r--src/charon/queues/jobs/job.c2
-rw-r--r--src/charon/queues/jobs/job.h4
-rw-r--r--src/charon/queues/jobs/rekey_child_sa_job.c4
-rw-r--r--src/charon/queues/jobs/rekey_ike_sa_job.c4
-rw-r--r--src/charon/queues/jobs/retransmit_job.c (renamed from src/charon/queues/jobs/retransmit_request_job.c)59
-rw-r--r--src/charon/queues/jobs/retransmit_job.h (renamed from src/charon/queues/jobs/retransmit_request_job.h)30
-rw-r--r--src/charon/queues/jobs/route_job.c2
13 files changed, 100 insertions, 115 deletions
diff --git a/src/charon/queues/jobs/acquire_job.c b/src/charon/queues/jobs/acquire_job.c
index 4deadf3fe..b4ffb258d 100644
--- a/src/charon/queues/jobs/acquire_job.c
+++ b/src/charon/queues/jobs/acquire_job.c
@@ -57,8 +57,8 @@ static status_t execute(private_acquire_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout_by_child(charon->ike_sa_manager,
- this->reqid);
+ ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
+ this->reqid, TRUE);
if (ike_sa == NULL)
{
DBG2(DBG_JOB, "CHILD_SA with reqid %d not found for acquiring",
diff --git a/src/charon/queues/jobs/delete_child_sa_job.c b/src/charon/queues/jobs/delete_child_sa_job.c
index 71ee3f00a..f694696b0 100644
--- a/src/charon/queues/jobs/delete_child_sa_job.c
+++ b/src/charon/queues/jobs/delete_child_sa_job.c
@@ -68,8 +68,8 @@ static status_t execute(private_delete_child_sa_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout_by_child(charon->ike_sa_manager,
- this->reqid);
+ ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
+ this->reqid, TRUE);
if (ike_sa == NULL)
{
DBG1(DBG_JOB, "CHILD_SA with reqid %d not found for delete",
diff --git a/src/charon/queues/jobs/delete_ike_sa_job.c b/src/charon/queues/jobs/delete_ike_sa_job.c
index 9e8173c39..706155aa6 100644
--- a/src/charon/queues/jobs/delete_ike_sa_job.c
+++ b/src/charon/queues/jobs/delete_ike_sa_job.c
@@ -62,41 +62,38 @@ static status_t execute(private_delete_ike_sa_job_t *this)
{
ike_sa_t *ike_sa;
- if (this->delete_if_established)
+ ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager,
+ this->ike_sa_id);
+ if (ike_sa)
{
- if (charon->ike_sa_manager->delete(charon->ike_sa_manager,
- this->ike_sa_id) != SUCCESS)
+ if (this->delete_if_established)
{
- DBG2(DBG_JOB, "IKE SA didn't exist anymore");
- }
- return DESTROY_ME;
- }
- else
- {
- ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager, this->ike_sa_id);
- if (ike_sa == NULL)
- {
- /* hm, somebody was faster ;-) */
- return DESTROY_ME;
+ if (ike_sa->delete(ike_sa) == 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);
+ }
}
-
- switch (ike_sa->get_state(ike_sa))
+ else
{
- case IKE_ESTABLISHED:
+ /* destroy only if not ESTABLISHED */
+ if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED)
{
- /* IKE_SA is established and so is not getting destroyed */
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
- return DESTROY_ME;
}
- default:
+ else
{
- /* IKE_SA is half open and gets destroyed */
DBG1(DBG_JOB, "deleting half open IKE_SA after timeout");
- charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, ike_sa);
- return DESTROY_ME;
+ charon->ike_sa_manager->checkin_and_destroy(
+ charon->ike_sa_manager, ike_sa);
}
}
}
+ return DESTROY_ME;
}
/**
diff --git a/src/charon/queues/jobs/incoming_packet_job.c b/src/charon/queues/jobs/incoming_packet_job.c
index 18671610d..c4f211a04 100644
--- a/src/charon/queues/jobs/incoming_packet_job.c
+++ b/src/charon/queues/jobs/incoming_packet_job.c
@@ -64,6 +64,13 @@ static void send_notify_response(private_incoming_packet_job_t *this,
packet_t *packet;
ike_sa_id_t *ike_sa_id;
+ if (request->get_exchange_type(request) != IKE_SA_INIT)
+ {
+ /* TODO: Use transforms implementing the "NULL" algorithm,
+ we are unable to generate message otherwise */
+ return;
+ }
+
ike_sa_id = request->get_ike_sa_id(request);
ike_sa_id = ike_sa_id->clone(ike_sa_id);
ike_sa_id->switch_initiator(ike_sa_id);
@@ -80,8 +87,6 @@ static void send_notify_response(private_incoming_packet_job_t *this,
ike_sa_id->destroy(ike_sa_id);
notify = notify_payload_create_from_protocol_and_type(PROTO_NONE, type);
response->add_payload(response, (payload_t *)notify);
- /* generation may fail, as most messages need a crypter/signer.
- * TODO: Use transforms implementing the "NULL" algorithm */
if (response->generate(response, NULL, NULL, &packet) != SUCCESS)
{
response->destroy(response);
@@ -107,12 +112,12 @@ static status_t execute(private_incoming_packet_job_t *this)
message = message_create_from_packet(this->packet->clone(this->packet));
src = message->get_source(message);
dst = message->get_destination(message);
- DBG1(DBG_NET, "received packet: from %#H to %#H", src, dst);
status = message->parse_header(message);
if (status != SUCCESS)
{
- DBG1(DBG_NET, "received message with invalid IKE header, ignored");
+ DBG1(DBG_NET, "received message from %H with invalid IKE header, "
+ "ignored", src);
message->destroy(message);
return DESTROY_ME;
}
@@ -120,11 +125,12 @@ static status_t execute(private_incoming_packet_job_t *this)
if ((message->get_major_version(message) != IKE_MAJOR_VERSION) ||
(message->get_minor_version(message) != IKE_MINOR_VERSION))
{
- DBG1(DBG_NET,
- "received a packet with IKE version %d.%d, not supported",
- message->get_major_version(message),
- message->get_minor_version(message));
- if ((message->get_exchange_type(message) == IKE_SA_INIT) && (message->get_request(message)))
+ DBG1(DBG_NET, "received message from %H with unsupported IKE "
+ "version %d.%d, ignored", src, message->get_major_version(message),
+ message->get_minor_version(message));
+
+ if (message->get_exchange_type(message) == IKE_SA_INIT &&
+ message->get_request(message))
{
send_notify_response(this, message, INVALID_MAJOR_VERSION);
}
@@ -138,19 +144,19 @@ static status_t execute(private_incoming_packet_job_t *this)
ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager, ike_sa_id);
if (ike_sa == NULL)
{
- DBG1(DBG_NET, "received packet for IKE_SA: %J, but no such IKE_SA",
- ike_sa_id);
+ DBG1(DBG_NET, "received packet from %#H for IKE_SA: %J, but no such "
+ "IKE_SA", src, ike_sa_id);
if (message->get_request(message))
{
- /* TODO: send notify if we have NULL crypters,
- * see todo in send_notify_response
- send_notify_response(this, message, INVALID_IKE_SPI); */
+ send_notify_response(this, message, INVALID_IKE_SPI);
}
ike_sa_id->destroy(ike_sa_id);
message->destroy(message);
return DESTROY_ME;
}
+ DBG1(DBG_NET, "received packet: from %#H to %#H", src, dst);
+
status = ike_sa->process_message(ike_sa, message);
if (status == DESTROY_ME)
{
diff --git a/src/charon/queues/jobs/initiate_job.c b/src/charon/queues/jobs/initiate_job.c
index 8b943a3f1..af50663d6 100644
--- a/src/charon/queues/jobs/initiate_job.c
+++ b/src/charon/queues/jobs/initiate_job.c
@@ -45,11 +45,6 @@ struct private_initiate_job_t {
connection_t *connection;
/**
- * host to connect to, use NULL to use connections one
- */
- host_t *other;
-
- /**
* associated policy to initiate
*/
policy_t *policy;
@@ -70,19 +65,12 @@ static status_t execute(private_initiate_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
+ ike_sa = charon->ike_sa_manager->checkout_by_peer(charon->ike_sa_manager,
this->connection->get_my_host(this->connection),
this->connection->get_other_host(this->connection),
this->policy->get_my_id(this->policy),
this->policy->get_other_id(this->policy));
-
- if (this->other)
- {
- ike_sa->set_other_host(ike_sa, this->other->clone(this->other));
- }
-
- this->connection->get_ref(this->connection);
- this->policy->get_ref(this->policy);
+
if (ike_sa->initiate(ike_sa, this->connection, this->policy) != SUCCESS)
{
DBG1(DBG_JOB, "initiation failed, going to delete IKE_SA");
@@ -101,15 +89,13 @@ static void destroy(private_initiate_job_t *this)
{
this->connection->destroy(this->connection);
this->policy->destroy(this->policy);
- DESTROY_IF(this->other);
free(this);
}
/*
* Described in header
*/
-initiate_job_t *initiate_job_create(connection_t *connection, host_t *other,
- policy_t *policy)
+initiate_job_t *initiate_job_create(connection_t *connection, policy_t *policy)
{
private_initiate_job_t *this = malloc_thing(private_initiate_job_t);
@@ -121,7 +107,6 @@ initiate_job_t *initiate_job_create(connection_t *connection, host_t *other,
/* private variables */
this->connection = connection;
this->policy = policy;
- this->other = other;
return &this->public;
}
diff --git a/src/charon/queues/jobs/initiate_job.h b/src/charon/queues/jobs/initiate_job.h
index 2fd0ced93..af1dd9ece 100644
--- a/src/charon/queues/jobs/initiate_job.h
+++ b/src/charon/queues/jobs/initiate_job.h
@@ -51,13 +51,11 @@ struct initiate_job_t {
* @brief Creates a job of type INITIATE_IKE_SA.
*
* @param connection connection_t to initialize
- * @param other another host to initiate to, NULL to use connections one
* @param policy policy to set up
* @return initiate_job_t object
*
* @ingroup jobs
*/
-initiate_job_t *initiate_job_create(connection_t *connection, host_t *other,
- policy_t *policy);
+initiate_job_t *initiate_job_create(connection_t *connection, policy_t *policy);
#endif /*INITIATE_IKE_SA_JOB_H_*/
diff --git a/src/charon/queues/jobs/job.c b/src/charon/queues/jobs/job.c
index d88843d7c..337558c2d 100644
--- a/src/charon/queues/jobs/job.c
+++ b/src/charon/queues/jobs/job.c
@@ -26,7 +26,7 @@
ENUM(job_type_names, INCOMING_PACKET, SEND_DPD,
"INCOMING_PACKET",
- "RETRANSMIT_REQUEST",
+ "RETRANSMIT",
"INITIATE",
"ROUTE",
"ACQUIRE",
diff --git a/src/charon/queues/jobs/job.h b/src/charon/queues/jobs/job.h
index ae3fe7974..ae67a2bdc 100644
--- a/src/charon/queues/jobs/job.h
+++ b/src/charon/queues/jobs/job.h
@@ -45,9 +45,9 @@ enum job_type_t {
/**
* Retransmit an IKEv2-Message.
*
- * Job is implemented in class retransmit_request_job_t
+ * Job is implemented in class retransmit_job_t
*/
- RETRANSMIT_REQUEST,
+ RETRANSMIT,
/**
* Set up a CHILD_SA, optional with an IKE_SA.
diff --git a/src/charon/queues/jobs/rekey_child_sa_job.c b/src/charon/queues/jobs/rekey_child_sa_job.c
index 5944aa77f..3422b614d 100644
--- a/src/charon/queues/jobs/rekey_child_sa_job.c
+++ b/src/charon/queues/jobs/rekey_child_sa_job.c
@@ -67,8 +67,8 @@ static status_t execute(private_rekey_child_sa_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout_by_child(charon->ike_sa_manager,
- this->reqid);
+ ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
+ this->reqid, TRUE);
if (ike_sa == NULL)
{
DBG2(DBG_JOB, "CHILD_SA with reqid %d not found for rekeying",
diff --git a/src/charon/queues/jobs/rekey_ike_sa_job.c b/src/charon/queues/jobs/rekey_ike_sa_job.c
index f0c4bef4f..2539d997e 100644
--- a/src/charon/queues/jobs/rekey_ike_sa_job.c
+++ b/src/charon/queues/jobs/rekey_ike_sa_job.c
@@ -61,7 +61,7 @@ static job_type_t get_type(private_rekey_ike_sa_job_t *this)
static status_t execute(private_rekey_ike_sa_job_t *this)
{
ike_sa_t *ike_sa;
- status_t status;
+ status_t status = SUCCESS;
ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager,
this->ike_sa_id);
@@ -73,7 +73,7 @@ static status_t execute(private_rekey_ike_sa_job_t *this)
if (this->reauth)
{
- status = ike_sa->reauth(ike_sa);
+ ike_sa->reestablish(ike_sa);
}
else
{
diff --git a/src/charon/queues/jobs/retransmit_request_job.c b/src/charon/queues/jobs/retransmit_job.c
index 1dee6e521..5bfa20dfd 100644
--- a/src/charon/queues/jobs/retransmit_request_job.c
+++ b/src/charon/queues/jobs/retransmit_job.c
@@ -1,12 +1,12 @@
/**
- * @file retransmit_request_job.c
+ * @file retransmit_job.c
*
- * @brief Implementation of retransmit_request_job_t.
+ * @brief Implementation of retransmit_job_t.
*
*/
/*
- * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005-2007 Martin Willi
* Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil
*
@@ -21,20 +21,20 @@
* for more details.
*/
-#include "retransmit_request_job.h"
+#include "retransmit_job.h"
#include <daemon.h>
-typedef struct private_retransmit_request_job_t private_retransmit_request_job_t;
+typedef struct private_retransmit_job_t private_retransmit_job_t;
/**
- * Private data of an retransmit_request_job_t Object.
+ * Private data of an retransmit_job_t Object.
*/
-struct private_retransmit_request_job_t {
+struct private_retransmit_job_t {
/**
- * Public retransmit_request_job_t interface.
+ * Public retransmit_job_t interface.
*/
- retransmit_request_job_t public;
+ retransmit_job_t public;
/**
* Message ID of the request to resend.
@@ -50,33 +50,32 @@ struct private_retransmit_request_job_t {
/**
* Implements job_t.get_type.
*/
-static job_type_t get_type(private_retransmit_request_job_t *this)
+static job_type_t get_type(private_retransmit_job_t *this)
{
- return RETRANSMIT_REQUEST;
+ return RETRANSMIT;
}
/**
* Implementation of job_t.execute.
*/
-static status_t execute(private_retransmit_request_job_t *this)
+static status_t execute(private_retransmit_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager, this->ike_sa_id);
- if (ike_sa == NULL)
+ ike_sa = charon->ike_sa_manager->checkout(charon->ike_sa_manager,
+ this->ike_sa_id);
+ if (ike_sa)
{
- DBG2(DBG_JOB, "IKE SA could not be checked out. Already deleted?");
- return DESTROY_ME;
- }
-
- if (ike_sa->retransmit_request(ike_sa, this->message_id) == DESTROY_ME)
- {
- /* retransmission hopeless, kill SA */
- 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 (ike_sa->retransmit(ike_sa, this->message_id) == DESTROY_ME)
+ {
+ /* retransmitted to many times, giving up */
+ 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);
+ }
}
return DESTROY_ME;
}
@@ -84,7 +83,7 @@ static status_t execute(private_retransmit_request_job_t *this)
/**
* Implements job_t.destroy.
*/
-static void destroy(private_retransmit_request_job_t *this)
+static void destroy(private_retransmit_job_t *this)
{
this->ike_sa_id->destroy(this->ike_sa_id);
free(this);
@@ -93,9 +92,9 @@ static void destroy(private_retransmit_request_job_t *this)
/*
* Described in header.
*/
-retransmit_request_job_t *retransmit_request_job_create(u_int32_t message_id,ike_sa_id_t *ike_sa_id)
+retransmit_job_t *retransmit_job_create(u_int32_t message_id,ike_sa_id_t *ike_sa_id)
{
- private_retransmit_request_job_t *this = malloc_thing(private_retransmit_request_job_t);
+ private_retransmit_job_t *this = malloc_thing(private_retransmit_job_t);
/* interface functions */
this->public.job_interface.get_type = (job_type_t (*) (job_t *)) get_type;
@@ -106,5 +105,5 @@ retransmit_request_job_t *retransmit_request_job_create(u_int32_t message_id,ike
this->message_id = message_id;
this->ike_sa_id = ike_sa_id->clone(ike_sa_id);
- return &(this->public);
+ return &this->public;
}
diff --git a/src/charon/queues/jobs/retransmit_request_job.h b/src/charon/queues/jobs/retransmit_job.h
index 1897af16d..19e29b909 100644
--- a/src/charon/queues/jobs/retransmit_request_job.h
+++ b/src/charon/queues/jobs/retransmit_job.h
@@ -1,12 +1,12 @@
/**
- * @file retransmit_request_job.h
+ * @file retransmit_job.h
*
- * @brief Interface of retransmit_request_job_t.
+ * @brief Interface of retransmit_job_t.
*
*/
/*
- * Copyright (C) 2005-2006 Martin Willi
+ * Copyright (C) 2005-2007 Martin Willi
* Copyright (C) 2005 Jan Hutter
* Hochschule fuer Technik Rapperswil
*
@@ -21,28 +21,28 @@
* for more details.
*/
-#ifndef RESEND_MESSAGE_JOB_H_
-#define RESEND_MESSAGE_JOB_H_
+#ifndef RETRANSMIT_JOB_H_
+#define RETRANSMIT_JOB_H_
-typedef struct retransmit_request_job_t retransmit_request_job_t;
+typedef struct retransmit_job_t retransmit_job_t;
#include <library.h>
#include <queues/jobs/job.h>
#include <sa/ike_sa_id.h>
/**
- * @brief Class representing an RETRANSMIT_REQUEST Job.
+ * @brief Class representing an retransmit Job.
*
* This job is scheduled every time a request is sent over the
* wire. If the response to the request is not received at schedule
* time, the retransmission will be initiated.
*
* @b Constructors:
- * - retransmit_request_job_create()
+ * - retransmit_job_create()
*
* @ingroup jobs
*/
-struct retransmit_request_job_t {
+struct retransmit_job_t {
/**
* The job_t interface.
*/
@@ -50,15 +50,15 @@ struct retransmit_request_job_t {
};
/**
- * @brief Creates a job of type RETRANSMIT_REQUEST.
+ * @brief Creates a job of type retransmit.
*
* @param message_id message_id of the request to resend
- * @param ike_sa_id identification of the ike_sa as ike_sa_id_t object (gets cloned)
- * @return retransmit_request_job_t object
+ * @param ike_sa_id identification of the ike_sa as ike_sa_id_t
+ * @return retransmit_job_t object
*
* @ingroup jobs
*/
-retransmit_request_job_t *retransmit_request_job_create(u_int32_t message_id,
- ike_sa_id_t *ike_sa_id);
+retransmit_job_t *retransmit_job_create(u_int32_t message_id,
+ ike_sa_id_t *ike_sa_id);
-#endif /* RESEND_MESSAGE_JOB_H_ */
+#endif /* RETRANSMIT_JOB_H_ */
diff --git a/src/charon/queues/jobs/route_job.c b/src/charon/queues/jobs/route_job.c
index 5a128474b..bb6281dcc 100644
--- a/src/charon/queues/jobs/route_job.c
+++ b/src/charon/queues/jobs/route_job.c
@@ -69,7 +69,7 @@ static status_t execute(private_route_job_t *this)
{
ike_sa_t *ike_sa;
- ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager,
+ ike_sa = charon->ike_sa_manager->checkout_by_peer(charon->ike_sa_manager,
this->connection->get_my_host(this->connection),
this->connection->get_other_host(this->connection),
this->policy->get_my_id(this->policy),