aboutsummaryrefslogtreecommitdiffstats
path: root/src/libcharon/sa
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2011-05-02 15:28:33 +0200
committerMartin Willi <martin@revosec.ch>2011-05-16 15:24:13 +0200
commit69c3eca0e9681905c4e89695475d82a22bd6bafa (patch)
treed8417f6676a2b3bce87539ca160f2686883e3b21 /src/libcharon/sa
parent3f064037054a278065f8dd75429457d63da2eb07 (diff)
downloadstrongswan-69c3eca0e9681905c4e89695475d82a22bd6bafa.tar.bz2
strongswan-69c3eca0e9681905c4e89695475d82a22bd6bafa.tar.xz
Added a non-blocking, skipping variant of IKE_SA enumerator
Diffstat (limited to 'src/libcharon/sa')
-rw-r--r--src/libcharon/sa/ike_sa_manager.c27
-rw-r--r--src/libcharon/sa/ike_sa_manager.h3
2 files changed, 24 insertions, 6 deletions
diff --git a/src/libcharon/sa/ike_sa_manager.c b/src/libcharon/sa/ike_sa_manager.c
index d695c7f7c..891bb8e09 100644
--- a/src/libcharon/sa/ike_sa_manager.c
+++ b/src/libcharon/sa/ike_sa_manager.c
@@ -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,
- entry_t **in, ike_sa_t **out, u_int *segment)
+static bool enumerator_filter_wait(private_ike_sa_manager_t *this,
+ entry_t **in, ike_sa_t **out, u_int *segment)
{
if (wait_for_entry(this, *in, *segment))
{
@@ -1251,11 +1251,28 @@ static bool enumerator_filter(private_ike_sa_manager_t *this,
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*,
- private_ike_sa_manager_t* this)
+ private_ike_sa_manager_t* this, bool wait)
{
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,
diff --git a/src/libcharon/sa/ike_sa_manager.h b/src/libcharon/sa/ike_sa_manager.h
index ec157ab3a..315e23592 100644
--- a/src/libcharon/sa/ike_sa_manager.h
+++ b/src/libcharon/sa/ike_sa_manager.h
@@ -162,9 +162,10 @@ struct ike_sa_manager_t {
* While enumerating an IKE_SA, it is temporarily checked out and
* 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.
*/
- 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.