initiate or route child configs which don't have a peer config of the same name
This commit is contained in:
@@ -95,17 +95,15 @@ static child_cfg_t* get_child_from_peer(peer_cfg_t *peer_cfg, char *name)
|
|||||||
METHOD(stroke_control_t, initiate, void,
|
METHOD(stroke_control_t, initiate, void,
|
||||||
private_stroke_control_t *this, stroke_msg_t *msg, FILE *out)
|
private_stroke_control_t *this, stroke_msg_t *msg, FILE *out)
|
||||||
{
|
{
|
||||||
|
child_cfg_t *child_cfg = NULL;
|
||||||
peer_cfg_t *peer_cfg;
|
peer_cfg_t *peer_cfg;
|
||||||
child_cfg_t *child_cfg;
|
enumerator_t *enumerator;
|
||||||
stroke_log_info_t info;
|
stroke_log_info_t info;
|
||||||
|
|
||||||
peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends,
|
peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends,
|
||||||
msg->initiate.name);
|
msg->initiate.name);
|
||||||
if (peer_cfg == NULL)
|
if (peer_cfg)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "no config named '%s'\n", msg->initiate.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "ignoring initiation request for IKEv%d config",
|
DBG1(DBG_CFG, "ignoring initiation request for IKEv%d config",
|
||||||
@@ -117,10 +115,38 @@ METHOD(stroke_control_t, initiate, void,
|
|||||||
child_cfg = get_child_from_peer(peer_cfg, msg->initiate.name);
|
child_cfg = get_child_from_peer(peer_cfg, msg->initiate.name);
|
||||||
if (child_cfg == NULL)
|
if (child_cfg == NULL)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "no child config named '%s'\n", msg->initiate.name);
|
DBG1(DBG_CFG, "no child config named '%s'", msg->initiate.name);
|
||||||
|
fprintf(out, "no child config named '%s'\n", msg->initiate.name);
|
||||||
peer_cfg->destroy(peer_cfg);
|
peer_cfg->destroy(peer_cfg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
enumerator = charon->backends->create_peer_cfg_enumerator(charon->backends,
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
while (enumerator->enumerate(enumerator, &peer_cfg))
|
||||||
|
{
|
||||||
|
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child_cfg = get_child_from_peer(peer_cfg, msg->initiate.name);
|
||||||
|
if (child_cfg)
|
||||||
|
{
|
||||||
|
peer_cfg->get_ref(peer_cfg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
if (child_cfg == NULL)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "no config named '%s'", msg->initiate.name);
|
||||||
|
fprintf(out, "no config named '%s'\n", msg->initiate.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (msg->output_verbosity < 0)
|
if (msg->output_verbosity < 0)
|
||||||
{
|
{
|
||||||
@@ -473,18 +499,18 @@ METHOD(stroke_control_t, purge_ike, void,
|
|||||||
METHOD(stroke_control_t, route, void,
|
METHOD(stroke_control_t, route, void,
|
||||||
private_stroke_control_t *this, stroke_msg_t *msg, FILE *out)
|
private_stroke_control_t *this, stroke_msg_t *msg, FILE *out)
|
||||||
{
|
{
|
||||||
|
child_cfg_t *child_cfg = NULL;
|
||||||
peer_cfg_t *peer_cfg;
|
peer_cfg_t *peer_cfg;
|
||||||
child_cfg_t *child_cfg;
|
enumerator_t *enumerator;
|
||||||
|
|
||||||
peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends,
|
peer_cfg = charon->backends->get_peer_cfg_by_name(charon->backends,
|
||||||
msg->route.name);
|
msg->route.name);
|
||||||
if (peer_cfg == NULL)
|
if (peer_cfg)
|
||||||
{
|
{
|
||||||
fprintf(out, "no config named '%s'\n", msg->route.name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
||||||
{
|
{
|
||||||
|
DBG1(DBG_CFG, "ignoring initiation request for IKEv%d config",
|
||||||
|
peer_cfg->get_ike_version(peer_cfg));
|
||||||
peer_cfg->destroy(peer_cfg);
|
peer_cfg->destroy(peer_cfg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -492,18 +518,46 @@ METHOD(stroke_control_t, route, void,
|
|||||||
child_cfg = get_child_from_peer(peer_cfg, msg->route.name);
|
child_cfg = get_child_from_peer(peer_cfg, msg->route.name);
|
||||||
if (child_cfg == NULL)
|
if (child_cfg == NULL)
|
||||||
{
|
{
|
||||||
|
DBG1(DBG_CFG, "no child config named '%s'", msg->route.name);
|
||||||
fprintf(out, "no child config named '%s'\n", msg->route.name);
|
fprintf(out, "no child config named '%s'\n", msg->route.name);
|
||||||
peer_cfg->destroy(peer_cfg);
|
peer_cfg->destroy(peer_cfg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (charon->traps->install(charon->traps, peer_cfg, child_cfg))
|
|
||||||
{
|
|
||||||
fprintf(out, "configuration '%s' routed\n", msg->route.name);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(out, "routing configuration '%s' failed\n", msg->route.name);
|
enumerator = charon->backends->create_peer_cfg_enumerator(charon->backends,
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
while (enumerator->enumerate(enumerator, &peer_cfg))
|
||||||
|
{
|
||||||
|
if (peer_cfg->get_ike_version(peer_cfg) != 2)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
child_cfg = get_child_from_peer(peer_cfg, msg->route.name);
|
||||||
|
if (child_cfg)
|
||||||
|
{
|
||||||
|
peer_cfg->get_ref(peer_cfg);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
|
if (child_cfg == NULL)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "no config named '%s'", msg->route.name);
|
||||||
|
fprintf(out, "no config named '%s'\n", msg->route.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (charon->traps->install(charon->traps, peer_cfg, child_cfg))
|
||||||
|
{
|
||||||
|
fprintf(out, "'%s' routed\n", msg->route.name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(out, "routing '%s' failed\n", msg->route.name);
|
||||||
}
|
}
|
||||||
peer_cfg->destroy(peer_cfg);
|
peer_cfg->destroy(peer_cfg);
|
||||||
child_cfg->destroy(child_cfg);
|
child_cfg->destroy(child_cfg);
|
||||||
|
|||||||
Reference in New Issue
Block a user