summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2014-05-21 13:00:45 -0500
committerDan Williams <dcbw@redhat.com>2014-06-06 13:43:46 -0500
commitce3d2cf0e62982399506dce62651675f0d3cd66f (patch)
tree34f52ee6f6fa9eddc5e3cdd42fcaed9cf3e67a34
parentbeb5529c42a9dda3f7e234b6a1988209179f71d2 (diff)
downloadNetworkManager-ce3d2cf0e62982399506dce62651675f0d3cd66f.tar.gz
vpn: implement PRE_UP dispatcher actions
-rw-r--r--src/vpn-manager/nm-vpn-connection.c51
1 files changed, 38 insertions, 13 deletions
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index dea366be1b..f7476b411a 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -70,6 +70,7 @@ typedef enum {
STATE_NEED_AUTH,
STATE_CONNECT,
STATE_IP_CONFIG_GET,
+ STATE_PRE_UP,
STATE_ACTIVATED,
STATE_DEACTIVATING,
STATE_DISCONNECTED,
@@ -154,6 +155,7 @@ _state_to_nm_vpn_state (VpnState state)
case STATE_CONNECT:
return NM_VPN_CONNECTION_STATE_CONNECT;
case STATE_IP_CONFIG_GET:
+ case STATE_PRE_UP:
return NM_VPN_CONNECTION_STATE_IP_CONFIG_GET;
case STATE_ACTIVATED:
return NM_VPN_CONNECTION_STATE_ACTIVATED;
@@ -185,6 +187,7 @@ _state_to_ac_state (VpnState vpn_state)
case STATE_NEED_AUTH:
case STATE_CONNECT:
case STATE_IP_CONFIG_GET:
+ case STATE_PRE_UP:
return NM_ACTIVE_CONNECTION_STATE_ACTIVATING;
case STATE_ACTIVATED:
return NM_ACTIVE_CONNECTION_STATE_ACTIVATED;
@@ -257,6 +260,16 @@ dispatcher_pre_down_done (guint call_id, gpointer user_data)
}
static void
+dispatcher_pre_up_done (guint call_id, gpointer user_data)
+{
+ NMVPNConnection *self = NM_VPN_CONNECTION (user_data);
+ NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
+
+ priv->dispatcher_id = 0;
+ _set_vpn_state (self, STATE_ACTIVATED, NM_VPN_CONNECTION_STATE_REASON_NONE, FALSE);
+}
+
+static void
dispatcher_cleanup (NMVPNConnection *self)
{
NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (self);
@@ -330,6 +343,20 @@ _set_vpn_state (NMVPNConnection *connection,
* secrets.
*/
break;
+ case STATE_PRE_UP:
+ if (!nm_dispatcher_call_vpn (DISPATCHER_ACTION_VPN_PRE_UP,
+ priv->connection,
+ parent_dev,
+ priv->ip_iface,
+ priv->ip4_config,
+ priv->ip6_config,
+ dispatcher_pre_up_done,
+ connection,
+ &priv->dispatcher_id)) {
+ /* Just proceed on errors */
+ dispatcher_pre_up_done (0, connection);
+ }
+ break;
case STATE_ACTIVATED:
/* Secrets no longer needed now that we're connected */
nm_connection_clear_secrets (priv->connection);
@@ -625,6 +652,7 @@ static const char *state_table[] = {
[STATE_NEED_AUTH] = "need-auth",
[STATE_CONNECT] = "connect",
[STATE_IP_CONFIG_GET] = "ip-config-get",
+ [STATE_PRE_UP] = "pre-up",
[STATE_ACTIVATED] = "activated",
[STATE_DEACTIVATING] = "deactivating",
[STATE_DISCONNECTED] = "disconnected",
@@ -688,22 +716,13 @@ plugin_state_changed (DBusGProxy *proxy,
*/
nm_connection_clear_secrets (priv->connection);
- switch (priv->vpn_state) {
- case STATE_WAITING:
- case STATE_PREPARE:
- case STATE_NEED_AUTH:
- case STATE_CONNECT:
- case STATE_IP_CONFIG_GET:
- case STATE_ACTIVATED:
+ if ((priv->vpn_state >= STATE_WAITING) && (priv->vpn_state <= STATE_ACTIVATED)) {
nm_log_info (LOGD_VPN, "VPN plugin state change reason: %s (%d)",
vpn_reason_to_string (priv->failure_reason), priv->failure_reason);
_set_vpn_state (connection, STATE_FAILED, priv->failure_reason, FALSE);
/* Reset the failure reason */
priv->failure_reason = NM_VPN_CONNECTION_STATE_REASON_UNKNOWN;
- break;
- default:
- break;
}
}
}
@@ -868,7 +887,7 @@ nm_vpn_connection_apply_config (NMVPNConnection *connection)
nm_log_info (LOGD_VPN, "VPN connection '%s' (IP Config Get) complete.",
nm_connection_get_id (priv->connection));
- _set_vpn_state (connection, STATE_ACTIVATED, NM_VPN_CONNECTION_STATE_REASON_NONE, FALSE);
+ _set_vpn_state (connection, STATE_PRE_UP, NM_VPN_CONNECTION_STATE_REASON_NONE, FALSE);
return TRUE;
}
@@ -1941,6 +1960,12 @@ finalize (GObject *object)
G_OBJECT_CLASS (nm_vpn_connection_parent_class)->finalize (object);
}
+static gboolean
+ip_config_valid (VpnState state)
+{
+ return (state == STATE_PRE_UP || state == STATE_ACTIVATED);
+}
+
static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
@@ -1956,13 +1981,13 @@ get_property (GObject *object, guint prop_id,
g_value_set_string (value, priv->banner ? priv->banner : "");
break;
case PROP_IP4_CONFIG:
- if (priv->vpn_state == STATE_ACTIVATED && priv->ip4_config)
+ if (ip_config_valid (priv->vpn_state) && priv->ip4_config)
g_value_set_boxed (value, nm_ip4_config_get_dbus_path (priv->ip4_config));
else
g_value_set_boxed (value, "/");
break;
case PROP_IP6_CONFIG:
- if (priv->vpn_state == STATE_ACTIVATED && priv->ip6_config)
+ if (ip_config_valid (priv->vpn_state) && priv->ip6_config)
g_value_set_boxed (value, nm_ip6_config_get_dbus_path (priv->ip6_config));
else
g_value_set_boxed (value, "/");