diff options
| author | Michael Biebl <biebl@debian.org> | 2012-06-29 20:23:49 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2012-06-29 20:23:49 +0200 |
| commit | 038b9f5fcfedd9c117fc69f164e5b1c04efb0aca (patch) | |
| tree | 7ae78f00ab213935e0228160c8eafd1d18409741 /debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch | |
| parent | 07c27d7af60c699c93e47e83582b5b0369049c54 (diff) | |
Update patches.
* debian/patches/02-dbus_access_network_manager.patch: Updated. * Remove patches which have been merged upstream.
Diffstat (limited to 'debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch')
| -rw-r--r-- | debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch | 120 |
1 files changed, 0 insertions, 120 deletions
diff --git a/debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch b/debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch deleted file mode 100644 index 552976c2..00000000 --- a/debian/patches/13-dont-replace-kernel-default-route-for-IPv6.patch +++ /dev/null @@ -1,120 +0,0 @@ -commit 77de91e5a8b1c1993ae65c54b37e0411e78e6fe6 -Author: Dan Winship <danw@gnome.org> -Date: Thu Apr 19 14:27:12 2012 -0400 - - core: don't fight with the kernel over the default IPv6 route - - The kernel wants there to be a default route over every RA-ed IPv6 - interface, and it gets confused and annoyed if we remove that default - route and replace it with our own (causing it to effectively drop all - further RAs on the floor, which is particularly bad if some of the - information in the earlier RA had an expiration time). - - So, rather than replacing the kernel's default route(s), just add an - additional one of our own, with a lower (ie, higher priority) metric. - - https://bugzilla.redhat.com/show_bug.cgi?id=785772 - -diff --git a/src/nm-system.c b/src/nm-system.c -index 91153ec..4cebb13 100644 ---- a/src/nm-system.c -+++ b/src/nm-system.c -@@ -1023,7 +1023,7 @@ add_ip6_route_to_gateway (int ifindex, const struct in6_addr *gw) - } - - static int --replace_default_ip6_route (int ifindex, const struct in6_addr *gw) -+add_default_ip6_route (int ifindex, const struct in6_addr *gw) - { - struct rtnl_route *route = NULL; - struct nl_sock *nlh; -@@ -1037,22 +1037,36 @@ replace_default_ip6_route (int ifindex, const struct in6_addr *gw) - route = nm_netlink_route_new (ifindex, AF_INET6, 0, - NMNL_PROP_SCOPE, RT_SCOPE_UNIVERSE, - NMNL_PROP_TABLE, RT_TABLE_MAIN, -+ NMNL_PROP_PRIO, 1, - NULL); - g_return_val_if_fail (route != NULL, -ENOMEM); - - /* Add the new default route */ -- err = nm_netlink_route6_add (route, &in6addr_any, 0, gw, NLM_F_REPLACE); -- if (err == -NLE_EXIST) { -- /* FIXME: even though we use NLM_F_REPLACE the kernel won't replace -- * the route if it's the same. Suppress the pointless error. -- */ -+ err = nm_netlink_route6_add (route, &in6addr_any, 0, gw, NLM_F_CREATE); -+ if (err == -NLE_EXIST) - err = 0; -- } - - rtnl_route_put (route); - return err; - } - -+static struct rtnl_route * -+find_static_default_routes (struct rtnl_route *route, -+ struct nl_addr *dst, -+ const char *iface, -+ gpointer user_data) -+{ -+ GList **def_routes = user_data; -+ -+ if ( nl_addr_get_prefixlen (dst) == 0 -+ && rtnl_route_get_protocol (route) == RTPROT_STATIC) { -+ rtnl_route_get (route); -+ *def_routes = g_list_prepend (*def_routes, route); -+ } -+ -+ return NULL; -+} -+ - /* - * nm_system_replace_default_ip6_route - * -@@ -1062,12 +1076,35 @@ replace_default_ip6_route (int ifindex, const struct in6_addr *gw) - gboolean - nm_system_replace_default_ip6_route (int ifindex, const struct in6_addr *gw) - { -- struct rtnl_route *gw_route = NULL; -+ GList *def_routes, *iter; -+ struct rtnl_route *route, *gw_route = NULL; - gboolean success = FALSE; - char *iface; - int err; - -- err = replace_default_ip6_route (ifindex, gw); -+ /* We can't just use NLM_F_REPLACE here like in the IPv4 case, because -+ * the kernel doesn't like it if we replace the default routes it -+ * creates. (See rh#785772.) So we delete any non-kernel default routes, -+ * and then add a new default route of our own with a lower metric than -+ * the kernel ones. -+ */ -+ def_routes = NULL; -+ nm_netlink_foreach_route (ifindex, AF_INET6, RT_SCOPE_UNIVERSE, TRUE, -+ find_static_default_routes, &def_routes); -+ for (iter = def_routes; iter; iter = iter->next) { -+ route = iter->data; -+ if (!nm_netlink_route_delete (route)) { -+ iface = nm_netlink_index_to_iface (ifindex); -+ nm_log_err (LOGD_DEVICE | LOGD_IP6, -+ "(%s): failed to delete existing IPv6 default route", -+ iface); -+ g_free (iface); -+ } -+ rtnl_route_put (route); -+ } -+ g_list_free (def_routes); -+ -+ err = add_default_ip6_route (ifindex, gw); - if (err == 0) - return TRUE; - -@@ -1091,7 +1128,7 @@ nm_system_replace_default_ip6_route (int ifindex, const struct in6_addr *gw) - goto out; - - /* Try adding the original route again */ -- err = replace_default_ip6_route (ifindex, gw); -+ err = add_default_ip6_route (ifindex, gw); - if (err != 0) { - nm_netlink_route_delete (gw_route); - nm_log_err (LOGD_DEVICE | LOGD_IP6, |