diff --git a/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch b/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch new file mode 100644 index 0000000..183685d --- /dev/null +++ b/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch @@ -0,0 +1,347 @@ +From 5eb7b04a6fb0affd7444255a7d668a44338f795d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= +Date: Wed, 27 May 2015 11:20:31 +0200 +Subject: [PATCH 1/4] device: trivial: fix a copy/paste error in comment +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiří Klimeš +--- + src/devices/nm-device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c +index a352783..c455e45 100644 +--- a/src/devices/nm-device.c ++++ b/src/devices/nm-device.c +@@ -546,7 +546,7 @@ nm_device_get_ip_ifindex (NMDevice *self) + g_return_val_if_fail (self != NULL, 0); + + priv = NM_DEVICE_GET_PRIVATE (self); +- /* If it's not set, default to iface */ ++ /* If it's not set, default to ifindex */ + return priv->ip_iface ? priv->ip_ifindex : priv->ifindex; + } + +-- +2.1.0 + + +From a32d216fcbebe9652cb5e5b7627ffdd9d50d1c51 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= +Date: Fri, 12 Jun 2015 21:46:46 +0200 +Subject: [PATCH 2/4] utils: fix error logging in ASSERT_VALID_PATH_COMPONENT() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Signed-off-by: Jiří Klimeš +--- + src/NetworkManagerUtils.c | 5 +---- + 1 file changed, 1 insertion(+), 4 deletions(-) + +diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c +index 6747b65..231031a 100644 +--- a/src/NetworkManagerUtils.c ++++ b/src/NetworkManagerUtils.c +@@ -2254,10 +2254,7 @@ ASSERT_VALID_PATH_COMPONENT (const char *name) + + return name; + fail: +- if (name) +- nm_log_err (LOGD_CORE, "Failed asserting path component: NULL"); +- else +- nm_log_err (LOGD_CORE, "Failed asserting path component: \"%s\"", name); ++ nm_log_err (LOGD_CORE, "Failed asserting path component: \"%s\"", name ? name : "(null)"); + g_error ("FATAL: Failed asserting path component: %s", name ? name : "(null)"); + g_assert_not_reached (); + } +-- +2.1.0 + + +From bd987c7895f1c7edcbc55c9c3ddf13007926a58e Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Tue, 28 Apr 2015 17:59:07 +0200 +Subject: [PATCH 3/4] utils: add nm_clear_g_source() helper +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Utility function to simplify the following common code: + + if (priv->timeout_id) { + g_source_remove (priv->timeout_id); + priv->timeout_id = 0; + } + +to + + nm_clear_g_source (&priv->timeout_id); + +Signed-off-by: Jiří Klimeš +--- + include/nm-utils-internal.h | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/include/nm-utils-internal.h b/include/nm-utils-internal.h +index c002b6c..49fdb0c 100644 +--- a/include/nm-utils-internal.h ++++ b/include/nm-utils-internal.h +@@ -100,4 +100,19 @@ + _found; \ + }) + ++/*****************************************************************************/ ++ ++static inline gboolean ++nm_clear_g_source (guint *id) ++{ ++ if (id && *id) { ++ g_source_remove (*id); ++ *id = 0; ++ return TRUE; ++ } ++ return FALSE; ++} ++ ++/*****************************************************************************/ ++ + #endif +-- +2.1.0 + + +From b663b43890efd1c0965cde7eaf1d136ff754db23 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Tue, 7 Jul 2015 17:33:38 +0200 +Subject: [PATCH 4/4] device: delay handling of link-changed platform event +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When inside a state-change, we set for example the device up. +This triggers a link-changed event, which then causes further +state-changes of the devices. +A state-change in process of a device is not reentrant, so we must +delay the handling of the link-changed event. + +(cherry picked from commit 04caae735fabe00e19a05d49e065514114b59d40) +Signed-off-by: Jiří Klimeš +--- + src/devices/nm-device.c | 94 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 65 insertions(+), 29 deletions(-) + +diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c +index c455e45..834360a 100644 +--- a/src/devices/nm-device.c ++++ b/src/devices/nm-device.c +@@ -180,6 +180,9 @@ typedef struct { + gboolean in_state_changed; + gboolean initialized; + ++ guint device_link_changed_id; ++ guint device_ip_link_changed_id; ++ + NMDeviceState state; + NMDeviceStateReason state_reason; + QueuedState queued_state; +@@ -1206,31 +1209,39 @@ device_set_master (NMDevice *self, int ifindex) + } + } + +-static void +-device_link_changed (NMDevice *self, NMPlatformLink *info) ++static gboolean ++device_link_changed (NMDevice *self) + { + NMDeviceClass *klass = NM_DEVICE_GET_CLASS (self); + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + gboolean ip_ifname_changed = FALSE; ++ NMPlatformLink info; ++ int ifindex; + +- if (info->udi && g_strcmp0 (info->udi, priv->udi)) { ++ priv->device_link_changed_id = 0; ++ ++ ifindex = nm_device_get_ifindex (self); ++ if (!nm_platform_link_get (ifindex, &info)) ++ return G_SOURCE_REMOVE; ++ ++ if (info.udi && g_strcmp0 (info.udi, priv->udi)) { + /* Update UDI to what udev gives us */ + g_free (priv->udi); +- priv->udi = g_strdup (info->udi); ++ priv->udi = g_strdup (info.udi); + g_object_notify (G_OBJECT (self), NM_DEVICE_UDI); + } + + /* Update MTU if it has changed. */ +- if (priv->mtu != info->mtu) { +- priv->mtu = info->mtu; ++ if (priv->mtu != info.mtu) { ++ priv->mtu = info.mtu; + g_object_notify (G_OBJECT (self), NM_DEVICE_MTU); + } + +- if (info->name[0] && strcmp (priv->iface, info->name) != 0) { ++ if (info.name[0] && strcmp (priv->iface, info.name) != 0) { + _LOGI (LOGD_DEVICE, "interface index %d renamed iface from '%s' to '%s'", +- priv->ifindex, priv->iface, info->name); ++ priv->ifindex, priv->iface, info.name); + g_free (priv->iface); +- priv->iface = g_strdup (info->name); ++ priv->iface = g_strdup (info.name); + + /* If the device has no explicit ip_iface, then changing iface changes ip_iface too. */ + ip_ifname_changed = !priv->ip_iface; +@@ -1249,30 +1260,30 @@ device_link_changed (NMDevice *self, NMPlatformLink *info) + } + + /* Update slave status for external changes */ +- if (priv->enslaved && info->master != nm_device_get_ifindex (priv->master)) ++ if (priv->enslaved && info.master != nm_device_get_ifindex (priv->master)) + nm_device_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_NONE); +- if (info->master && !priv->enslaved) { +- device_set_master (self, info->master); ++ if (info.master && !priv->enslaved) { ++ device_set_master (self, info.master); + if (priv->master) + nm_device_enslave_slave (priv->master, self, NULL); + } + + if (klass->link_changed) +- klass->link_changed (self, info); ++ klass->link_changed (self, &info); + + /* Update DHCP, etc, if needed */ + if (ip_ifname_changed) + update_for_ip_ifname_change (self); + +- if (priv->up != info->up) { +- priv->up = info->up; ++ if (priv->up != info.up) { ++ priv->up = info.up; + + /* Manage externally-created software interfaces only when they are IFF_UP */ + g_assert (priv->ifindex > 0); + if (is_software_external (self)) { + gboolean external_down = nm_device_get_unmanaged_flag (self, NM_UNMANAGED_EXTERNAL_DOWN); + +- if (external_down && info->up) { ++ if (external_down && info.up) { + if (nm_device_get_state (self) < NM_DEVICE_STATE_DISCONNECTED) { + /* Ensure the assume check is queued before any queued state changes + * from the transition to UNAVAILABLE. +@@ -1295,7 +1306,7 @@ device_link_changed (NMDevice *self, NMPlatformLink *info) + */ + priv->unmanaged_flags &= ~NM_UNMANAGED_EXTERNAL_DOWN; + } +- } else if (!external_down && !info->up && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) { ++ } else if (!external_down && !info.up && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) { + /* If the device is already disconnected and is set !IFF_UP, + * unmanage it. + */ +@@ -1306,23 +1317,34 @@ device_link_changed (NMDevice *self, NMPlatformLink *info) + } + } + } ++ ++ return G_SOURCE_REMOVE; + } + +-static void +-device_ip_link_changed (NMDevice *self, NMPlatformLink *info) ++static gboolean ++device_ip_link_changed (NMDevice *self) + { + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); ++ NMPlatformLink info; ++ int ip_ifindex; ++ ++ priv->device_ip_link_changed_id = 0; + +- if (info->name[0] && g_strcmp0 (priv->ip_iface, info->name)) { ++ ip_ifindex = nm_device_get_ip_ifindex (self); ++ if (!nm_platform_link_get (ip_ifindex, &info)) ++ return G_SOURCE_REMOVE; ++ ++ if (info.name[0] && g_strcmp0 (priv->ip_iface, info.name)) { + _LOGI (LOGD_DEVICE, "interface index %d renamed ip_iface (%d) from '%s' to '%s'", + priv->ifindex, nm_device_get_ip_ifindex (self), +- priv->ip_iface, info->name); ++ priv->ip_iface, info.name); + g_free (priv->ip_iface); +- priv->ip_iface = g_strdup (info->name); ++ priv->ip_iface = g_strdup (info.name); + + g_object_notify (G_OBJECT (self), NM_DEVICE_IP_IFACE); + update_for_ip_ifname_change (self); + } ++ return G_SOURCE_REMOVE; + } + + static void +@@ -1333,19 +1355,30 @@ link_changed_cb (NMPlatform *platform, + NMPlatformReason reason, + NMDevice *self) + { ++ NMDevicePrivate *priv; ++ + if (change_type != NM_PLATFORM_SIGNAL_CHANGED) + return; + ++ priv = NM_DEVICE_GET_PRIVATE (self); ++ + /* We don't filter by 'reason' because we are interested in *all* link + * changes. For example a call to nm_platform_link_set_up() may result + * in an internal carrier change (i.e. we ask the kernel to set IFF_UP + * and it results in also setting IFF_LOWER_UP. + */ + +- if (ifindex == nm_device_get_ifindex (self)) +- device_link_changed (self, info); +- else if (ifindex == nm_device_get_ip_ifindex (self)) +- device_ip_link_changed (self, info); ++ if (ifindex == nm_device_get_ifindex (self)) { ++ if (!priv->device_link_changed_id) { ++ priv->device_link_changed_id = g_idle_add ((GSourceFunc) device_link_changed, self); ++ _LOGD (LOGD_DEVICE, "queued link change for ifindex %d", ifindex); ++ } ++ } else if (ifindex == nm_device_get_ip_ifindex (self)) { ++ if (!priv->device_ip_link_changed_id) { ++ priv->device_ip_link_changed_id = g_idle_add ((GSourceFunc) device_ip_link_changed, self); ++ _LOGD (LOGD_DEVICE, "queued link change for ip-ifindex %d", ifindex); ++ } ++ } + } + + static void +@@ -6677,10 +6710,10 @@ device_ip_changed (NMPlatform *platform, + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + + if (nm_device_get_ip_ifindex (self) == ifindex) { +- if (!priv->queued_ip_config_id) ++ if (!priv->queued_ip_config_id) { + priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self); +- +- _LOGD (LOGD_DEVICE, "queued IP config change"); ++ _LOGD (LOGD_DEVICE, "queued IP config change"); ++ } + } + } + +@@ -8257,6 +8290,9 @@ dispose (GObject *object) + g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip_changed), self); + g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self); + ++ nm_clear_g_source (&priv->device_link_changed_id); ++ nm_clear_g_source (&priv->device_ip_link_changed_id); ++ + G_OBJECT_CLASS (nm_device_parent_class)->dispose (object); + } + +-- +2.1.0 + diff --git a/SOURCES/0009-rh1128581-respawn-ping-on-error.patch b/SOURCES/0009-rh1128581-respawn-ping-on-error.patch new file mode 100644 index 0000000..264f544 --- /dev/null +++ b/SOURCES/0009-rh1128581-respawn-ping-on-error.patch @@ -0,0 +1,239 @@ +From 8b53b4ee75f17341901b8f95f27a99fdbb771dba Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Tue, 14 Jul 2015 18:59:10 +0200 +Subject: [PATCH] device: restart ping process when it exits with an error + +When ping is launched to check the connectivity to the gateway it may +return earlier than the given timeout in case of error. When this +happens we need to respawn it until the timeout is reached. + +While at it, increase maximum timeout value to 600 seconds. + +https://bugzilla.redhat.com/show_bug.cgi?id=1128581 + +(cherry picked from commit e86f8354a7aa5f8ba95b319f54f70e3e8aa9dbb7) +--- + libnm-core/nm-setting-connection.c | 2 +- + src/devices/nm-device.c | 126 +++++++++++++++++++++++++------------ + 2 files changed, 86 insertions(+), 42 deletions(-) + +diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c +index 01f5d42..541ef87 100644 +--- a/libnm-core/nm-setting-connection.c ++++ b/libnm-core/nm-setting-connection.c +@@ -1562,7 +1562,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class) + g_object_class_install_property + (object_class, PROP_GATEWAY_PING_TIMEOUT, + g_param_spec_uint (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, "", "", +- 0, 30, 0, ++ 0, 600, 0, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); +diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c +index 1295dc2..f753843 100644 +--- a/src/devices/nm-device.c ++++ b/src/devices/nm-device.c +@@ -76,6 +76,7 @@ _LOG_DECLARE_SELF (NMDevice); + + static void impl_device_disconnect (NMDevice *self, DBusGMethodInvocation *context); + static void impl_device_delete (NMDevice *self, DBusGMethodInvocation *context); ++static void ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data); + + #include "nm-device-glue.h" + +@@ -164,6 +165,9 @@ typedef struct { + guint timeout; + guint watch; + GPid pid; ++ const char *binary; ++ const char *address; ++ guint deadline; + } PingInfo; + + typedef struct { +@@ -6108,19 +6112,67 @@ ip_check_gw_ping_cleanup (NMDevice *self) + { + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + +- if (priv->gw_ping.watch) { +- g_source_remove (priv->gw_ping.watch); +- priv->gw_ping.watch = 0; +- } +- if (priv->gw_ping.timeout) { +- g_source_remove (priv->gw_ping.timeout); +- priv->gw_ping.timeout = 0; +- } ++ nm_clear_g_source (&priv->gw_ping.watch); ++ nm_clear_g_source (&priv->gw_ping.timeout); + + if (priv->gw_ping.pid) { + nm_utils_kill_child_async (priv->gw_ping.pid, SIGTERM, priv->gw_ping.log_domain, "ping", 1000, NULL, NULL); + priv->gw_ping.pid = 0; + } ++ ++ g_clear_pointer (&priv->gw_ping.binary, g_free); ++ g_clear_pointer (&priv->gw_ping.address, g_free); ++} ++ ++static gboolean ++spawn_ping (NMDevice *self) ++{ ++ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); ++ gs_free char *str_timeout = NULL; ++ gs_free char *tmp_str = NULL; ++ const char *args[] = { priv->gw_ping.binary, "-I", nm_device_get_ip_iface (self), ++ "-c", "1", "-w", NULL, priv->gw_ping.address, NULL }; ++ gs_free_error GError *error = NULL; ++ gboolean ret; ++ ++ args[6] = str_timeout = g_strdup_printf ("%u", priv->gw_ping.deadline); ++ tmp_str = g_strjoinv (" ", (gchar **) args); ++ _LOGD (priv->gw_ping.log_domain, "ping: running '%s'", tmp_str); ++ ++ ret = g_spawn_async ("/", ++ (gchar **) args, ++ NULL, ++ G_SPAWN_DO_NOT_REAP_CHILD, ++ NULL, ++ NULL, ++ &priv->gw_ping.pid, ++ &error); ++ ++ if (!ret) { ++ _LOGW (priv->gw_ping.log_domain, "ping: could not spawn %s: %s", ++ priv->gw_ping.binary, error->message); ++ } ++ ++ return ret; ++} ++ ++static gboolean ++respawn_ping_cb (gpointer user_data) ++{ ++ NMDevice *self = NM_DEVICE (user_data); ++ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); ++ ++ priv->gw_ping.watch = 0; ++ ++ if (spawn_ping (self)) { ++ priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid, ++ ip_check_ping_watch_cb, self); ++ } else { ++ ip_check_gw_ping_cleanup (self); ++ ip_check_pre_up (self); ++ } ++ ++ return FALSE; + } + + static void +@@ -6129,6 +6181,7 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data) + NMDevice *self = NM_DEVICE (user_data); + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); + guint log_domain = priv->gw_ping.log_domain; ++ gboolean success = FALSE; + + if (!priv->gw_ping.watch) + return; +@@ -6136,18 +6189,25 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data) + priv->gw_ping.pid = 0; + + if (WIFEXITED (status)) { +- if (WEXITSTATUS (status) == 0) ++ if (WEXITSTATUS (status) == 0) { + _LOGD (log_domain, "ping: gateway ping succeeded"); +- else { ++ success = TRUE; ++ } else { + _LOGW (log_domain, "ping: gateway ping failed with error code %d", + WEXITSTATUS (status)); + } + } else + _LOGW (log_domain, "ping: stopped unexpectedly with status %d", status); + +- /* We've got connectivity, proceed to pre_up */ +- ip_check_gw_ping_cleanup (self); +- ip_check_pre_up (self); ++ if (success) { ++ /* We've got connectivity, proceed to pre_up */ ++ ip_check_gw_ping_cleanup (self); ++ ip_check_pre_up (self); ++ } else { ++ /* If ping exited with an error it may have returned early, ++ * wait 1 second and restart it */ ++ priv->gw_ping.watch = g_timeout_add_seconds (1, respawn_ping_cb, self); ++ } + } + + static gboolean +@@ -6166,46 +6226,30 @@ ip_check_ping_timeout_cb (gpointer user_data) + } + + static gboolean +-spawn_ping (NMDevice *self, +- guint log_domain, ++start_ping (NMDevice *self, ++ NMLogDomain log_domain, + const char *binary, + const char *address, + guint timeout) + { + NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self); +- const char *args[] = { binary, "-I", nm_device_get_ip_iface (self), "-c", "1", "-w", NULL, address, NULL }; +- GError *error = NULL; +- char *str_timeout; +- gs_free char *tmp_str = NULL; +- gboolean success; + + g_return_val_if_fail (priv->gw_ping.watch == 0, FALSE); + g_return_val_if_fail (priv->gw_ping.timeout == 0, FALSE); + +- args[6] = str_timeout = g_strdup_printf ("%u", timeout); +- +- _LOGD (log_domain, "ping: running '%s'", +- (tmp_str = g_strjoinv (" ", (gchar **) args))); ++ priv->gw_ping.log_domain = log_domain; ++ priv->gw_ping.address = g_strdup (address); ++ priv->gw_ping.binary = g_strdup (binary); ++ priv->gw_ping.deadline = timeout + 10; /* the proper termination is enforced by a timer */ + +- success = g_spawn_async ("/", +- (gchar **) args, +- NULL, +- G_SPAWN_DO_NOT_REAP_CHILD, +- nm_unblock_posix_signals, +- NULL, +- &priv->gw_ping.pid, +- &error); +- if (success) { +- priv->gw_ping.log_domain = log_domain; ++ if (spawn_ping (self)) { + priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid, ip_check_ping_watch_cb, self); +- priv->gw_ping.timeout = g_timeout_add_seconds (timeout + 1, ip_check_ping_timeout_cb, self); +- } else { +- _LOGW (log_domain, "ping: could not spawn %s: %s", binary, error->message); +- g_clear_error (&error); ++ priv->gw_ping.timeout = g_timeout_add_seconds (timeout, ip_check_ping_timeout_cb, self); ++ return TRUE; + } + +- g_free (str_timeout); +- return success; ++ ip_check_gw_ping_cleanup (self); ++ return FALSE; + } + + static void +@@ -6258,7 +6302,7 @@ nm_device_start_ip_check (NMDevice *self) + } + + if (buf[0]) +- spawn_ping (self, log_domain, ping_binary, buf, timeout); ++ start_ping (self, log_domain, ping_binary, buf, timeout); + + /* If no ping was started, just advance to pre_up */ + if (!priv->gw_ping.pid) +-- +2.4.3 + diff --git a/SPECS/NetworkManager.spec b/SPECS/NetworkManager.spec index 4e1b5c9..8c0b35a 100644 --- a/SPECS/NetworkManager.spec +++ b/SPECS/NetworkManager.spec @@ -10,7 +10,7 @@ %define snapshot .git20150121 %define git_sha b4ea599c %define realversion 1.0.0 -%define release_version 14 +%define release_version 16 %define epoch_version 1 %define obsoletes_nmver 1:1.0.0-1 @@ -83,6 +83,8 @@ Patch4: 0004-bridge-route-metric.patch Patch5: 0005-schedule-early-config.patch Patch6: 0006-rh1184997-ip6ll-flush.patch Patch7: 0007-rh1160013-rules-subpackage.patch +Patch8: 0008-rh1224366-fix-valid-path-assertion.patch +Patch9: 0009-rh1128581-respawn-ping-on-error.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -369,6 +371,8 @@ by nm-connection-editor and nm-applet in a non-graphical environment. %patch5 -p1 -b .0005-schedule-early-config.orig %patch6 -p1 -b .0006-rh1184997-ip6ll-flush.orig %patch7 -p1 -b .0007.rh1160013.rules-subpackage.orig +%patch8 -p1 -b .0008-rh1224366-fix-valid-path-assertion.orig +%patch9 -p1 -b .0009-rh1128581-respawn-ping-on-error.orig %build @@ -670,6 +674,12 @@ fi %endif %changelog +* Tue Jul 14 2015 Beniamino Galvani - 1:1.0.0-16.git20150121.b4ea599c +- device: restart ping process when it exits with an error (rh #1128581) + +* Tue Jul 7 2015 Jiří Klimeš - 1:1.0.0-15.git20150121.b4ea599c +- device: call device_link_changed in an idle handler to fix a potential crash (rh #1224366) + * Thu Jan 29 2015 Dan Winship - 1:1.0.0-14.git20150121.b4ea599c - dispatcher: split routing rules script into a subpackage (rh #1160013)