Re: [PATCH] RFC: fall back to IPv4-LL in case of DHCP failure
> In some cases, it is useful to have a static configuration which > succeeds > to configure a network interface regardless of whether a DHCP server > is available or not. One such use-case is an embedded system with > factory default settings, which would fall back to IPv4-LL when > connected directly to the notebook of a field engineer. Please also compare to IPv6-LL. The IPv6 way has the advantage of allways having a link-local address managed by the kernel. The only thing that is needed is to have the interface 'up'. It doesn't interfere with global address configuration and it works without timeouts. Currently, the device with link-local IPv6 address is not considered configured (when mode=auto) but it's usable for LL communication unless NM sets the interface 'down'. > With this patch, when DHCP reports a timeout, the connection attempt > is restart with phase 3 of autoipd-based IPv4 Link-Local > configuration. > For now this behaviour is hard-coded, but I'd make it configurable > if this approach is acceptable. > > For configuration, a new IPv4 method could be added (either a new > 'Automatic with fall back' or 'DHCP only', making enabled fall back > the default in 'Automatic'). Alternatively an option could be added > to the IPv4 configuration (i.e. 'll-fall-back=true'). The problem with this approach is that for example a lame wireless connection will succeed to setup IPv4LL and networking will be broken even though another wireless connection would succeed fully. Cheers, Pavel > Best regards, > Jan Luebbe > > --- > src/nm-device.c | 28 > 1 file changed, 24 insertions(+), 4 deletions(-) > > diff --git a/src/nm-device.c b/src/nm-device.c > index 6eaa94d..886d5bc 100644 > --- a/src/nm-device.c > +++ b/src/nm-device.c > @@ -204,9 +204,10 @@ typedef struct { > DBusGProxyCall*fw_call; > > /* avahi-autoipd stuff */ > - GPidaipd_pid; > - guint aipd_watch; > - guint aipd_timeout; > + GPid aipd_pid; > + guintaipd_watch; > + guintaipd_timeout; > + gboolean aipd_failed; > > /* IP6 configuration info */ > NMIP6Config * ip6_config; > @@ -1262,6 +1263,8 @@ aipd_cleanup (NMDevice *self) > } > > aipd_timeout_remove (self); > + > + priv->aipd_failed = FALSE; > } > > static NMIP4Config * > @@ -1331,7 +1334,8 @@ nm_device_handle_autoip4_event (NMDevice *self, > if (s_ip4) > method = nm_setting_ip4_config_get_method (s_ip4); > > - if (g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) != > 0) > + if ( g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) > != 0 > + && g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) != 0) > return; > > iface = nm_device_get_iface (self); > @@ -1423,6 +1427,7 @@ aipd_timeout_cb (gpointer user_data) > nm_log_info (LOGD_AUTOIP4, "(%s): avahi-autoipd timed out.", > nm_device_get_iface (self)); > priv->aipd_timeout = 0; > aipd_cleanup (self); > + priv->aipd_failed = TRUE; > > if (priv->ip4_state == IP_CONF) > nm_device_activate_schedule_ip4_config_timeout (self); > @@ -2499,6 +2504,21 @@ > nm_device_activate_schedule_stage3_ip_config_start (NMDevice *self) > static NMActStageReturn > real_act_stage4_ip4_config_timeout (NMDevice *self, > NMDeviceStateReason *reason) > { > + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); > + NMConnection *connection; > + NMSettingIP4Config *s_ip4; > + const char *method; > + > + connection = nm_device_get_connection (self); > + g_assert (connection); > + > + s_ip4 = nm_connection_get_setting_ip4_config (connection); > + g_assert (s_ip4); > + > + method = nm_setting_ip4_config_get_method (s_ip4); > + if ( strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0 > + && !priv->aipd_failed) > + return aipd_start (self, reason); > if (nm_device_ip_config_should_fail (self, FALSE)) { > *reason = NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE; > return NM_ACT_STAGE_RETURN_FAILURE; > -- > 1.7.10 > > ___ > networkmanager-list mailing list > networkmanager-list@gnome.org > https://mail.gnome.org/mailman/listinfo/networkmanager-list > ___ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list
Re: [PATCH] RFC: fall back to IPv4-LL in case of DHCP failure
Jan Luebbe writes: > For configuration, a new IPv4 method could be added (either a new > 'Automatic with fall back' or 'DHCP only', making enabled fall back > the default in 'Automatic'). Alternatively an option could be added > to the IPv4 configuration (i.e. 'll-fall-back=true'). In the long run, an ordered list (made up example: [DHCP, OLSR, RFC3927]) may be best. Otherwise either the number of combined options will grow exponentially or only a rather limited subset of combinations will be supported. Additional options could be used to modify the operation of the individual methods (e.g. [RFC3927, DHCP] and rfc3927-exclusive=no to always assign a link-local address, or [DHCP, RFC3927] and dhcp-initial-timeout=3, dhcp-retry-later=yes, dhcp-remove-rfc3927=yes to get connected fast and temporarily use link-local addresses until a DHCP server becomes available). This prevents the same method to be tried twice with different options, but going to full PAM-style complexity (with per-instance options and = to modify the ordering) may not be worth it. How to expose this in the UI is a different matter. One option may be to show a drop-down box with just a few commonplace options by default and showing the full list in advanced mode. At any rate, thanks for working on making IPv4LL addressing a non-exclusive option! Sascha -- http://sascha.silbe.org/ http://www.infra-silbe.de/ pgp1DI5fclLy0.pgp Description: PGP signature ___ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list
[PATCH] RFC: fall back to IPv4-LL in case of DHCP failure
In some cases, it is useful to have a static configuration which succeeds to configure a network interface regardless of whether a DHCP server is available or not. One such use-case is an embedded system with factory default settings, which would fall back to IPv4-LL when connected directly to the notebook of a field engineer. With this patch, when DHCP reports a timeout, the connection attempt is restart with phase 3 of autoipd-based IPv4 Link-Local configuration. For now this behaviour is hard-coded, but I'd make it configurable if this approach is acceptable. For configuration, a new IPv4 method could be added (either a new 'Automatic with fall back' or 'DHCP only', making enabled fall back the default in 'Automatic'). Alternatively an option could be added to the IPv4 configuration (i.e. 'll-fall-back=true'). Best regards, Jan Luebbe --- src/nm-device.c | 28 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/nm-device.c b/src/nm-device.c index 6eaa94d..886d5bc 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -204,9 +204,10 @@ typedef struct { DBusGProxyCall*fw_call; /* avahi-autoipd stuff */ - GPidaipd_pid; - guint aipd_watch; - guint aipd_timeout; + GPid aipd_pid; + guintaipd_watch; + guintaipd_timeout; + gboolean aipd_failed; /* IP6 configuration info */ NMIP6Config * ip6_config; @@ -1262,6 +1263,8 @@ aipd_cleanup (NMDevice *self) } aipd_timeout_remove (self); + + priv->aipd_failed = FALSE; } static NMIP4Config * @@ -1331,7 +1334,8 @@ nm_device_handle_autoip4_event (NMDevice *self, if (s_ip4) method = nm_setting_ip4_config_get_method (s_ip4); - if (g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) != 0) + if ( g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL) != 0 + && g_strcmp0 (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) != 0) return; iface = nm_device_get_iface (self); @@ -1423,6 +1427,7 @@ aipd_timeout_cb (gpointer user_data) nm_log_info (LOGD_AUTOIP4, "(%s): avahi-autoipd timed out.", nm_device_get_iface (self)); priv->aipd_timeout = 0; aipd_cleanup (self); + priv->aipd_failed = TRUE; if (priv->ip4_state == IP_CONF) nm_device_activate_schedule_ip4_config_timeout (self); @@ -2499,6 +2504,21 @@ nm_device_activate_schedule_stage3_ip_config_start (NMDevice *self) static NMActStageReturn real_act_stage4_ip4_config_timeout (NMDevice *self, NMDeviceStateReason *reason) { + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + NMConnection *connection; + NMSettingIP4Config *s_ip4; + const char *method; + + connection = nm_device_get_connection (self); + g_assert (connection); + + s_ip4 = nm_connection_get_setting_ip4_config (connection); + g_assert (s_ip4); + + method = nm_setting_ip4_config_get_method (s_ip4); + if ( strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0 + && !priv->aipd_failed) + return aipd_start (self, reason); if (nm_device_ip_config_should_fail (self, FALSE)) { *reason = NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE; return NM_ACT_STAGE_RETURN_FAILURE; -- 1.7.10 ___ networkmanager-list mailing list networkmanager-list@gnome.org https://mail.gnome.org/mailman/listinfo/networkmanager-list