From a3ae10b40084a3aa6313f5084b8cf0f9312ca148 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Oct 29 2014 13:21:10 +0000 Subject: platform: fix a routing-related bug that could cause NM and other apps to spin (rh #1151665) --- diff --git a/0006-platform-deal-with-default-route-being-passed-to-rou.patch b/0006-platform-deal-with-default-route-being-passed-to-rou.patch new file mode 100644 index 0000000..8c86bf7 --- /dev/null +++ b/0006-platform-deal-with-default-route-being-passed-to-rou.patch @@ -0,0 +1,73 @@ +From ace746df4e2936ab50224d9fbef88025b69d2379 Mon Sep 17 00:00:00 2001 +From: Dan Winship +Date: Fri, 24 Oct 2014 13:48:46 -0400 +Subject: [PATCH] platform: deal with default route being passed to + route_sync() (bgo 735325) + +NMIP4Configs and NMIP6Configs are never supposed to contain a default +route, and thus nm_platform_ip6_route_sync() should never have to deal +with one. Unfortunately, if it *does* get passed a default route, it +will add it even if it was already there. This will result in an +RTM_NEWROUTE notification, which will cause NMPlatform to emit +ip6-route-changed, which will result in NMDevice doing some work and +then calling nm_ip6_config_commit(), which will result in NMIP6Config +passing the same list of routes to nm_platform_ip6_route_sync() again, +including the default route, which will cause NMPlatform to add the +route again... + +(Something eventually causes this cycle to get broken, but it starts +up again the next time NM receives an RA.) + +Fix this by having the route_sync() functions never add/modify the +default route (They were already not deleting it.) +--- + src/platform/nm-platform.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c +index 75e6448..5d478e8 100644 +--- a/src/platform/nm-platform.c ++++ b/src/platform/nm-platform.c +@@ -1908,6 +1908,9 @@ array_contains_ip6_route (const GArray *routes, const NMPlatformIP6Route *route) + * with the least possible disturbance. It simply removes routes that are + * not listed and adds routes that are. + * ++ * @known_routes should not contain a default route; if it does, it will be ++ * ignored. ++ * + * Returns: %TRUE on success. + */ + gboolean +@@ -1938,6 +1941,9 @@ nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes) + for (i = 0; i < known_routes->len && success; i++) { + known_route = &g_array_index (known_routes, NMPlatformIP4Route, i); + ++ if (known_route->plen == 0) ++ continue; ++ + if ((known_route->gateway == 0) ^ (i_type != 0)) { + /* Make two runs over the list of routes. On the first, only add + * device routes, on the second the others (gateway routes). */ +@@ -1975,6 +1981,9 @@ nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes) + * with the least possible disturbance. It simply removes routes that are + * not listed and adds routes that are. + * ++ * @known_routes should not contain a default route; if it does, it will be ++ * ignored. ++ * + * Returns: %TRUE on success. + */ + gboolean +@@ -2006,6 +2015,9 @@ nm_platform_ip6_route_sync (int ifindex, const GArray *known_routes) + for (i = 0; i < known_routes->len && success; i++) { + known_route = &g_array_index (known_routes, NMPlatformIP6Route, i); + ++ if (known_route->plen == 0) ++ continue; ++ + if (IN6_IS_ADDR_UNSPECIFIED (&known_route->gateway) ^ (i_type != 0)) { + /* Make two runs over the list of routes. On the first, only add + * device routes, on the second the others (gateway routes). */ +-- +1.9.3 + diff --git a/NetworkManager.spec b/NetworkManager.spec index e667be9..b5e5c90 100644 --- a/NetworkManager.spec +++ b/NetworkManager.spec @@ -13,7 +13,7 @@ %define snapshot .git20140704 %define git_sha 6eb82acd %define realversion 0.9.10.0 -%define release_version 11 +%define release_version 12 %define epoch_version 1 %define obsoletes_nmver 1:0.9.9.95-1 @@ -87,6 +87,7 @@ Patch2: 0002-bluez-split-out-errors.patch Patch3: 0003-bluez-track-adapter-address-in-NMBluezDevice.patch Patch4: 0004-bluez-re-add-DUN-support-for-Bluez5.patch Patch5: 0005-core-only-set-IPv6-hop_limit-for-values-greater-than.patch +Patch6: 0006-platform-deal-with-default-route-being-passed-to-rou.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -330,6 +331,7 @@ by nm-connection-editor and nm-applet in a non-graphical environment. %patch3 -p1 -b .bluez-track-adapter-address-in-NMBluezDevice.orig %patch4 -p1 -b .bluez-re-add-DUN-support-for-Bluez5.orig %patch5 -p1 -b .core-only-set-IPv6-hop_limit-for-values-greater-than.orig +%patch6 -p1 -b .default-route-spam %build @@ -601,6 +603,9 @@ fi %endif %changelog +* Wed Oct 29 2014 Dan Winship - 1:0.9.10.0-12.git20140704 +- platform: fix a routing-related bug that could cause NM and other apps to spin (rh #1151665) + * Wed Oct 29 2014 Lubomir Rintel 1:0.9.10.0-11.git20140704 - Fix IPv6 next hop default setting