1 |
tetromino 12/07/04 07:56:22 |
2 |
|
3 |
Added: networkmanager-0.9.4.0-ipv6-route.patch |
4 |
01-org.freedesktop.NetworkManager.settings.modify.system.rules |
5 |
Removed: networkmanager-0.9.4.0-force-libnl1.1.patch |
6 |
Log: |
7 |
Fix default ipv6 route issue on some networks (bug #417529, thanks to Marien Zwart). Install polkit-1/rules.d file for polkit-0.106 support (bug #421577, thanks to Samuli Suominen). Add epatch_user to make it easier for users to locally patch networkmanager. Drop old. |
8 |
|
9 |
(Portage version: 2.2.0_alpha115/cvs/Linux x86_64) |
10 |
|
11 |
Revision Changes Path |
12 |
1.1 net-misc/networkmanager/files/networkmanager-0.9.4.0-ipv6-route.patch |
13 |
|
14 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager/files/networkmanager-0.9.4.0-ipv6-route.patch?rev=1.1&view=markup |
15 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager/files/networkmanager-0.9.4.0-ipv6-route.patch?rev=1.1&content-type=text/plain |
16 |
|
17 |
Index: networkmanager-0.9.4.0-ipv6-route.patch |
18 |
=================================================================== |
19 |
From 77de91e5a8b1c1993ae65c54b37e0411e78e6fe6 Mon Sep 17 00:00:00 2001 |
20 |
From: Dan Winship <danw@×××××.org> |
21 |
Date: Thu, 19 Apr 2012 14:27:12 -0400 |
22 |
Subject: [PATCH] core: don't fight with the kernel over the default IPv6 |
23 |
route |
24 |
|
25 |
The kernel wants there to be a default route over every RA-ed IPv6 |
26 |
interface, and it gets confused and annoyed if we remove that default |
27 |
route and replace it with our own (causing it to effectively drop all |
28 |
further RAs on the floor, which is particularly bad if some of the |
29 |
information in the earlier RA had an expiration time). |
30 |
|
31 |
So, rather than replacing the kernel's default route(s), just add an |
32 |
additional one of our own, with a lower (ie, higher priority) metric. |
33 |
|
34 |
https://bugzilla.redhat.com/show_bug.cgi?id=785772 |
35 |
--- |
36 |
src/nm-system.c | 57 +++++++++++++++++++++++++++++++++++++++++++++--------- |
37 |
1 files changed, 47 insertions(+), 10 deletions(-) |
38 |
|
39 |
diff --git a/src/nm-system.c b/src/nm-system.c |
40 |
index 91153ec..4cebb13 100644 |
41 |
--- a/src/nm-system.c |
42 |
+++ b/src/nm-system.c |
43 |
@@ -1023,7 +1023,7 @@ add_ip6_route_to_gateway (int ifindex, const struct in6_addr *gw) |
44 |
} |
45 |
|
46 |
static int |
47 |
-replace_default_ip6_route (int ifindex, const struct in6_addr *gw) |
48 |
+add_default_ip6_route (int ifindex, const struct in6_addr *gw) |
49 |
{ |
50 |
struct rtnl_route *route = NULL; |
51 |
struct nl_sock *nlh; |
52 |
@@ -1037,22 +1037,36 @@ replace_default_ip6_route (int ifindex, const struct in6_addr *gw) |
53 |
route = nm_netlink_route_new (ifindex, AF_INET6, 0, |
54 |
NMNL_PROP_SCOPE, RT_SCOPE_UNIVERSE, |
55 |
NMNL_PROP_TABLE, RT_TABLE_MAIN, |
56 |
+ NMNL_PROP_PRIO, 1, |
57 |
NULL); |
58 |
g_return_val_if_fail (route != NULL, -ENOMEM); |
59 |
|
60 |
/* Add the new default route */ |
61 |
- err = nm_netlink_route6_add (route, &in6addr_any, 0, gw, NLM_F_REPLACE); |
62 |
- if (err == -NLE_EXIST) { |
63 |
- /* FIXME: even though we use NLM_F_REPLACE the kernel won't replace |
64 |
- * the route if it's the same. Suppress the pointless error. |
65 |
- */ |
66 |
+ err = nm_netlink_route6_add (route, &in6addr_any, 0, gw, NLM_F_CREATE); |
67 |
+ if (err == -NLE_EXIST) |
68 |
err = 0; |
69 |
- } |
70 |
|
71 |
rtnl_route_put (route); |
72 |
return err; |
73 |
} |
74 |
|
75 |
+static struct rtnl_route * |
76 |
+find_static_default_routes (struct rtnl_route *route, |
77 |
+ struct nl_addr *dst, |
78 |
+ const char *iface, |
79 |
+ gpointer user_data) |
80 |
+{ |
81 |
+ GList **def_routes = user_data; |
82 |
+ |
83 |
+ if ( nl_addr_get_prefixlen (dst) == 0 |
84 |
+ && rtnl_route_get_protocol (route) == RTPROT_STATIC) { |
85 |
+ rtnl_route_get (route); |
86 |
+ *def_routes = g_list_prepend (*def_routes, route); |
87 |
+ } |
88 |
+ |
89 |
+ return NULL; |
90 |
+} |
91 |
+ |
92 |
/* |
93 |
* nm_system_replace_default_ip6_route |
94 |
* |
95 |
@@ -1062,12 +1076,35 @@ replace_default_ip6_route (int ifindex, const struct in6_addr *gw) |
96 |
gboolean |
97 |
nm_system_replace_default_ip6_route (int ifindex, const struct in6_addr *gw) |
98 |
{ |
99 |
- struct rtnl_route *gw_route = NULL; |
100 |
+ GList *def_routes, *iter; |
101 |
+ struct rtnl_route *route, *gw_route = NULL; |
102 |
gboolean success = FALSE; |
103 |
char *iface; |
104 |
int err; |
105 |
|
106 |
- err = replace_default_ip6_route (ifindex, gw); |
107 |
+ /* We can't just use NLM_F_REPLACE here like in the IPv4 case, because |
108 |
+ * the kernel doesn't like it if we replace the default routes it |
109 |
+ * creates. (See rh#785772.) So we delete any non-kernel default routes, |
110 |
+ * and then add a new default route of our own with a lower metric than |
111 |
+ * the kernel ones. |
112 |
+ */ |
113 |
+ def_routes = NULL; |
114 |
+ nm_netlink_foreach_route (ifindex, AF_INET6, RT_SCOPE_UNIVERSE, TRUE, |
115 |
+ find_static_default_routes, &def_routes); |
116 |
+ for (iter = def_routes; iter; iter = iter->next) { |
117 |
+ route = iter->data; |
118 |
+ if (!nm_netlink_route_delete (route)) { |
119 |
+ iface = nm_netlink_index_to_iface (ifindex); |
120 |
+ nm_log_err (LOGD_DEVICE | LOGD_IP6, |
121 |
+ "(%s): failed to delete existing IPv6 default route", |
122 |
+ iface); |
123 |
+ g_free (iface); |
124 |
+ } |
125 |
+ rtnl_route_put (route); |
126 |
+ } |
127 |
+ g_list_free (def_routes); |
128 |
+ |
129 |
+ err = add_default_ip6_route (ifindex, gw); |
130 |
if (err == 0) |
131 |
return TRUE; |
132 |
|
133 |
@@ -1091,7 +1128,7 @@ nm_system_replace_default_ip6_route (int ifindex, const struct in6_addr *gw) |
134 |
goto out; |
135 |
|
136 |
/* Try adding the original route again */ |
137 |
- err = replace_default_ip6_route (ifindex, gw); |
138 |
+ err = add_default_ip6_route (ifindex, gw); |
139 |
if (err != 0) { |
140 |
nm_netlink_route_delete (gw_route); |
141 |
nm_log_err (LOGD_DEVICE | LOGD_IP6, |
142 |
-- |
143 |
1.7.8.6 |
144 |
|
145 |
|
146 |
|
147 |
|
148 |
1.1 net-misc/networkmanager/files/01-org.freedesktop.NetworkManager.settings.modify.system.rules |
149 |
|
150 |
file : http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager/files/01-org.freedesktop.NetworkManager.settings.modify.system.rules?rev=1.1&view=markup |
151 |
plain: http://sources.gentoo.org/viewvc.cgi/gentoo-x86/net-misc/networkmanager/files/01-org.freedesktop.NetworkManager.settings.modify.system.rules?rev=1.1&content-type=text/plain |
152 |
|
153 |
Index: 01-org.freedesktop.NetworkManager.settings.modify.system.rules |
154 |
=================================================================== |
155 |
// Let users in plugdev group modify NetworkManager |
156 |
polkit.addRule(function(action, subject) { |
157 |
if (action.id == "org.freedesktop.NetworkManager.settings.modify.system" && |
158 |
subject.isInGroup("plugdev") && subject.active) { |
159 |
return "yes"; |
160 |
} |
161 |
}); |