From fe2fb7137c2fec59222db890d516a81a16cc0a60 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 19 Dec 2013 09:11:20 -0500 Subject: [PATCH 1/4] introspection: wrap long lines in nm-active-connection.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jiří Klimeš --- introspection/nm-active-connection.xml | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/introspection/nm-active-connection.xml b/introspection/nm-active-connection.xml index b6a3c48..d77f0d0 100644 --- a/introspection/nm-active-connection.xml +++ b/introspection/nm-active-connection.xml @@ -11,7 +11,9 @@ - The path of the connection. + + The path of the connection. + @@ -27,22 +29,37 @@ - Array of object paths representing devices which are part of this active connection. + + Array of object paths representing devices which are part of this active + connection. + - The state of this active connection. + + The state of this active connection. + - Whether this active connection is the default IPv4 connection, i.e. whether it currently owns the default IPv4 route. + + Whether this active connection is the default IPv4 connection, i.e. + whether it currently owns the default IPv4 route. + - Whether this active connection is the default IPv6 connection, i.e. whether it currently owns the default IPv6 route. + + Whether this active connection is the default IPv6 connection, i.e. + whether it currently owns the default IPv6 route. + - Whether this active connection is also a VPN connection. + + Whether this active connection is also a VPN connection. + - The path to the master device if the connection is a slave. + + The path to the master device if the connection is a slave. + -- 1.7.11.7 From f642e88afd2bf585036ca8af54c81976cd2f259b Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 18 Dec 2013 08:46:43 -0500 Subject: [PATCH 2/4] core: add IP/DHCP config properties to o.fd.NM.Connection.Active MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add IP and DHCP config properties to the D-Bus ActiveConnection objects. For device connections, this is redundant with the properties already on the Device object, but for VPN connections, this information was not previously available. Signed-off-by: Jiří Klimeš --- introspection/nm-active-connection.xml | 30 ++++++++++++++ src/nm-activation-request.c | 71 ++++++++++++++++++++++++++++++++++ src/nm-active-connection.c | 53 +++++++++++++++++++++++++ src/nm-active-connection.h | 4 ++ src/vpn-manager/nm-vpn-connection.c | 23 +++++++++++ 5 files changed, 181 insertions(+) diff --git a/introspection/nm-active-connection.xml b/introspection/nm-active-connection.xml index d77f0d0..56a1013 100644 --- a/introspection/nm-active-connection.xml +++ b/introspection/nm-active-connection.xml @@ -45,12 +45,42 @@ whether it currently owns the default IPv4 route. + + + Object path of the Ip4Config object describing the configuration of the + connection. Only valid when the connection is in the + NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. + + + + + Object path of the Dhcp4Config object describing the DHCP options + returned by the DHCP server (assuming the connection used DHCP). Only + valid when the connection is in the NM_ACTIVE_CONNECTION_STATE_ACTIVATED + state. + + Whether this active connection is the default IPv6 connection, i.e. whether it currently owns the default IPv6 route. + + + Object path of the Ip6Config object describing the configuration of the + connection. Only valid when the connection is in the + NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. + + + + + Object path of the Dhcp6Config object describing the DHCP options + returned by the DHCP server (assuming the connection used DHCP). Only + valid when the connection is in the NM_ACTIVE_CONNECTION_STATE_ACTIVATED + state. + + Whether this active connection is also a VPN connection. diff --git a/src/nm-activation-request.c b/src/nm-activation-request.c index 0f3c91e..5fa0fc3 100644 --- a/src/nm-activation-request.c +++ b/src/nm-activation-request.c @@ -56,6 +56,16 @@ typedef struct { GSList *share_rules; } NMActRequestPrivate; +enum { + PROP_0, + PROP_IP4_CONFIG, + PROP_DHCP4_CONFIG, + PROP_IP6_CONFIG, + PROP_DHCP6_CONFIG, + + LAST_PROP +}; + /*******************************************************************/ NMConnection * @@ -282,6 +292,14 @@ nm_act_request_add_share_rule (NMActRequest *req, /********************************************************************/ static void +device_notify (GObject *object, + GParamSpec *pspec, + gpointer self) +{ + g_object_notify (self, pspec->name); +} + +static void device_state_changed (NMDevice *device, GParamSpec *pspec, NMActRequest *self) { NMActRequestPrivate *priv = NM_ACT_REQUEST_GET_PRIVATE (self); @@ -301,6 +319,15 @@ device_state_changed (NMActiveConnection *active, break; case NM_DEVICE_STATE_ACTIVATED: ac_state = NM_ACTIVE_CONNECTION_STATE_ACTIVATED; + + g_signal_connect (device, "notify::" NM_DEVICE_IP4_CONFIG, + G_CALLBACK (device_notify), NM_ACTIVE_CONNECTION (self)); + g_signal_connect (device, "notify::" NM_DEVICE_DHCP4_CONFIG, + G_CALLBACK (device_notify), NM_ACTIVE_CONNECTION (self)); + g_signal_connect (device, "notify::" NM_DEVICE_IP6_CONFIG, + G_CALLBACK (device_notify), NM_ACTIVE_CONNECTION (self)); + g_signal_connect (device, "notify::" NM_DEVICE_DHCP6_CONFIG, + G_CALLBACK (device_notify), NM_ACTIVE_CONNECTION (self)); break; case NM_DEVICE_STATE_DEACTIVATING: ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATING; @@ -310,6 +337,8 @@ device_state_changed (NMActiveConnection *active, case NM_DEVICE_STATE_UNAVAILABLE: ac_state = NM_ACTIVE_CONNECTION_STATE_DEACTIVATED; + g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_notify), NM_ACTIVE_CONNECTION (self)); + /* No longer need to pay attention to device state */ if (priv->device && priv->device_state_id) { g_signal_handler_disconnect (priv->device, priv->device_state_id); @@ -414,6 +443,37 @@ dispose (GObject *object) } static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + NMDevice *device; + + device = nm_active_connection_get_device (NM_ACTIVE_CONNECTION (object)); + if (!device) { + g_value_set_boxed (value, "/"); + return; + } + + switch (prop_id) { + case PROP_IP4_CONFIG: + g_object_get_property (G_OBJECT (device), NM_DEVICE_IP4_CONFIG, value); + break; + case PROP_DHCP4_CONFIG: + g_object_get_property (G_OBJECT (device), NM_DEVICE_DHCP4_CONFIG, value); + break; + case PROP_IP6_CONFIG: + g_object_get_property (G_OBJECT (device), NM_DEVICE_IP6_CONFIG, value); + break; + case PROP_DHCP6_CONFIG: + g_object_get_property (G_OBJECT (device), NM_DEVICE_DHCP6_CONFIG, value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void nm_act_request_class_init (NMActRequestClass *req_class) { GObjectClass *object_class = G_OBJECT_CLASS (req_class); @@ -423,5 +483,16 @@ nm_act_request_class_init (NMActRequestClass *req_class) /* virtual methods */ object_class->constructed = constructed; object_class->dispose = dispose; + object_class->get_property = get_property; + + /* properties */ + g_object_class_override_property (object_class, PROP_IP4_CONFIG, + NM_ACTIVE_CONNECTION_IP4_CONFIG); + g_object_class_override_property (object_class, PROP_DHCP4_CONFIG, + NM_ACTIVE_CONNECTION_DHCP4_CONFIG); + g_object_class_override_property (object_class, PROP_IP6_CONFIG, + NM_ACTIVE_CONNECTION_IP6_CONFIG); + g_object_class_override_property (object_class, PROP_DHCP6_CONFIG, + NM_ACTIVE_CONNECTION_DHCP6_CONFIG); } diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index a8a422c..3631470 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -74,7 +74,11 @@ enum { PROP_DEVICES, PROP_STATE, PROP_DEFAULT, + PROP_IP4_CONFIG, + PROP_DHCP4_CONFIG, PROP_DEFAULT6, + PROP_IP6_CONFIG, + PROP_DHCP6_CONFIG, PROP_VPN, PROP_MASTER, @@ -152,6 +156,14 @@ nm_active_connection_set_state (NMActiveConnection *self, } } + if ( new_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED + || old_state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) { + g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_IP4_CONFIG); + g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DHCP4_CONFIG); + g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_IP6_CONFIG); + g_object_notify (G_OBJECT (self), NM_ACTIVE_CONNECTION_DHCP6_CONFIG); + } + if (priv->state == NM_ACTIVE_CONNECTION_STATE_DEACTIVATED) { /* Device is no longer relevant when deactivated */ g_clear_object (&priv->device); @@ -712,9 +724,22 @@ get_property (GObject *object, guint prop_id, case PROP_DEFAULT: g_value_set_boolean (value, priv->is_default); break; + case PROP_IP4_CONFIG: + /* The IP and DHCP config properties may be overridden by a subclass */ + g_value_set_boxed (value, "/"); + break; + case PROP_DHCP4_CONFIG: + g_value_set_boxed (value, "/"); + break; case PROP_DEFAULT6: g_value_set_boolean (value, priv->is_default6); break; + case PROP_IP6_CONFIG: + g_value_set_boxed (value, "/"); + break; + case PROP_DHCP6_CONFIG: + g_value_set_boxed (value, "/"); + break; case PROP_VPN: g_value_set_boolean (value, priv->vpn); break; @@ -838,6 +863,20 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_IP4_CONFIG, + g_param_spec_boxed (NM_ACTIVE_CONNECTION_IP4_CONFIG, + "IP4 Config", + "IP4 Config", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, PROP_DHCP4_CONFIG, + g_param_spec_boxed (NM_ACTIVE_CONNECTION_DHCP4_CONFIG, + "DHCP4 Config", + "DHCP4 Config", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_DEFAULT6, g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT6, "Default6", @@ -845,6 +884,20 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) FALSE, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_IP6_CONFIG, + g_param_spec_boxed (NM_ACTIVE_CONNECTION_IP6_CONFIG, + "IP6 Config", + "IP6 Config", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, PROP_DHCP6_CONFIG, + g_param_spec_boxed (NM_ACTIVE_CONNECTION_DHCP6_CONFIG, + "DHCP6 Config", + "DHCP6 Config", + DBUS_TYPE_G_OBJECT_PATH, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_VPN, g_param_spec_boolean (NM_ACTIVE_CONNECTION_VPN, "VPN", diff --git a/src/nm-active-connection.h b/src/nm-active-connection.h index 43b76bd..2a4df97 100644 --- a/src/nm-active-connection.h +++ b/src/nm-active-connection.h @@ -40,7 +40,11 @@ #define NM_ACTIVE_CONNECTION_DEVICES "devices" #define NM_ACTIVE_CONNECTION_STATE "state" #define NM_ACTIVE_CONNECTION_DEFAULT "default" +#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config" +#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config" #define NM_ACTIVE_CONNECTION_DEFAULT6 "default6" +#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config" +#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config" #define NM_ACTIVE_CONNECTION_VPN "vpn" #define NM_ACTIVE_CONNECTION_MASTER "master" diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c index 500c72b..a4bc431 100644 --- a/src/vpn-manager/nm-vpn-connection.c +++ b/src/vpn-manager/nm-vpn-connection.c @@ -105,6 +105,8 @@ enum { PROP_0, PROP_VPN_STATE, PROP_BANNER, + PROP_IP4_CONFIG, + PROP_IP6_CONFIG, PROP_MASTER = 2000, LAST_PROP @@ -1011,6 +1013,8 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy, nm_ip4_config_merge_setting (config, nm_connection_get_setting_ip4_config (priv->connection)); priv->ip4_config = config; + nm_ip4_config_export (config); + g_object_notify (G_OBJECT (connection), NM_ACTIVE_CONNECTION_IP4_CONFIG); nm_vpn_connection_config_maybe_complete (connection, TRUE); } @@ -1152,6 +1156,8 @@ nm_vpn_connection_ip6_config_get (DBusGProxy *proxy, nm_ip6_config_merge_setting (config, nm_connection_get_setting_ip6_config (priv->connection)); priv->ip6_config = config; + nm_ip6_config_export (config); + g_object_notify (G_OBJECT (connection), NM_ACTIVE_CONNECTION_IP6_CONFIG); nm_vpn_connection_config_maybe_complete (connection, TRUE); } @@ -1787,6 +1793,18 @@ get_property (GObject *object, guint prop_id, case PROP_BANNER: g_value_set_string (value, priv->banner ? priv->banner : ""); break; + case PROP_IP4_CONFIG: + if (priv->vpn_state == NM_VPN_CONNECTION_STATE_ACTIVATED && 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 == NM_VPN_CONNECTION_STATE_ACTIVATED && priv->ip6_config) + g_value_set_boxed (value, nm_ip6_config_get_dbus_path (priv->ip6_config)); + else + g_value_set_boxed (value, "/"); + break; case PROP_MASTER: g_value_set_boxed (value, nm_device_get_path (priv->parent_dev)); break; @@ -1832,6 +1850,11 @@ nm_vpn_connection_class_init (NMVPNConnectionClass *connection_class) NULL, G_PARAM_READABLE)); + g_object_class_override_property (object_class, PROP_IP4_CONFIG, + NM_ACTIVE_CONNECTION_IP4_CONFIG); + g_object_class_override_property (object_class, PROP_IP6_CONFIG, + NM_ACTIVE_CONNECTION_IP6_CONFIG); + /* signals */ signals[VPN_STATE_CHANGED] = g_signal_new ("vpn-state-changed", -- 1.7.11.7 From 4783f43c530ba7b8d045a1d66001af4ac6463dd4 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 18 Dec 2013 10:56:09 -0500 Subject: [PATCH 3/4] libnm-glib: expose new NMActiveConnection IP/DHCP config properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jiří Klimeš --- libnm-glib/libnm-glib.ver | 4 + libnm-glib/nm-active-connection.c | 184 ++++++++++++++++++++++++++++++++++++-- libnm-glib/nm-active-connection.h | 16 +++- libnm-glib/nm-device.c | 16 ++++ 4 files changed, 209 insertions(+), 11 deletions(-) diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver index ac784cc..5247ce9 100644 --- a/libnm-glib/libnm-glib.ver +++ b/libnm-glib/libnm-glib.ver @@ -23,6 +23,10 @@ global: nm_active_connection_get_default6; nm_active_connection_get_default; nm_active_connection_get_devices; + nm_active_connection_get_dhcp4_config; + nm_active_connection_get_dhcp6_config; + nm_active_connection_get_ip4_config; + nm_active_connection_get_ip6_config; nm_active_connection_get_master; nm_active_connection_get_specific_object; nm_active_connection_get_state; diff --git a/libnm-glib/nm-active-connection.c b/libnm-glib/nm-active-connection.c index c474483..11f37cf 100644 --- a/libnm-glib/nm-active-connection.c +++ b/libnm-glib/nm-active-connection.c @@ -58,7 +58,11 @@ typedef struct { GPtrArray *devices; NMActiveConnectionState state; gboolean is_default; + NMIP4Config *ip4_config; + NMDHCP4Config *dhcp4_config; gboolean is_default6; + NMIP6Config *ip6_config; + NMDHCP6Config *dhcp6_config; char *master; } NMActiveConnectionPrivate; @@ -70,21 +74,16 @@ enum { PROP_DEVICES, PROP_STATE, PROP_DEFAULT, + PROP_IP4_CONFIG, + PROP_DHCP4_CONFIG, PROP_DEFAULT6, + PROP_IP6_CONFIG, + PROP_DHCP6_CONFIG, PROP_MASTER, LAST_PROP }; -#define DBUS_PROP_CONNECTION "Connection" -#define DBUS_PROP_UUID "Uuid" -#define DBUS_PROP_SPECIFIC_OBJECT "SpecificObject" -#define DBUS_PROP_DEVICES "Devices" -#define DBUS_PROP_STATE "State" -#define DBUS_PROP_DEFAULT "Default" -#define DBUS_PROP_DEFAULT6 "Default6" -#define DBUS_PROP_MASTER "Master" - /** * nm_active_connection_new: * @connection: the #DBusGConnection @@ -308,6 +307,49 @@ nm_active_connection_get_default (NMActiveConnection *connection) } /** + * nm_active_connection_get_ip4_config: + * @connection: an #NMActiveConnection + * + * Gets the current #NMIP4Config associated with the #NMActiveConnection. + * + * Returns: (transfer none): the #NMIP4Config, or %NULL if the + * connection is not in the %NM_ACTIVE_CONNECTION_STATE_ACTIVATED + * state. + * + * Since: 0.9.10 + **/ +NMIP4Config * +nm_active_connection_get_ip4_config (NMActiveConnection *connection) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); + + _nm_object_ensure_inited (NM_OBJECT (connection)); + return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->ip4_config; +} + +/** + * nm_active_connection_get_dhcp4_config: + * @connection: an #NMActiveConnection + * + * Gets the current #NMDHCP4Config (if any) associated with the + * #NMActiveConnection. + * + * Returns: (transfer none): the #NMDHCP4Config, or %NULL if the + * connection does not use DHCP, or is not in the + * %NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. + * + * Since: 0.9.10 + **/ +NMDHCP4Config * +nm_active_connection_get_dhcp4_config (NMActiveConnection *connection) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); + + _nm_object_ensure_inited (NM_OBJECT (connection)); + return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->dhcp4_config; +} + +/** * nm_active_connection_get_default6: * @connection: a #NMActiveConnection * @@ -326,6 +368,49 @@ nm_active_connection_get_default6 (NMActiveConnection *connection) } /** + * nm_active_connection_get_ip6_config: + * @connection: an #NMActiveConnection + * + * Gets the current #NMIP6Config associated with the #NMActiveConnection. + * + * Returns: (transfer none): the #NMIP6Config, or %NULL if the + * connection is not in the %NM_ACTIVE_CONNECTION_STATE_ACTIVATED + * state. + * + * Since: 0.9.10 + **/ +NMIP6Config * +nm_active_connection_get_ip6_config (NMActiveConnection *connection) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); + + _nm_object_ensure_inited (NM_OBJECT (connection)); + return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->ip6_config; +} + +/** + * nm_active_connection_get_dhcp6_config: + * @connection: an #NMActiveConnection + * + * Gets the current #NMDHCP6Config (if any) associated with the + * #NMActiveConnection. + * + * Returns: (transfer none): the #NMDHCP6Config, or %NULL if the + * connection does not use DHCPv6, or is not in the + * %NM_ACTIVE_CONNECTION_STATE_ACTIVATED state. + * + * Since: 0.9.10 + **/ +NMDHCP6Config * +nm_active_connection_get_dhcp6_config (NMActiveConnection *connection) +{ + g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NULL); + + _nm_object_ensure_inited (NM_OBJECT (connection)); + return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->dhcp6_config; +} + +/** * nm_active_connection_get_master: * @connection: a #NMActiveConnection * @@ -359,6 +444,11 @@ dispose (GObject *object) priv->devices = NULL; } + g_clear_object (&priv->ip4_config); + g_clear_object (&priv->dhcp4_config); + g_clear_object (&priv->ip6_config); + g_clear_object (&priv->dhcp6_config); + g_clear_object (&priv->proxy); G_OBJECT_CLASS (nm_active_connection_parent_class)->dispose (object); @@ -406,9 +496,21 @@ get_property (GObject *object, case PROP_DEFAULT: g_value_set_boolean (value, nm_active_connection_get_default (self)); break; + case PROP_IP4_CONFIG: + g_value_set_object (value, nm_active_connection_get_ip4_config (self)); + break; + case PROP_DHCP4_CONFIG: + g_value_set_object (value, nm_active_connection_get_dhcp4_config (self)); + break; case PROP_DEFAULT6: g_value_set_boolean (value, nm_active_connection_get_default6 (self)); break; + case PROP_IP6_CONFIG: + g_value_set_object (value, nm_active_connection_get_ip6_config (self)); + break; + case PROP_DHCP6_CONFIG: + g_value_set_object (value, nm_active_connection_get_dhcp6_config (self)); + break; case PROP_MASTER: g_value_set_string (value, nm_active_connection_get_master (self)); break; @@ -429,7 +531,11 @@ register_properties (NMActiveConnection *connection) { NM_ACTIVE_CONNECTION_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE }, { NM_ACTIVE_CONNECTION_STATE, &priv->state }, { NM_ACTIVE_CONNECTION_DEFAULT, &priv->is_default }, + { NM_ACTIVE_CONNECTION_IP4_CONFIG, &priv->ip4_config, NULL, NM_TYPE_IP4_CONFIG }, + { NM_ACTIVE_CONNECTION_DHCP4_CONFIG, &priv->dhcp4_config, NULL, NM_TYPE_DHCP4_CONFIG }, { NM_ACTIVE_CONNECTION_DEFAULT6, &priv->is_default6 }, + { NM_ACTIVE_CONNECTION_IP6_CONFIG, &priv->ip6_config, NULL, NM_TYPE_IP6_CONFIG }, + { NM_ACTIVE_CONNECTION_DHCP6_CONFIG, &priv->dhcp6_config, NULL, NM_TYPE_DHCP6_CONFIG }, { NM_ACTIVE_CONNECTION_MASTER, &priv->master }, /* not tracked after construction time */ @@ -551,6 +657,36 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class) G_PARAM_READABLE)); /** + * NMActiveConnection:ip4-config: + * + * The #NMIP4Config of the connection. + * + * Since: 0.9.10 + **/ + g_object_class_install_property + (object_class, PROP_IP4_CONFIG, + g_param_spec_object (NM_ACTIVE_CONNECTION_IP4_CONFIG, + "IP4 Config", + "IP4 Config", + NM_TYPE_IP4_CONFIG, + G_PARAM_READABLE)); + + /** + * NMActiveConnection:dhcp4-config: + * + * The #NMDHCP4Config of the connection. + * + * Since: 0.9.10 + **/ + g_object_class_install_property + (object_class, PROP_DHCP4_CONFIG, + g_param_spec_object (NM_ACTIVE_CONNECTION_DHCP4_CONFIG, + "DHCP4 Config", + "DHCP4 Config", + NM_TYPE_DHCP4_CONFIG, + G_PARAM_READABLE)); + + /** * NMActiveConnection:default6: * * Whether the active connection is the default IPv6 one. @@ -564,6 +700,36 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class) G_PARAM_READABLE)); /** + * NMActiveConnection:ip6-config: + * + * The #NMIP6Config of the connection. + * + * Since: 0.9.10 + **/ + g_object_class_install_property + (object_class, PROP_IP6_CONFIG, + g_param_spec_object (NM_ACTIVE_CONNECTION_IP6_CONFIG, + "IP6 Config", + "IP6 Config", + NM_TYPE_IP6_CONFIG, + G_PARAM_READABLE)); + + /** + * NMActiveConnection:dhcp6-config: + * + * The #NMDHCP6Config of the connection. + * + * Since: 0.9.10 + **/ + g_object_class_install_property + (object_class, PROP_DHCP6_CONFIG, + g_param_spec_object (NM_ACTIVE_CONNECTION_DHCP6_CONFIG, + "DHCP6 Config", + "DHCP6 Config", + NM_TYPE_DHCP6_CONFIG, + G_PARAM_READABLE)); + + /** * NMActiveConnection:master: * * The path of the master device if one exists. diff --git a/libnm-glib/nm-active-connection.h b/libnm-glib/nm-active-connection.h index c6777f8..49f040d 100644 --- a/libnm-glib/nm-active-connection.h +++ b/libnm-glib/nm-active-connection.h @@ -29,6 +29,10 @@ #include "nm-object.h" #include #include +#include "nm-ip4-config.h" +#include "nm-dhcp4-config.h" +#include "nm-ip6-config.h" +#include "nm-dhcp6-config.h" G_BEGIN_DECLS @@ -45,7 +49,11 @@ G_BEGIN_DECLS #define NM_ACTIVE_CONNECTION_DEVICES "devices" #define NM_ACTIVE_CONNECTION_STATE "state" #define NM_ACTIVE_CONNECTION_DEFAULT "default" +#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config" +#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config" #define NM_ACTIVE_CONNECTION_DEFAULT6 "default6" +#define NM_ACTIVE_CONNECTION_IP6_CONFIG "ip6-config" +#define NM_ACTIVE_CONNECTION_DHCP6_CONFIG "dhcp6-config" #define NM_ACTIVE_CONNECTION_MASTER "master" typedef struct { @@ -73,9 +81,13 @@ const char * nm_active_connection_get_uuid (NMActiveConnection *c const char * nm_active_connection_get_specific_object (NMActiveConnection *connection); const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection); NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection); -gboolean nm_active_connection_get_default (NMActiveConnection *connection); -gboolean nm_active_connection_get_default6 (NMActiveConnection *connection); const char * nm_active_connection_get_master (NMActiveConnection *connection); +gboolean nm_active_connection_get_default (NMActiveConnection *connection); +NMIP4Config * nm_active_connection_get_ip4_config (NMActiveConnection *connection); +NMDHCP4Config *nm_active_connection_get_dhcp4_config (NMActiveConnection *connection); +gboolean nm_active_connection_get_default6 (NMActiveConnection *connection); +NMIP6Config * nm_active_connection_get_ip6_config (NMActiveConnection *connection); +NMDHCP6Config *nm_active_connection_get_dhcp6_config (NMActiveConnection *connection); G_END_DECLS diff --git a/libnm-glib/nm-device.c b/libnm-glib/nm-device.c index d4f95ac..6d8e9f1 100644 --- a/libnm-glib/nm-device.c +++ b/libnm-glib/nm-device.c @@ -1253,6 +1253,10 @@ nm_device_get_firmware_missing (NMDevice *device) * * Gets the current #NMIP4Config associated with the #NMDevice. * + * Note that as of NetworkManager 0.9.10, you can alternatively use + * nm_active_connection_get_ip4_config(), which also works with VPN + * connections. + * * Returns: (transfer none): the #NMIP4Config or %NULL if the device is not activated. **/ NMIP4Config * @@ -1270,6 +1274,10 @@ nm_device_get_ip4_config (NMDevice *device) * * Gets the current #NMDHCP4Config associated with the #NMDevice. * + * Note that as of NetworkManager 0.9.10, you can alternatively use + * nm_active_connection_get_dhcp4_config(), which also works with VPN + * connections. + * * Returns: (transfer none): the #NMDHCP4Config or %NULL if the device is not activated or not * using DHCP. **/ @@ -1288,6 +1296,10 @@ nm_device_get_dhcp4_config (NMDevice *device) * * Gets the current #NMIP6Config associated with the #NMDevice. * + * Note that as of NetworkManager 0.9.10, you can alternatively use + * nm_active_connection_get_ip6_config(), which also works with VPN + * connections. + * * Returns: (transfer none): the #NMIP6Config or %NULL if the device is not activated. **/ NMIP6Config * @@ -1305,6 +1317,10 @@ nm_device_get_ip6_config (NMDevice *device) * * Gets the current #NMDHCP6Config associated with the #NMDevice. * + * Note that as of NetworkManager 0.9.10, you can alternatively use + * nm_active_connection_get_dhcp6_config(), which also works with VPN + * connections. + * * Returns: (transfer none): the #NMDHCP6Config or %NULL if the device is not activated or not * using DHCP. **/ -- 1.7.11.7 From f1f4f32c02e724f59fcc958d08ab8d543a01311d Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Wed, 18 Dec 2013 11:49:39 -0500 Subject: [PATCH 4/4] cli: get IP/DHCP config directly from the NMActiveConnection (rh #1036132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that NMActiveConnection has IP and DHCP config info, use that directly in "nmcli con show active" rather than getting it from the connection's device; this way, we get the right info for VPN connections as well. Signed-off-by: Jiří Klimeš --- cli/src/connections.c | 60 ++++++++++++++------------------------------------- 1 file changed, 16 insertions(+), 44 deletions(-) diff --git a/cli/src/connections.c b/cli/src/connections.c index 26be72f..7376405 100644 --- a/cli/src/connections.c +++ b/cli/src/connections.c @@ -941,66 +941,38 @@ nmc_active_connection_detail (NMActiveConnection *acon, NmCli *nmc) /* IP4 */ if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[1].name) == 0) { - const GPtrArray *devices; - int j; + gboolean b1 = FALSE; + NMIP4Config *cfg4 = nm_active_connection_get_ip4_config (acon); - devices = nm_active_connection_get_devices (acon); - for (j = 0; devices && (j < devices->len); j++) { - gboolean b1 = FALSE; - NMDevice *device = g_ptr_array_index (devices, j); - NMIP4Config *cfg4 = nm_device_get_ip4_config (device); - - b1 = print_ip4_config (cfg4, nmc, "IP4", group_fld); - was_output = was_output || b1; - } + b1 = print_ip4_config (cfg4, nmc, "IP4", group_fld); + was_output = was_output || b1; } /* DHCP4 */ if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[2].name) == 0) { - const GPtrArray *devices; - int j; + gboolean b1 = FALSE; + NMDHCP4Config *dhcp4 = nm_active_connection_get_dhcp4_config (acon); - devices = nm_active_connection_get_devices (acon); - for (j = 0; devices && (j < devices->len); j++) { - gboolean b1 = FALSE; - NMDevice *device = g_ptr_array_index (devices, j); - NMDHCP4Config *dhcp4 = nm_device_get_dhcp4_config (device); - - b1 = print_dhcp4_config (dhcp4, nmc, "DHCP4", group_fld); - was_output = was_output || b1; - } + b1 = print_dhcp4_config (dhcp4, nmc, "DHCP4", group_fld); + was_output = was_output || b1; } /* IP6 */ if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[3].name) == 0) { - const GPtrArray *devices; - int j; + gboolean b1 = FALSE; + NMIP6Config *cfg6 = nm_active_connection_get_ip6_config (acon); - devices = nm_active_connection_get_devices (acon); - for (j = 0; devices && (j < devices->len); j++) { - gboolean b1 = FALSE; - NMDevice *device = g_ptr_array_index (devices, j); - NMIP6Config *cfg6 = nm_device_get_ip6_config (device); - - b1 = print_ip6_config (cfg6, nmc, "IP6", group_fld); - was_output = was_output || b1; - } + b1 = print_ip6_config (cfg6, nmc, "IP6", group_fld); + was_output = was_output || b1; } /* DHCP6 */ if (strcasecmp (nmc_fields_con_active_details_groups[group_idx].name, nmc_fields_con_active_details_groups[4].name) == 0) { - const GPtrArray *devices; - int j; + gboolean b1 = FALSE; + NMDHCP6Config *dhcp6 = nm_active_connection_get_dhcp6_config (acon); - devices = nm_active_connection_get_devices (acon); - for (j = 0; devices && (j < devices->len); j++) { - gboolean b1 = FALSE; - NMDevice *device = g_ptr_array_index (devices, j); - NMDHCP6Config *dhcp6 = nm_device_get_dhcp6_config (device); - - b1 = print_dhcp6_config (dhcp6, nmc, "DHCP6", group_fld); - was_output = was_output || b1; - } + b1 = print_dhcp6_config (dhcp6, nmc, "DHCP6", group_fld); + was_output = was_output || b1; } /* VPN */ -- 1.7.11.7