controller: Use the CHILD_SA unique_id to terminate CHILD_SAs

This commit is contained in:
Martin Willi
2015-02-20 13:34:50 +01:00
parent e4a131b1ce
commit 971a91685d
6 changed files with 24 additions and 38 deletions
+1 -1
View File
@@ -236,7 +236,7 @@ static job_requeue_t close_child(char *config)
{ {
if (streq(config, child_sa->get_name(child_sa))) if (streq(config, child_sa->get_name(child_sa)))
{ {
id = child_sa->get_reqid(child_sa); id = child_sa->get_unique_id(child_sa);
break; break;
} }
} }
+8 -22
View File
@@ -534,17 +534,15 @@ METHOD(job_t, terminate_child_execute, job_requeue_t,
interface_job_t *job) interface_job_t *job)
{ {
interface_listener_t *listener = &job->listener; interface_listener_t *listener = &job->listener;
u_int32_t reqid = listener->id; u_int32_t id = listener->id;
enumerator_t *enumerator;
child_sa_t *child_sa; child_sa_t *child_sa;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
ike_sa = charon->ike_sa_manager->checkout_by_id(charon->ike_sa_manager, ike_sa = charon->child_sa_manager->checkout_by_id(charon->child_sa_manager,
reqid, TRUE); id, &child_sa);
if (!ike_sa) if (!ike_sa)
{ {
DBG1(DBG_IKE, "unable to terminate, CHILD_SA with ID %d not found", DBG1(DBG_IKE, "unable to terminate, CHILD_SA with ID %d not found", id);
reqid);
listener->status = NOT_FOUND; listener->status = NOT_FOUND;
/* release listener */ /* release listener */
listener_done(listener); listener_done(listener);
@@ -554,22 +552,10 @@ METHOD(job_t, terminate_child_execute, job_requeue_t,
listener->ike_sa = ike_sa; listener->ike_sa = ike_sa;
listener->lock->unlock(listener->lock); listener->lock->unlock(listener->lock);
enumerator = ike_sa->create_child_sa_enumerator(ike_sa); if (child_sa->get_state(child_sa) == CHILD_ROUTED)
while (enumerator->enumerate(enumerator, (void**)&child_sa))
{
if (child_sa->get_state(child_sa) != CHILD_ROUTED &&
child_sa->get_reqid(child_sa) == reqid)
{
break;
}
child_sa = NULL;
}
enumerator->destroy(enumerator);
if (!child_sa)
{ {
DBG1(DBG_IKE, "unable to terminate, established " DBG1(DBG_IKE, "unable to terminate, established "
"CHILD_SA with ID %d not found", reqid); "CHILD_SA with ID %d not found", id);
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa); charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
listener->status = NOT_FOUND; listener->status = NOT_FOUND;
/* release listener */ /* release listener */
@@ -596,7 +582,7 @@ METHOD(job_t, terminate_child_execute, job_requeue_t,
} }
METHOD(controller_t, terminate_child, status_t, METHOD(controller_t, terminate_child, status_t,
controller_t *this, u_int32_t reqid, controller_t *this, u_int32_t unique_id,
controller_cb_t callback, void *param, u_int timeout) controller_cb_t callback, void *param, u_int timeout)
{ {
interface_job_t *job; interface_job_t *job;
@@ -617,7 +603,7 @@ METHOD(controller_t, terminate_child, status_t,
.param = param, .param = param,
}, },
.status = FAILED, .status = FAILED,
.id = reqid, .id = unique_id,
.lock = spinlock_create(), .lock = spinlock_create(),
}, },
.public = { .public = {
+2 -2
View File
@@ -118,7 +118,7 @@ struct controller_t {
* If a callback is provided the function is synchronous and thus blocks * If a callback is provided the function is synchronous and thus blocks
* until the CHILD_SA is properly deleted, or the call timed out. * until the CHILD_SA is properly deleted, or the call timed out.
* *
* @param reqid reqid of the CHILD_SA to terminate * @param unique_id CHILD_SA unique ID to terminate
* @param cb logging callback * @param cb logging callback
* @param param parameter to include in each call of cb * @param param parameter to include in each call of cb
* @param timeout timeout in ms to wait for callbacks, 0 to disable * @param timeout timeout in ms to wait for callbacks, 0 to disable
@@ -128,7 +128,7 @@ struct controller_t {
* - NEED_MORE, if callback returned FALSE * - NEED_MORE, if callback returned FALSE
* - OUT_OF_RES if timed out * - OUT_OF_RES if timed out
*/ */
status_t (*terminate_child)(controller_t *this, u_int32_t reqid, status_t (*terminate_child)(controller_t *this, u_int32_t unique_id,
controller_cb_t callback, void *param, controller_cb_t callback, void *param,
u_int timeout); u_int timeout);
@@ -352,7 +352,7 @@ METHOD(stroke_control_t, terminate, void,
if (streq(name, child_sa->get_name(child_sa))) if (streq(name, child_sa->get_name(child_sa)))
{ {
child_list->insert_last(child_list, child_list->insert_last(child_list,
(void*)(uintptr_t)child_sa->get_reqid(child_sa)); (void*)(uintptr_t)child_sa->get_unique_id(child_sa));
if (!all) if (!all)
{ {
break; break;
+10 -10
View File
@@ -1551,8 +1551,8 @@ static void clear_start_action(private_vici_config_t *this,
enumerator_t *enumerator, *children; enumerator_t *enumerator, *children;
child_sa_t *child_sa; child_sa_t *child_sa;
ike_sa_t *ike_sa; ike_sa_t *ike_sa;
u_int32_t reqid = 0, *del; u_int32_t id = 0, *del;
array_t *reqids = NULL; array_t *ids = NULL;
char *name; char *name;
name = child_cfg->get_name(child_cfg); name = child_cfg->get_name(child_cfg);
@@ -1568,23 +1568,23 @@ static void clear_start_action(private_vici_config_t *this,
{ {
if (streq(name, child_sa->get_name(child_sa))) if (streq(name, child_sa->get_name(child_sa)))
{ {
reqid = child_sa->get_reqid(child_sa); id = child_sa->get_unique_id(child_sa);
array_insert_create(&reqids, ARRAY_TAIL, &reqid); array_insert_create(&ids, ARRAY_TAIL, &id);
} }
} }
children->destroy(children); children->destroy(children);
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
if (array_count(reqids)) if (array_count(ids))
{ {
while (array_remove(reqids, ARRAY_HEAD, &del)) while (array_remove(ids, ARRAY_HEAD, &del))
{ {
DBG1(DBG_CFG, "closing '%s' #%u", name, *del); DBG1(DBG_CFG, "closing '%s' #%u", name, *del);
charon->controller->terminate_child(charon->controller, charon->controller->terminate_child(charon->controller,
*del, NULL, NULL, 0); *del, NULL, NULL, 0);
} }
array_destroy(reqids); array_destroy(ids);
} }
break; break;
case ACTION_ROUTE: case ACTION_ROUTE:
@@ -1601,14 +1601,14 @@ static void clear_start_action(private_vici_config_t *this,
{ {
if (streq(name, child_sa->get_name(child_sa))) if (streq(name, child_sa->get_name(child_sa)))
{ {
reqid = child_sa->get_reqid(child_sa); id = child_sa->get_reqid(child_sa);
break; break;
} }
} }
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
if (reqid) if (id)
{ {
charon->traps->uninstall(charon->traps, reqid); charon->traps->uninstall(charon->traps, id);
} }
break; break;
} }
+2 -2
View File
@@ -264,11 +264,11 @@ CALLBACK(terminate, vici_message_t*,
{ {
continue; continue;
} }
if (child_id && child_sa->get_reqid(child_sa) != child_id) if (child_id && child_sa->get_unique_id(child_sa) != child_id)
{ {
continue; continue;
} }
current = child_sa->get_reqid(child_sa); current = child_sa->get_unique_id(child_sa);
array_insert(ids, ARRAY_TAIL, &current); array_insert(ids, ARRAY_TAIL, &current);
} }
csas->destroy(csas); csas->destroy(csas);