From 806b74db348a16b0a0ed0f0c38105126f8272a7d Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sun, 2 May 2010 16:51:26 -0700 Subject: [PATCH] libnm-util: add 'may-fail' for IPv4 and IPv6 When this property is TRUE, IP configuration can continue as long as at least on IP configuration type succeeds. This allows connections to networks where the user does not necessarily know whether the network supports IPv4 or IPv6 and does not require that both complete succesfully. Since most of the time the user doesn't really care what type of connectivity they have, as long as they have *some* connectivity, this allows better "Just Works" behavior as long as the system settings plugins and connection editors/applets use the right defaults. Suggested defaults for may-fail are: IPv4: no (ie, require IPv4 connectivity) IPv6: yes (ie, do not require IPv6 connectivity) Users who require a specific type of connectivity are probably knowlegable enough to check the box as needed for their network. --- libnm-util/Makefile.am | 2 +- libnm-util/libnm-util.ver | 6 +++-- libnm-util/nm-setting-ip4-config.c | 41 ++++++++++++++++++++++++++++++ libnm-util/nm-setting-ip4-config.h | 3 +++ libnm-util/nm-setting-ip6-config.c | 40 +++++++++++++++++++++++++++++ libnm-util/nm-setting-ip6-config.h | 2 ++ 6 files changed, 91 insertions(+), 3 deletions(-) diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am index bb4736f45b..ddc68408ab 100644 --- a/libnm-util/Makefile.am +++ b/libnm-util/Makefile.am @@ -59,7 +59,7 @@ libnm_util_la_SOURCES= \ libnm_util_la_LIBADD = $(GLIB_LIBS) $(DBUS_LIBS) $(UUID_LIBS) libnm_util_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libnm-util.ver \ - -version-info "4:3:3" + -version-info "4:4:3" if WITH_GNUTLS libnm_util_la_SOURCES += crypto_gnutls.c diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver index 1c8446ba2e..ed1d8a484f 100644 --- a/libnm-util/libnm-util.ver +++ b/libnm-util/libnm-util.ver @@ -168,8 +168,7 @@ global: nm_setting_ip4_config_get_dhcp_hostname; nm_setting_ip4_config_get_dhcp_send_hostname; nm_setting_ip4_config_get_never_default; - nm_setting_ip6_config_error_get_type; - nm_setting_ip6_config_error_quark; + nm_setting_ip4_config_get_may_fail; nm_ip6_address_new; nm_ip6_address_dup; nm_ip6_address_ref; @@ -194,6 +193,8 @@ global: nm_ip6_route_set_next_hop; nm_ip6_route_get_metric; nm_ip6_route_set_metric; + nm_setting_ip6_config_error_get_type; + nm_setting_ip6_config_error_quark; nm_setting_ip6_config_get_type; nm_setting_ip6_config_new; nm_setting_ip6_config_get_method; @@ -220,6 +221,7 @@ global: nm_setting_ip6_config_get_ignore_auto_routes; nm_setting_ip6_config_get_ignore_auto_dns; nm_setting_ip6_config_get_never_default; + nm_setting_ip6_config_get_may_fail; nm_setting_need_secrets; nm_setting_ppp_error_get_type; nm_setting_ppp_error_quark; diff --git a/libnm-util/nm-setting-ip4-config.c b/libnm-util/nm-setting-ip4-config.c index c1d7f01c76..a1a9674af7 100644 --- a/libnm-util/nm-setting-ip4-config.c +++ b/libnm-util/nm-setting-ip4-config.c @@ -83,6 +83,7 @@ typedef struct { gboolean dhcp_send_hostname; char *dhcp_hostname; gboolean never_default; + gboolean may_fail; } NMSettingIP4ConfigPrivate; enum { @@ -98,6 +99,7 @@ enum { PROP_DHCP_SEND_HOSTNAME, PROP_DHCP_HOSTNAME, PROP_NEVER_DEFAULT, + PROP_MAY_FAIL, LAST_PROP }; @@ -438,6 +440,14 @@ nm_setting_ip4_config_get_never_default (NMSettingIP4Config *setting) return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->never_default; } +gboolean +nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP4_CONFIG (setting), FALSE); + + return NM_SETTING_IP4_CONFIG_GET_PRIVATE (setting)->may_fail; +} + static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { @@ -641,6 +651,9 @@ set_property (GObject *object, guint prop_id, case PROP_NEVER_DEFAULT: priv->never_default = g_value_get_boolean (value); break; + case PROP_MAY_FAIL: + priv->may_fail = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -688,6 +701,9 @@ get_property (GObject *object, guint prop_id, case PROP_NEVER_DEFAULT: g_value_set_boolean (value, priv->never_default); break; + case PROP_MAY_FAIL: + g_value_set_boolean (value, priv->may_fail); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -968,6 +984,31 @@ nm_setting_ip4_config_class_init (NMSettingIP4ConfigClass *setting_class) "the default route by NetworkManager.", FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE)); + + /** + * NMSettingIP4Config:may-fail: + * + * If TRUE, allow overall network configuration to proceed even if IPv4 + * configuration fails or times out. Note that at least one IP configuration + * must succeed or overall network configuration will still fail. For + * example, in IPv6-only networks, setting this property to TRUE allows + * the overall network configuration to succeed if IPv4 configuration fails + * but IPv6 configuration completes successfully. + **/ + g_object_class_install_property + (object_class, PROP_MAY_FAIL, + g_param_spec_boolean (NM_SETTING_IP4_CONFIG_MAY_FAIL, + "May Fail", + "If TRUE, allow overall network configuration to " + "proceed even if IPv4 configuration fails or times " + "out. Note that at least one IP configuration must " + "succeed or overall network configuration will still " + "fail. For example, in IPv6-only networks, setting " + "this property to TRUE allows the overall network " + "configuration to succeed if IPv4 configuration " + "fails but IPv6 configuration completes successfully.", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE)); } diff --git a/libnm-util/nm-setting-ip4-config.h b/libnm-util/nm-setting-ip4-config.h index 777f53f126..80ddd4758e 100644 --- a/libnm-util/nm-setting-ip4-config.h +++ b/libnm-util/nm-setting-ip4-config.h @@ -64,6 +64,7 @@ GQuark nm_setting_ip4_config_error_quark (void); #define NM_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME "dhcp-send-hostname" #define NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME "dhcp-hostname" #define NM_SETTING_IP4_CONFIG_NEVER_DEFAULT "never-default" +#define NM_SETTING_IP4_CONFIG_MAY_FAIL "may-fail" #define NM_SETTING_IP4_CONFIG_METHOD_AUTO "auto" #define NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL "link-local" @@ -169,6 +170,8 @@ const char * nm_setting_ip4_config_get_dhcp_hostname (NMSettingIP4Config * gboolean nm_setting_ip4_config_get_never_default (NMSettingIP4Config *setting); +gboolean nm_setting_ip4_config_get_may_fail (NMSettingIP4Config *setting); + G_END_DECLS #endif /* NM_SETTING_IP4_CONFIG_H */ diff --git a/libnm-util/nm-setting-ip6-config.c b/libnm-util/nm-setting-ip6-config.c index 05f21f037e..f92595b705 100644 --- a/libnm-util/nm-setting-ip6-config.c +++ b/libnm-util/nm-setting-ip6-config.c @@ -79,6 +79,7 @@ typedef struct { gboolean ignore_auto_routes; gboolean ignore_auto_dns; gboolean never_default; + gboolean may_fail; } NMSettingIP6ConfigPrivate; @@ -92,6 +93,7 @@ enum { PROP_IGNORE_AUTO_ROUTES, PROP_IGNORE_AUTO_DNS, PROP_NEVER_DEFAULT, + PROP_MAY_FAIL, LAST_PROP }; @@ -414,6 +416,14 @@ nm_setting_ip6_config_get_never_default (NMSettingIP6Config *setting) return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->never_default; } +gboolean +nm_setting_ip6_config_get_may_fail (NMSettingIP6Config *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_IP6_CONFIG (setting), FALSE); + + return NM_SETTING_IP6_CONFIG_GET_PRIVATE (setting)->may_fail; +} + static gboolean verify (NMSetting *setting, GSList *all_settings, GError **error) { @@ -535,6 +545,9 @@ set_property (GObject *object, guint prop_id, case PROP_NEVER_DEFAULT: priv->never_default = g_value_get_boolean (value); break; + case PROP_MAY_FAIL: + priv->may_fail = g_value_get_boolean (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -572,6 +585,9 @@ get_property (GObject *object, guint prop_id, case PROP_NEVER_DEFAULT: g_value_set_boolean (value, priv->never_default); break; + case PROP_MAY_FAIL: + g_value_set_boolean (value, priv->may_fail); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -802,6 +818,30 @@ nm_setting_ip6_config_class_init (NMSettingIP6ConfigClass *setting_class) FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE)); + /** + * NMSettingIP6Config:may-fail: + * + * If TRUE, allow overall network configuration to proceed even if IPv6 + * configuration fails or times out. Note that at least one IP configuration + * must succeed or overall network configuration will still fail. For + * example, in IPv4-only networks, setting this property to TRUE allows + * the overall network configuration to succeed if IPv6 configuration fails + * but IPv4 configuration completes successfully. + **/ + g_object_class_install_property + (object_class, PROP_MAY_FAIL, + g_param_spec_boolean (NM_SETTING_IP6_CONFIG_MAY_FAIL, + "May Fail", + "If TRUE, allow overall network configuration to " + "proceed even if IPv6 configuration fails or times " + "out. Note that at least one IP configuration must " + "succeed or overall network configuration will still " + "fail. For example, in IPv4-only networks, setting " + "this property to TRUE allows the overall network " + "configuration to succeed if IPv6 configuration " + "fails but IPv4 configuration completes successfully.", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | NM_SETTING_PARAM_SERIALIZE)); } /********************************************************************/ diff --git a/libnm-util/nm-setting-ip6-config.h b/libnm-util/nm-setting-ip6-config.h index 78617c4547..e3e286e684 100644 --- a/libnm-util/nm-setting-ip6-config.h +++ b/libnm-util/nm-setting-ip6-config.h @@ -62,6 +62,7 @@ GQuark nm_setting_ip6_config_error_quark (void); #define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES "ignore-auto-routes" #define NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS "ignore-auto-dns" #define NM_SETTING_IP6_CONFIG_NEVER_DEFAULT "never-default" +#define NM_SETTING_IP6_CONFIG_MAY_FAIL "may-fail" #define NM_SETTING_IP6_CONFIG_METHOD_IGNORE "ignore" #define NM_SETTING_IP6_CONFIG_METHOD_AUTO "auto" @@ -163,6 +164,7 @@ gboolean nm_setting_ip6_config_get_ignore_auto_routes (NMSettingIP gboolean nm_setting_ip6_config_get_ignore_auto_dns (NMSettingIP6Config *setting); gboolean nm_setting_ip6_config_get_never_default (NMSettingIP6Config *setting); +gboolean nm_setting_ip6_config_get_may_fail (NMSettingIP6Config *setting); G_END_DECLS