use the new updown()/rekey() hooks to track the state of NetworkManager connections

This commit is contained in:
Martin Willi 2009-07-10 09:37:27 +02:00
parent 356cdc2d72
commit bad99d5aff
1 changed files with 49 additions and 41 deletions

View File

@ -140,21 +140,10 @@ static bool ike_state_change(listener_t *listener, ike_sa_t *ike_sa,
{
NMStrongswanPluginPrivate *private = (NMStrongswanPluginPrivate*)listener;
if (private->ike_sa == ike_sa)
if (private->ike_sa == ike_sa && state == IKE_DESTROYING)
{
switch (state)
{
case IKE_DESTROYING:
signal_failure(private->plugin,
NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED);
return FALSE;
case IKE_DELETING:
signal_failure(private->plugin,
NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED);
return FALSE;
default:
break;
}
signal_failure(private->plugin, NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED);
return FALSE;
}
return TRUE;
}
@ -166,37 +155,50 @@ static bool child_state_change(listener_t *listener, ike_sa_t *ike_sa,
child_sa_t *child_sa, child_sa_state_t state)
{
NMStrongswanPluginPrivate *private = (NMStrongswanPluginPrivate*)listener;
if (private->ike_sa == ike_sa && state == IKE_DESTROYING)
{
signal_failure(private->plugin, NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED);
return FALSE;
}
return TRUE;
}
/**
* Implementation of listener_t.child_updown
*/
static bool child_updown(listener_t *listener, ike_sa_t *ike_sa,
child_sa_t *child_sa, bool up)
{
NMStrongswanPluginPrivate *private = (NMStrongswanPluginPrivate*)listener;
if (private->ike_sa == ike_sa)
{
switch (state)
if (up)
{ /* disable initiate-failure-detection hooks */
private->listener.ike_state_change = NULL;
private->listener.child_state_change = NULL;
signal_ipv4_config(private->plugin, ike_sa, child_sa);
}
else
{
case CHILD_INSTALLED:
signal_ipv4_config(private->plugin, ike_sa, child_sa);
listener->child_state_change = NULL;
break;
case CHILD_DESTROYING:
signal_failure(private->plugin,
NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED);
return FALSE;
default:
break;
signal_failure(private->plugin, NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED);
return FALSE;
}
}
return TRUE;
}
/**
* Implementation of listener_t.ike_keys
* Implementation of listener_t.ike_rekey
*/
static bool ike_keys(listener_t *listener, ike_sa_t *ike_sa, diffie_hellman_t *dh,
chunk_t nonce_i, chunk_t nonce_r, ike_sa_t *rekey)
static bool ike_rekey(listener_t *listener, ike_sa_t *old, ike_sa_t *new)
{
NMStrongswanPluginPrivate *private = (NMStrongswanPluginPrivate*)listener;
if (rekey && private->ike_sa == ike_sa)
if (private->ike_sa == old)
{ /* follow a rekeyed IKE_SA */
private->ike_sa = rekey;
private->ike_sa = new;
}
return TRUE;
}
@ -436,7 +438,7 @@ static gboolean connect_(NMVPNPlugin *plugin, NMConnection *connection,
peer_cfg->add_child_cfg(peer_cfg, child_cfg);
/**
* Start to initiate
* Prepare IKE_SA
*/
ike_sa = charon->ike_sa_manager->checkout_by_config(charon->ike_sa_manager,
peer_cfg);
@ -448,22 +450,28 @@ static gboolean connect_(NMVPNPlugin *plugin, NMConnection *connection,
{
peer_cfg->destroy(peer_cfg);
}
/**
* Register listener, enable initiate-failure-detection hooks
*/
NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin)->ike_sa = ike_sa;
listener = &NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin)->listener;
listener->ike_state_change = ike_state_change;
listener->child_state_change = child_state_change;
charon->bus->add_listener(charon->bus, listener);
/**
* Initiate
*/
if (ike_sa->initiate(ike_sa, child_cfg, 0, NULL, NULL) != SUCCESS)
{
charon->bus->remove_listener(charon->bus, listener);
charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, ike_sa);
g_set_error(err, NM_VPN_PLUGIN_ERROR, NM_VPN_PLUGIN_ERROR_LAUNCH_FAILED,
"Initiating failed.");
return FALSE;
}
/**
* Register listener
*/
NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin)->ike_sa = ike_sa;
listener = &NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin)->listener;
listener->child_state_change = child_state_change;
charon->bus->add_listener(charon->bus, listener);
charon->ike_sa_manager->checkin(charon->ike_sa_manager, ike_sa);
return TRUE;
}
@ -558,8 +566,8 @@ static void nm_strongswan_plugin_init(NMStrongswanPlugin *plugin)
private = NM_STRONGSWAN_PLUGIN_GET_PRIVATE(plugin);
private->plugin = NM_VPN_PLUGIN(plugin);
memset(&private->listener.log, 0, sizeof(listener_t));
private->listener.ike_state_change = ike_state_change;
private->listener.ike_keys = ike_keys;
private->listener.child_updown = child_updown;
private->listener.ike_rekey = ike_rekey;
}
/**