Added a non-blocking, skipping variant of IKE_SA enumerator

This commit is contained in:
Martin Willi
2011-05-16 15:24:13 +02:00
parent 3f06403705
commit 69c3eca0e9
13 changed files with 65 additions and 28 deletions
+10 -5
View File
@@ -85,7 +85,8 @@ static job_requeue_t rekey_ike(char *config)
job_t *job = NULL; job_t *job = NULL;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (strcaseeq(config, ike_sa->get_name(ike_sa))) if (strcaseeq(config, ike_sa->get_name(ike_sa)))
@@ -120,7 +121,8 @@ static job_requeue_t rekey_child(char *config)
u_int32_t reqid = 0, spi = 0; u_int32_t reqid = 0, spi = 0;
protocol_id_t proto = PROTO_ESP; protocol_id_t proto = PROTO_ESP;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
children = ike_sa->create_child_sa_iterator(ike_sa); children = ike_sa->create_child_sa_iterator(ike_sa);
@@ -159,7 +161,8 @@ static job_requeue_t liveness(char *config)
job_t *job = NULL; job_t *job = NULL;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (strcaseeq(config, ike_sa->get_name(ike_sa))) if (strcaseeq(config, ike_sa->get_name(ike_sa)))
@@ -191,7 +194,8 @@ static job_requeue_t close_ike(char *config)
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
int id = 0; int id = 0;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (strcaseeq(config, ike_sa->get_name(ike_sa))) if (strcaseeq(config, ike_sa->get_name(ike_sa)))
@@ -224,7 +228,8 @@ static job_requeue_t close_child(char *config)
child_sa_t *child_sa; child_sa_t *child_sa;
int id = 0; int id = 0;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
+4 -3
View File
@@ -206,9 +206,10 @@ static void recheckin(interface_job_t *job)
/** /**
* Implementation of controller_t.create_ike_sa_iterator. * Implementation of controller_t.create_ike_sa_iterator.
*/ */
static enumerator_t* create_ike_sa_enumerator(controller_t *this) static enumerator_t* create_ike_sa_enumerator(controller_t *this, bool wait)
{ {
return charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager); return charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager,
wait);
} }
/** /**
@@ -448,7 +449,7 @@ controller_t *controller_create(void)
{ {
private_controller_t *this = malloc_thing(private_controller_t); private_controller_t *this = malloc_thing(private_controller_t);
this->public.create_ike_sa_enumerator = (enumerator_t*(*)(controller_t*))create_ike_sa_enumerator; this->public.create_ike_sa_enumerator = (enumerator_t*(*)(controller_t*, bool))create_ike_sa_enumerator;
this->public.initiate = (status_t(*)(controller_t*,peer_cfg_t*,child_cfg_t*,controller_cb_t,void*))initiate; this->public.initiate = (status_t(*)(controller_t*,peer_cfg_t*,child_cfg_t*,controller_cb_t,void*))initiate;
this->public.terminate_ike = (status_t(*)(controller_t*,u_int32_t,controller_cb_t, void*))terminate_ike; this->public.terminate_ike = (status_t(*)(controller_t*,u_int32_t,controller_cb_t, void*))terminate_ike;
this->public.terminate_child = (status_t(*)(controller_t*,u_int32_t,controller_cb_t, void *param))terminate_child; this->public.terminate_child = (status_t(*)(controller_t*,u_int32_t,controller_cb_t, void *param))terminate_child;
+2 -1
View File
@@ -67,9 +67,10 @@ struct controller_t {
* The enumerator blocks the IKE_SA manager until it gets destroyed. Do * The enumerator blocks the IKE_SA manager until it gets destroyed. Do
* not call another interface/manager method while the iterator is alive. * not call another interface/manager method while the iterator is alive.
* *
* @param wait TRUE to wait for checked out SAs, FALSE to skip
* @return enumerator, locks IKE_SA manager until destroyed * @return enumerator, locks IKE_SA manager until destroyed
*/ */
enumerator_t* (*create_ike_sa_enumerator)(controller_t *this); enumerator_t* (*create_ike_sa_enumerator)(controller_t *this, bool wait);
/** /**
* Initiate a CHILD_SA, and if required, an IKE_SA. * Initiate a CHILD_SA, and if required, an IKE_SA.
+1 -1
View File
@@ -228,7 +228,7 @@ static void rekey_segment(private_ha_cache_t *this, u_int segment)
list = linked_list_create(); list = linked_list_create();
enumerator = charon->ike_sa_manager->create_enumerator( enumerator = charon->ike_sa_manager->create_enumerator(
charon->ike_sa_manager); charon->ike_sa_manager, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED && if (ike_sa->get_state(ike_sa) == IKE_ESTABLISHED &&
+2 -1
View File
@@ -166,7 +166,8 @@ static void enable_disable(private_ha_segments_t *this, u_int segment,
if (changes) if (changes)
{ {
enumerator = charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager); enumerator = charon->ike_sa_manager->create_enumerator(
charon->ike_sa_manager, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (ike_sa->get_state(ike_sa) != old) if (ike_sa->get_state(ike_sa) != old)
+2 -1
View File
@@ -632,7 +632,8 @@ static gboolean disconnect(NMVPNPlugin *plugin, GError **err)
u_int id; u_int id;
/* our ike_sa pointer might be invalid, lookup sa */ /* our ike_sa pointer might be invalid, lookup sa */
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (priv->ike_sa == ike_sa) if (priv->ike_sa == ike_sa)
+4 -2
View File
@@ -208,7 +208,8 @@ static void request_query_ikesa(xmlTextReaderPtr reader, xmlTextWriterPtr writer
/* <ikesalist> */ /* <ikesalist> */
xmlTextWriterStartElement(writer, "ikesalist"); xmlTextWriterStartElement(writer, "ikesalist");
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
ike_sa_id_t *id; ike_sa_id_t *id;
@@ -394,7 +395,8 @@ static void request_control_terminate(xmlTextReaderPtr reader,
enumerator_t *enumerator; enumerator_t *enumerator;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (streq(str, ike_sa->get_name(ike_sa))) if (streq(str, ike_sa->get_name(ike_sa)))
@@ -287,7 +287,8 @@ METHOD(stroke_control_t, terminate, void,
ike_list = linked_list_create(); ike_list = linked_list_create();
child_list = linked_list_create(); child_list = linked_list_create();
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
child_sa_t *child_sa; child_sa_t *child_sa;
@@ -366,7 +367,8 @@ METHOD(stroke_control_t, rekey, void,
DBG1(DBG_CFG, "error parsing specifier string"); DBG1(DBG_CFG, "error parsing specifier string");
return; return;
} }
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
child_sa_t *child_sa; child_sa_t *child_sa;
@@ -442,7 +444,8 @@ METHOD(stroke_control_t, terminate_srcip, void,
chunk_end = end->get_address(end); chunk_end = end->get_address(end);
} }
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
vip = ike_sa->get_virtual_ip(ike_sa, FALSE); vip = ike_sa->get_virtual_ip(ike_sa, FALSE);
@@ -493,7 +496,8 @@ METHOD(stroke_control_t, purge_ike, void,
info.level = msg->output_verbosity; info.level = msg->output_verbosity;
list = linked_list_create(); list = linked_list_create();
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
iterator = ike_sa->create_child_sa_iterator(ike_sa); iterator = ike_sa->create_child_sa_iterator(ike_sa);
+2 -1
View File
@@ -530,7 +530,8 @@ METHOD(stroke_list_t, status, void,
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
fprintf(out, "Security Associations:\n"); fprintf(out, "Security Associations:\n");
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
bool ike_printed = FALSE; bool ike_printed = FALSE;
+4 -2
View File
@@ -92,7 +92,8 @@ static void status(private_uci_control_t *this, char *name)
{ {
continue; continue;
} }
sas = charon->controller->create_ike_sa_enumerator(charon->controller); sas = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (sas->enumerate(sas, &ike_sa)) while (sas->enumerate(sas, &ike_sa))
{ {
if (!streq(ike_sa->get_name(ike_sa), peer_cfg->get_name(peer_cfg))) if (!streq(ike_sa->get_name(ike_sa), peer_cfg->get_name(peer_cfg)))
@@ -174,7 +175,8 @@ static void terminate(private_uci_control_t *this, char *name)
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
u_int id; u_int id;
enumerator = charon->controller->create_ike_sa_enumerator(charon->controller); enumerator = charon->controller->create_ike_sa_enumerator(
charon->controller, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
if (streq(name, ike_sa->get_name(ike_sa))) if (streq(name, ike_sa->get_name(ike_sa)))
+2 -1
View File
@@ -55,7 +55,8 @@ METHOD(job_t, execute, void,
/* enumerator over all IKE_SAs gives us no way to checkin_and_destroy /* enumerator over all IKE_SAs gives us no way to checkin_and_destroy
* after a DESTROY_ME, so we check out each available IKE_SA by hand. */ * after a DESTROY_ME, so we check out each available IKE_SA by hand. */
list = linked_list_create(); list = linked_list_create();
enumerator = charon->ike_sa_manager->create_enumerator(charon->ike_sa_manager); enumerator = charon->ike_sa_manager->create_enumerator(
charon->ike_sa_manager, TRUE);
while (enumerator->enumerate(enumerator, &ike_sa)) while (enumerator->enumerate(enumerator, &ike_sa))
{ {
id = ike_sa->get_id(ike_sa); id = ike_sa->get_id(ike_sa);
+22 -5
View File
@@ -1238,10 +1238,10 @@ METHOD(ike_sa_manager_t, checkout_by_name, ike_sa_t*,
} }
/** /**
* enumerator filter function * enumerator filter function, waiting variant
*/ */
static bool enumerator_filter(private_ike_sa_manager_t *this, static bool enumerator_filter_wait(private_ike_sa_manager_t *this,
entry_t **in, ike_sa_t **out, u_int *segment) entry_t **in, ike_sa_t **out, u_int *segment)
{ {
if (wait_for_entry(this, *in, *segment)) if (wait_for_entry(this, *in, *segment))
{ {
@@ -1251,11 +1251,28 @@ static bool enumerator_filter(private_ike_sa_manager_t *this,
return FALSE; return FALSE;
} }
/**
* enumerator filter function, skipping variant
*/
static bool enumerator_filter_skip(private_ike_sa_manager_t *this,
entry_t **in, ike_sa_t **out, u_int *segment)
{
if (!(*in)->driveout_new_threads &&
!(*in)->driveout_waiting_threads &&
!(*in)->checked_out)
{
*out = (*in)->ike_sa;
return TRUE;
}
return FALSE;
}
METHOD(ike_sa_manager_t, create_enumerator, enumerator_t*, METHOD(ike_sa_manager_t, create_enumerator, enumerator_t*,
private_ike_sa_manager_t* this) private_ike_sa_manager_t* this, bool wait)
{ {
return enumerator_create_filter(create_table_enumerator(this), return enumerator_create_filter(create_table_enumerator(this),
(void*)enumerator_filter, this, NULL); wait ? (void*)enumerator_filter_wait : (void*)enumerator_filter_skip,
this, NULL);
} }
METHOD(ike_sa_manager_t, checkin, void, METHOD(ike_sa_manager_t, checkin, void,
+2 -1
View File
@@ -162,9 +162,10 @@ struct ike_sa_manager_t {
* While enumerating an IKE_SA, it is temporarily checked out and * While enumerating an IKE_SA, it is temporarily checked out and
* automatically checked in after the current enumeration step. * automatically checked in after the current enumeration step.
* *
* @param wait TRUE to wait for checked out SAs, FALSE to skip
* @return enumerator over all IKE_SAs. * @return enumerator over all IKE_SAs.
*/ */
enumerator_t *(*create_enumerator) (ike_sa_manager_t* this); enumerator_t *(*create_enumerator) (ike_sa_manager_t* this, bool wait);
/** /**
* Checkin the SA after usage. * Checkin the SA after usage.