trap-manager: add a method to find reqid for installed traps by config

This commit is contained in:
Martin Willi
2013-06-19 16:30:40 +02:00
parent f4e822c1b4
commit 2dcfc6983b
2 changed files with 38 additions and 2 deletions
+30 -2
View File
@@ -142,6 +142,8 @@ METHOD(trap_manager_t, install, u_int32_t,
} }
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
this->lock->unlock(this->lock);
if (found) if (found)
{ /* config might have changed so update everything */ { /* config might have changed so update everything */
DBG1(DBG_CFG, "updating already routed CHILD_SA '%s'", DBG1(DBG_CFG, "updating already routed CHILD_SA '%s'",
@@ -180,10 +182,11 @@ METHOD(trap_manager_t, install, u_int32_t,
.child_sa = child_sa, .child_sa = child_sa,
.peer_cfg = peer->get_ref(peer), .peer_cfg = peer->get_ref(peer),
); );
this->lock->write_lock(this->lock);
this->traps->insert_last(this->traps, entry); this->traps->insert_last(this->traps, entry);
this->lock->unlock(this->lock);
reqid = child_sa->get_reqid(child_sa); reqid = child_sa->get_reqid(child_sa);
} }
this->lock->unlock(this->lock);
if (status != SUCCESS) if (status != SUCCESS)
{ {
@@ -252,6 +255,31 @@ METHOD(trap_manager_t, create_enumerator, enumerator_t*,
(void*)this->lock->unlock); (void*)this->lock->unlock);
} }
METHOD(trap_manager_t, find_reqid, u_int32_t,
private_trap_manager_t *this, child_cfg_t *child)
{
enumerator_t *enumerator;
child_cfg_t *current;
entry_t *entry;
u_int32_t reqid = 0;
this->lock->read_lock(this->lock);
enumerator = this->traps->create_enumerator(this->traps);
while (enumerator->enumerate(enumerator, &entry))
{
current = entry->child_sa->get_config(entry->child_sa);
if (streq(current->get_name(current), child->get_name(child)))
{
reqid = entry->child_sa->get_reqid(entry->child_sa);
break;
}
}
enumerator->destroy(enumerator);
this->lock->unlock(this->lock);
return reqid;
}
METHOD(trap_manager_t, acquire, void, METHOD(trap_manager_t, acquire, void,
private_trap_manager_t *this, u_int32_t reqid, private_trap_manager_t *this, u_int32_t reqid,
traffic_selector_t *src, traffic_selector_t *dst) traffic_selector_t *src, traffic_selector_t *dst)
@@ -417,6 +445,7 @@ trap_manager_t *trap_manager_create(void)
.install = _install, .install = _install,
.uninstall = _uninstall, .uninstall = _uninstall,
.create_enumerator = _create_enumerator, .create_enumerator = _create_enumerator,
.find_reqid = _find_reqid,
.acquire = _acquire, .acquire = _acquire,
.flush = _flush, .flush = _flush,
.destroy = _destroy, .destroy = _destroy,
@@ -435,4 +464,3 @@ trap_manager_t *trap_manager_create(void)
return &this->public; return &this->public;
} }
+8
View File
@@ -57,6 +57,14 @@ struct trap_manager_t {
*/ */
enumerator_t* (*create_enumerator)(trap_manager_t *this); enumerator_t* (*create_enumerator)(trap_manager_t *this);
/**
* Find the reqid of a child config installed as a trap.
*
* @param child CHILD_SA config to get the reqid for
* @return reqid of trap, 0 if not found
*/
u_int32_t (*find_reqid)(trap_manager_t *this, child_cfg_t *child);
/** /**
* Acquire an SA triggered by an installed trap. * Acquire an SA triggered by an installed trap.
* *