[NetworkManager/f20] Fix various problems
Jirka Klimes
jklimes at fedoraproject.org
Tue Jan 28 14:48:56 UTC 2014
commit 25f86691e2118eee26908373434aa58ba4c750ad
Author: Jiří Klimeš <jklimes at redhat.com>
Date: Tue Jan 28 15:19:12 2014 +0100
Fix various problems
- core: fix reading physical port id for sysfs
- libnm-glib: export get_gateway() and get_searches() functions
- libnm-glib: new functions for bindings to get nameservers
- libnm-glib: chain up the parent constructed() of NMRemoteConnection
- core: exit cleanly if D-Bus cannot be initialized (rh #1057738)
- dhcp: don't add an IPv6 address if one wasn't given (rh #1048046)
- core: Add host route for DHCP4 server if outside assigned subnet (bgo #721767) (rh #983325)
- vpn: handle missing tunnel interface for IP-based VPNs (bgo #721724) (rh #1030068) (rh #865883)
- core: only log about IPv6 Commit the first time (rh #1044757)
NetworkManager.spec | 33 ++++-
core-log-ipv6-commit.patch | 94 ++++++++++
export-missing-libnm-glib-funcs.patch | 45 +++++
fix-read-phys-port-id.patch | 32 ++++
get-ip-examples.patch | 98 ++++++++++
get-nameservers.patch | 145 +++++++++++++++
rem-con-constructed.patch | 31 +++
rh1030068-vpn-tunnel-interface.patch | 293 ++++++++++++++++++++++++++++++
rh1048046-dhcp-no-ipv6.patch | 61 ++++++
rh1057738-dbus-clean-exit.patch | 203 +++++++++++++++++++++
rh983325-add-route-for-dhcp-server.patch | 83 +++++++++
11 files changed, 1117 insertions(+), 1 deletions(-)
---
diff --git a/NetworkManager.spec b/NetworkManager.spec
index 1e47cad..c8512d0 100644
--- a/NetworkManager.spec
+++ b/NetworkManager.spec
@@ -19,7 +19,7 @@ Name: NetworkManager
Summary: Network connection manager and user applications
Epoch: 1
Version: 0.9.9.0
-Release: 26%{snapshot}%{?dist}
+Release: 27%{snapshot}%{?dist}
Group: System Environment/Base
License: GPLv2+
URL: http://www.gnome.org/projects/NetworkManager/
@@ -56,6 +56,16 @@ Patch26: rh1036132-VPN-active-con-info.patch
Patch27: rh1031574-primary-connection.patch
Patch28: physical-port-id.patch
Patch29: gi-fix-for-ipv6.patch
+Patch30: fix-read-phys-port-id.patch
+Patch31: export-missing-libnm-glib-funcs.patch
+Patch32: get-nameservers.patch
+Patch33: get-ip-examples.patch
+Patch34: rem-con-constructed.patch
+Patch35: rh1057738-dbus-clean-exit.patch
+Patch36: rh1048046-dhcp-no-ipv6.patch
+Patch37: rh983325-add-route-for-dhcp-server.patch
+Patch38: rh1030068-vpn-tunnel-interface.patch
+Patch39: core-log-ipv6-commit.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -208,6 +218,16 @@ deployments.
%patch27 -p1 -b .primary-connection
%patch28 -p1 -b .physical-port-id
%patch29 -p1 -b .gi-fix-for-ipv6
+%patch30 -p1 -b .fix-read-phys-port-id
+%patch31 -p1 -b .export-missing-libnm-glib-funcs
+%patch32 -p1 -b .get-nameservers
+%patch33 -p1 -b .get-ip-examples
+%patch34 -p1 -b .rem-con-constructed
+%patch35 -p1 -b .rh1057738-dbus-clean-exit
+%patch36 -p1 -b .rh1048046-dhcp-no-ipv6
+%patch37 -p1 -b .rh983325-add-route-for-dhcp-server
+%patch38 -p1 -b .rh1030068-vpn-tunnel-interface
+%patch39 -p1 -b .core-log-ipv6-commit
%build
@@ -406,6 +426,17 @@ fi
%config %{_sysconfdir}/%{name}/conf.d/00-server.conf
%changelog
+* Tue Jan 28 2014 Jiří Klimeš <jklimes at redhat.com> - 0.9.9.0-27.git20131003
+- core: fix reading physical port id for sysfs
+- libnm-glib: export get_gateway() and get_searches() functions
+- libnm-glib: new functions for bindings to get nameservers
+- libnm-glib: chain up the parent constructed() of NMRemoteConnection
+- core: exit cleanly if D-Bus cannot be initialized (rh #1057738)
+- dhcp: don't add an IPv6 address if one wasn't given (rh #1048046)
+- core: Add host route for DHCP4 server if outside assigned subnet (bgo #721767) (rh #983325)
+- vpn: handle missing tunnel interface for IP-based VPNs (bgo #721724) (rh #1030068) (rh #865883)
+- core: only log about IPv6 Commit the first time (rh #1044757)
+
* Tue Jan 21 2014 Jiří Klimeš <jklimes at redhat.com> - 0.9.9.0-26.git20131003
- core: improve handling of NPAR/SR-IOV devices (rh #804527)
- libnm-glib: add NMDevice:physical-port-id property
diff --git a/core-log-ipv6-commit.patch b/core-log-ipv6-commit.patch
new file mode 100644
index 0000000..5cbeb00
--- /dev/null
+++ b/core-log-ipv6-commit.patch
@@ -0,0 +1,94 @@
+From 13f4a00d4d490fb65f93c246d1c93ed56a47213f Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Thu, 23 Jan 2014 13:02:16 -0600
+Subject: [PATCH] core: only log about IPv6 Commit the first time
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Since IPv6 configuration gets updated every time a router advertisement
+comes in, it can lead NM to continuously logging:
+
+NetworkManager: <info> Activation (eth0) Stage 5 of 5 (IPv6 Commit) scheduled...
+NetworkManager: <info> Activation (eth0) Stage 5 of 5 (IPv6 Commit) started...
+NetworkManager: <info> Activation (eth0) Stage 5 of 5 (IPv6 Commit) complete.
+
+that's annoying. So after the initial configuration is done, make
+subsequent IPv6 Commit log messages debug instead of info.
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/devices/nm-device.c | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
+index 035434e..4684efe 100644
+--- a/src/devices/nm-device.c
++++ b/src/devices/nm-device.c
+@@ -335,8 +335,6 @@ static gboolean nm_device_set_ip6_config (NMDevice *dev,
+ gboolean commit,
+ NMDeviceStateReason *reason);
+
+-static gboolean nm_device_activate_ip6_config_commit (gpointer user_data);
+-
+ static gboolean check_connection_available (NMDevice *device, NMConnection *connection);
+
+ static gboolean spec_match_list (NMDevice *device, const GSList *specs);
+@@ -4232,6 +4230,7 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
+ {
+ NMDevice *self = NM_DEVICE (user_data);
+ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
++ guint level = (priv->ip6_state == IP_DONE) ? LOGL_DEBUG : LOGL_INFO;
+ NMActRequest *req;
+ const char *iface;
+ NMConnection *connection;
+@@ -4241,8 +4240,7 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
+ activation_source_clear (self, FALSE, AF_INET6);
+
+ iface = nm_device_get_iface (self);
+- nm_log_info (LOGD_DEVICE, "Activation (%s) Stage 5 of 5 (IPv6 Commit) started...",
+- iface);
++ nm_log (LOGD_DEVICE, level, "Activation (%s) Stage 5 of 5 (IPv6 Commit) started...", iface);
+
+ req = nm_device_get_act_request (self);
+ g_assert (req);
+@@ -4262,14 +4260,13 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
+ if (nm_device_get_state (self) == NM_DEVICE_STATE_IP_CONFIG)
+ nm_device_state_changed (self, NM_DEVICE_STATE_IP_CHECK, NM_DEVICE_STATE_REASON_NONE);
+ } else {
+- nm_log_info (LOGD_DEVICE | LOGD_IP6,
++ nm_log_warn (LOGD_DEVICE | LOGD_IP6,
+ "Activation (%s) Stage 5 of 5 (IPv6 Commit) failed",
+ iface);
+ nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, reason);
+ }
+
+- nm_log_info (LOGD_DEVICE, "Activation (%s) Stage 5 of 5 (IPv6 Commit) complete.",
+- iface);
++ nm_log (LOGD_DEVICE, level, "Activation (%s) Stage 5 of 5 (IPv6 Commit) complete.", iface);
+
+ return FALSE;
+ }
+@@ -4277,13 +4274,16 @@ nm_device_activate_ip6_config_commit (gpointer user_data)
+ void
+ nm_device_activate_schedule_ip6_config_result (NMDevice *self)
+ {
++ NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
++ guint level = (priv->ip6_state == IP_DONE) ? LOGL_DEBUG : LOGL_INFO;
++
+ g_return_if_fail (NM_IS_DEVICE (self));
+
+ activation_source_schedule (self, nm_device_activate_ip6_config_commit, AF_INET6);
+
+- nm_log_info (LOGD_DEVICE | LOGD_IP6,
+- "Activation (%s) Stage 5 of 5 (IPv6 Commit) scheduled...",
+- nm_device_get_iface (self));
++ nm_log (LOGD_DEVICE | LOGD_IP6, level,
++ "Activation (%s) Stage 5 of 5 (IPv6 Commit) scheduled...",
++ nm_device_get_iface (self));
+ }
+
+ gboolean
+--
+1.7.11.7
+
diff --git a/export-missing-libnm-glib-funcs.patch b/export-missing-libnm-glib-funcs.patch
new file mode 100644
index 0000000..4820929
--- /dev/null
+++ b/export-missing-libnm-glib-funcs.patch
@@ -0,0 +1,45 @@
+From 3391fa810ca323203b036a68af7f3c5802280918 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes at redhat.com>
+Date: Wed, 22 Jan 2014 10:03:44 +0100
+Subject: [PATCH] libnm-glib: export missing get_gateway() and get_searches()
+ functions
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+They were added by db9b7e10aca5456ec4960b75617e032209b98bc1 commit.
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ libnm-glib/libnm-glib.ver | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver
+index cb7b599..bf69db4 100644
+--- a/libnm-glib/libnm-glib.ver
++++ b/libnm-glib/libnm-glib.ver
+@@ -215,8 +215,10 @@ global:
+ nm_dhcp6_config_new;
+ nm_ip4_config_get_addresses;
+ nm_ip4_config_get_domains;
++ nm_ip4_config_get_gateway;
+ nm_ip4_config_get_nameservers;
+ nm_ip4_config_get_routes;
++ nm_ip4_config_get_searches;
+ nm_ip4_config_get_type;
+ nm_ip4_config_get_wins_servers;
+ nm_ip4_config_new;
+@@ -224,8 +226,10 @@ global:
+ nm_ip6_address_object_array_get_type;
+ nm_ip6_config_get_addresses;
+ nm_ip6_config_get_domains;
++ nm_ip6_config_get_gateway;
+ nm_ip6_config_get_nameservers;
+ nm_ip6_config_get_routes;
++ nm_ip6_config_get_searches;
+ nm_ip6_config_get_type;
+ nm_ip6_config_new;
+ nm_ip6_route_object_array_get_type;
+--
+1.7.11.7
+
diff --git a/fix-read-phys-port-id.patch b/fix-read-phys-port-id.patch
new file mode 100644
index 0000000..93252f5
--- /dev/null
+++ b/fix-read-phys-port-id.patch
@@ -0,0 +1,32 @@
+From 041f449a910a48716bc88fa56287c4213a2dcb11 Mon Sep 17 00:00:00 2001
+From: Dan Winship <danw at gnome.org>
+Date: Wed, 22 Jan 2014 13:20:18 -0500
+Subject: [PATCH] platform: fix linux nm_platform_link_get_physical_port_id()
+ (rh #804527)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+It was reading the wrong property name
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/platform/nm-linux-platform.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
+index 83cbc49..8e85c59 100644
+--- a/src/platform/nm-linux-platform.c
++++ b/src/platform/nm-linux-platform.c
+@@ -1765,7 +1765,7 @@ link_get_physical_port_id (NMPlatform *platform, int ifindex)
+ if (!ifname)
+ return NULL;
+
+- path = g_strdup_printf ("/sys/class/net/%s/physical_port_id", ifname);
++ path = g_strdup_printf ("/sys/class/net/%s/phys_port_id", ifname);
+ if (g_file_test (path, G_FILE_TEST_EXISTS))
+ id = sysctl_get (platform, path);
+ else
+--
+1.7.11.7
+
diff --git a/get-ip-examples.patch b/get-ip-examples.patch
new file mode 100644
index 0000000..fa49253
--- /dev/null
+++ b/get-ip-examples.patch
@@ -0,0 +1,98 @@
+From 85272df6eb89682a3d13022281085b97527955e1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes at redhat.com>
+Date: Wed, 22 Jan 2014 15:40:22 +0100
+Subject: [PATCH] examples: update get_ips.py python example for DNS
+ information
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ examples/python/gi/get_ips.py | 44 +++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 40 insertions(+), 4 deletions(-)
+
+diff --git a/examples/python/gi/get_ips.py b/examples/python/gi/get_ips.py
+index b1e59e2..6903b6d 100755
+--- a/examples/python/gi/get_ips.py
++++ b/examples/python/gi/get_ips.py
+@@ -24,8 +24,8 @@ import sys, socket, struct
+ from gi.repository import GLib, NetworkManager, NMClient
+
+ #
+-# This example shows how to get get addresses and routes from NMIP4Config and NMIP6Config
+-# (got out of NMDevice)
++# This example shows how to get addresses, routes and DNS information
++# from NMIP4Config and NMIP6Config (got out of NMDevice)
+ #
+
+ def show_addresses(self, family):
+@@ -59,7 +59,6 @@ def show_addresses(self, family):
+ socket.inet_ntop(family, gateway_struct))
+
+
+-
+ def show_routes(self, family):
+ if (family == socket.AF_INET):
+ ip_cfg = self.get_ip4_config()
+@@ -70,7 +69,7 @@ def show_routes(self, family):
+ print("None")
+ return
+
+- nm_routes = ip_cfg.get_routes()
++ nm_routes = ip_cfg.get_routes()
+ if len(nm_routes) == 0:
+ print("None")
+ return
+@@ -93,6 +92,33 @@ def show_routes(self, family):
+ metric)
+
+
++def show_dns(self, family):
++ if (family == socket.AF_INET):
++ ip_cfg = self.get_ip4_config()
++ else:
++ ip_cfg = self.get_ip6_config()
++
++ if ip_cfg is None:
++ print("None")
++ return
++
++ if (family == socket.AF_INET):
++ print ("Domains: %s") % (ip_cfg.get_domains())
++ print ("Searches: %s") % (ip_cfg.get_searches())
++ print("Nameservers:")
++ nameservers = ip_cfg.get_nameservers()
++ for dns in nameservers:
++ print socket.inet_ntop(family, struct.pack("=I", dns))
++ else:
++ print ("Domains: %s") % (ip_cfg.get_domains())
++ print ("Searches: %s") % (ip_cfg.get_searches())
++ print("Nameservers:")
++ num = ip_cfg.get_num_nameservers()
++ for i in range(0,num):
++ dns = ip_cfg.get_nameserver(i)
++ print socket.inet_ntop(family, dns)
++
++
+ if __name__ == "__main__":
+ if len(sys.argv) != 2:
+ sys.exit('Usage: %s <interface>' % sys.argv[0])
+@@ -125,3 +151,13 @@ if __name__ == "__main__":
+ show_routes(dev, socket.AF_INET6)
+ print
+
++ print "IPv4 DNS:"
++ print("------------")
++ show_dns(dev, socket.AF_INET)
++ print
++
++ print "IPv6 DNS:"
++ print("------------")
++ show_dns(dev, socket.AF_INET6)
++ print
++
+--
+1.7.11.7
+
diff --git a/get-nameservers.patch b/get-nameservers.patch
new file mode 100644
index 0000000..b7e7ace
--- /dev/null
+++ b/get-nameservers.patch
@@ -0,0 +1,145 @@
+From 8ee4f58e9ee67df2ef761a691dec55c6008ad4ff Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes at redhat.com>
+Date: Wed, 22 Jan 2014 15:31:56 +0100
+Subject: [PATCH] libnm-glib: additional functions to get nameservers (rh
+ #1056146)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This commit adds two new functions for introspection users to get nameservers:
+guint32 nm_ip6_config_get_num_nameservers (NMIP6Config *config)
+const struct in6_addr *nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx)
+The existing function can't be used due to GObject introspection limitations:
+const GSList *nm_ip6_config_get_nameservers (NMIP6Config *config);
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1056146
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ libnm-glib/libnm-glib.ver | 2 ++
+ libnm-glib/nm-ip6-config.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-
+ libnm-glib/nm-ip6-config.h | 16 +++++++-------
+ 3 files changed, 62 insertions(+), 8 deletions(-)
+
+diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver
+index bf69db4..9f0db93 100644
+--- a/libnm-glib/libnm-glib.ver
++++ b/libnm-glib/libnm-glib.ver
+@@ -227,7 +227,9 @@ global:
+ nm_ip6_config_get_addresses;
+ nm_ip6_config_get_domains;
+ nm_ip6_config_get_gateway;
++ nm_ip6_config_get_nameserver;
+ nm_ip6_config_get_nameservers;
++ nm_ip6_config_get_num_nameservers;
+ nm_ip6_config_get_routes;
+ nm_ip6_config_get_searches;
+ nm_ip6_config_get_type;
+diff --git a/libnm-glib/nm-ip6-config.c b/libnm-glib/nm-ip6-config.c
+index 01e2cae..7c9cfca 100644
+--- a/libnm-glib/nm-ip6-config.c
++++ b/libnm-glib/nm-ip6-config.c
+@@ -18,7 +18,7 @@
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2007 - 2008 Novell, Inc.
+- * Copyright (C) 2008 - 2011 Red Hat, Inc.
++ * Copyright (C) 2008 - 2014 Red Hat, Inc.
+ */
+
+ #include <string.h>
+@@ -192,6 +192,56 @@ nm_ip6_config_get_addresses (NMIP6Config *config)
+ return NM_IP6_CONFIG_GET_PRIVATE (config)->addresses;
+ }
+
++/**
++ * nm_ip6_config_get_num_nameservers:
++ * @config: a #NMIP6Config
++ *
++ * Gets the number of the domain name servers in the configuration.
++ *
++ * Returns: the number of domain name servers
++ *
++ * Since: 0.9.10
++ **/
++guint32
++nm_ip6_config_get_num_nameservers (NMIP6Config *config)
++{
++ g_return_val_if_fail (NM_IS_IP6_CONFIG (config), 0);
++
++ _nm_object_ensure_inited (NM_OBJECT (config));
++ return g_slist_length (NM_IP6_CONFIG_GET_PRIVATE (config)->nameservers);
++}
++
++/**
++ * nm_ip6_config_get_nameserver:
++ * @config: a #NMIP6Config
++ * @idx: index of the nameserver to return
++ *
++ * Gets the domain name server at index @idx in the configuration.
++ *
++ * Returns: (array fixed-size=16) (element-type guint8) (transfer none):
++ * the IPv6 address of domain name server at index @iidx
++ *
++ * Since: 0.9.10
++ **/
++const struct in6_addr *
++nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx)
++{
++ NMIP6ConfigPrivate *priv;
++ GSList *item;
++ guint32 i = 0;
++
++ g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL);
++
++ _nm_object_ensure_inited (NM_OBJECT (config));
++ priv = NM_IP6_CONFIG_GET_PRIVATE (config);
++
++ for (item = priv->nameservers; item && i < idx; i++)
++ item = item->next;
++
++ g_return_val_if_fail (item, NULL);
++ return item ? (const struct in6_addr *) item->data : NULL;
++}
++
+ /* FIXME: like in libnm_util, in6_addr is not introspectable, so skipping here */
+ /**
+ * nm_ip6_config_get_nameservers: (skip)
+diff --git a/libnm-glib/nm-ip6-config.h b/libnm-glib/nm-ip6-config.h
+index a71d74b..b6198fa 100644
+--- a/libnm-glib/nm-ip6-config.h
++++ b/libnm-glib/nm-ip6-config.h
+@@ -18,7 +18,7 @@
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2007 - 2008 Novell, Inc.
+- * Copyright (C) 2008 Red Hat, Inc.
++ * Copyright (C) 2008 - 2014 Red Hat, Inc.
+ */
+
+ #ifndef NM_IP6_CONFIG_H
+@@ -65,12 +65,14 @@ GType nm_ip6_config_get_type (void);
+
+ GObject *nm_ip6_config_new (DBusGConnection *connection, const char *object_path);
+
+-const char * nm_ip6_config_get_gateway (NMIP6Config *config);
+-const GSList * nm_ip6_config_get_addresses (NMIP6Config *config);
+-const GSList * nm_ip6_config_get_routes (NMIP6Config *config);
+-const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config);
+-const GPtrArray *nm_ip6_config_get_domains (NMIP6Config *config);
+-const GPtrArray *nm_ip6_config_get_searches (NMIP6Config *config);
++const char * nm_ip6_config_get_gateway (NMIP6Config *config);
++const GSList * nm_ip6_config_get_addresses (NMIP6Config *config);
++const GSList * nm_ip6_config_get_routes (NMIP6Config *config);
++guint32 nm_ip6_config_get_num_nameservers (NMIP6Config *config);
++const struct in6_addr *nm_ip6_config_get_nameserver (NMIP6Config *config, guint32 idx);
++const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config);
++const GPtrArray * nm_ip6_config_get_domains (NMIP6Config *config);
++const GPtrArray * nm_ip6_config_get_searches (NMIP6Config *config);
+
+ G_END_DECLS
+
+--
+1.7.11.7
+
diff --git a/rem-con-constructed.patch b/rem-con-constructed.patch
new file mode 100644
index 0000000..ff5de61
--- /dev/null
+++ b/rem-con-constructed.patch
@@ -0,0 +1,31 @@
+From df4c9347fc85ec2aa7ddc67e0ff39bc1d56f669a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes at redhat.com>
+Date: Mon, 27 Jan 2014 17:36:30 +0100
+Subject: [PATCH] libnm-glib: chain up the parent constructed() of
+ NMRemoteConnection
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ libnm-glib/nm-remote-connection.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/libnm-glib/nm-remote-connection.c b/libnm-glib/nm-remote-connection.c
+index 73a2cc8..27baebd 100644
+--- a/libnm-glib/nm-remote-connection.c
++++ b/libnm-glib/nm-remote-connection.c
+@@ -508,6 +508,8 @@ constructed (GObject *object)
+ {
+ NMRemoteConnectionPrivate *priv = NM_REMOTE_CONNECTION_GET_PRIVATE (object);
+
++ G_OBJECT_CLASS (nm_remote_connection_parent_class)->constructed (object);
++
+ g_assert (priv->bus);
+ g_assert (nm_connection_get_path (NM_CONNECTION (object)));
+
+--
+1.7.11.7
+
diff --git a/rh1030068-vpn-tunnel-interface.patch b/rh1030068-vpn-tunnel-interface.patch
new file mode 100644
index 0000000..ffb0e00
--- /dev/null
+++ b/rh1030068-vpn-tunnel-interface.patch
@@ -0,0 +1,293 @@
+From d7c369712b9e6298d62303899e372ab7d27a92d9 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Mon, 23 Dec 2013 12:21:09 -0600
+Subject: [PATCH] vpn: handle missing tunnel interface for IP-based VPNs (bgo
+ #721724) (rh #1030068)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+IPSec-based VPNs that use the kernel IPSec stack don't have tunnel
+interfaces, and the IP details (address, routes) get added directly
+to the parent network device. NetworkManager previously required
+a tunnel interface and failed the VPN if one was not provided.
+
+When no tunnel interface is passed, construct the VPN IP configuration
+using available details and pass that to the NMDevice as the VPN IP
+config. The device will merge that config with its own and apply
+any configuration that the kernel/VPN has not already applied.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=721724
+https://bugzilla.redhat.com/show_bug.cgi?id=1030068
+
+https://bugzilla.redhat.com/show_bug.cgi?id=865883
+https://bugzilla.redhat.com/show_bug.cgi?id=845599
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/nm-policy.c | 15 +++--
+ src/vpn-manager/nm-vpn-connection.c | 112 ++++++++++++++++++++++--------------
+ 2 files changed, 79 insertions(+), 48 deletions(-)
+
+diff --git a/src/nm-policy.c b/src/nm-policy.c
+index 92ec1ab..090cd04 100644
+--- a/src/nm-policy.c
++++ b/src/nm-policy.c
+@@ -655,17 +655,21 @@ update_ip4_routing (NMPolicy *policy, gboolean force_update)
+ in_addr_t int_gw = nm_vpn_connection_get_ip4_internal_gateway (vpn);
+ int mss = nm_ip4_config_get_mss (ip4_config);
+
++ /* If no VPN interface, use the parent interface */
++ if (ip_ifindex <= 0)
++ ip_ifindex = parent_ifindex;
++
+ if (!nm_platform_ip4_route_add (ip_ifindex, 0, 0, int_gw, 0, mss)) {
+ nm_platform_ip4_route_add (parent_ifindex, gw_addr, 32, 0, 0, parent_mss);
+- if (!nm_platform_ip4_route_add (ip_ifindex, 0, 0, int_gw, 0, mss)) {
++ if (!nm_platform_ip4_route_add (ip_ifindex, 0, 0, int_gw, 0, mss))
+ nm_log_err (LOGD_IP4 | LOGD_VPN, "Failed to set default route.");
+- }
+ }
+
+ default_device = nm_vpn_connection_get_parent_device (vpn);
+ } else {
+ int mss = nm_ip4_config_get_mss (ip4_config);
+
++ g_assert (ip_iface);
+ if (!nm_platform_ip4_route_add (ip_ifindex, 0, 0, gw_addr, 0, mss)) {
+ nm_platform_ip4_route_add (ip_ifindex, gw_addr, 32, 0, 0, mss);
+ if (!nm_platform_ip4_route_add (ip_ifindex, 0, 0, gw_addr, 0, mss)) {
+@@ -845,6 +849,10 @@ update_ip6_routing (NMPolicy *policy, gboolean force_update)
+ if (!int_gw)
+ int_gw = &in6addr_any;
+
++ /* If no VPN interface, use the parent interface */
++ if (ip_ifindex <= 0)
++ ip_ifindex = parent_ifindex;
++
+ if (!nm_platform_ip6_route_add (ip_ifindex, in6addr_any, 0, *int_gw, 0, mss)) {
+ nm_platform_ip6_route_add (parent_ifindex, *gw_addr, 128, in6addr_any, 0, parent_mss);
+ if (!nm_platform_ip6_route_add (ip_ifindex, in6addr_any, 0, *int_gw, 0, mss)) {
+@@ -858,9 +866,8 @@ update_ip6_routing (NMPolicy *policy, gboolean force_update)
+
+ if (!nm_platform_ip6_route_add (ip_ifindex, in6addr_any, 0, *gw_addr, 0, mss)) {
+ nm_platform_ip6_route_add (ip_ifindex, *gw_addr, 128, in6addr_any, 0, mss);
+- if (!nm_platform_ip6_route_add (ip_ifindex, in6addr_any, 0, *gw_addr, 0, mss)) {
++ if (!nm_platform_ip6_route_add (ip_ifindex, in6addr_any, 0, *gw_addr, 0, mss))
+ nm_log_err (LOGD_IP6, "Failed to set default route.");
+- }
+ }
+
+ default_device6 = best;
+diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
+index 8541f10..f1d7d46 100644
+--- a/src/vpn-manager/nm-vpn-connection.c
++++ b/src/vpn-manager/nm-vpn-connection.c
+@@ -301,13 +301,13 @@ device_state_changed (NMActiveConnection *active,
+ }
+
+ static void
+-add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
++add_ip4_vpn_gateway_route (NMIP4Config *config, NMDevice *parent_device, guint32 vpn_gw)
+ {
+ NMIP4Config *parent_config;
+ guint32 parent_gw;
+ NMPlatformIP4Route route;
+- NMIP4Config *vpn4_config;
+
++ g_return_if_fail (NM_IS_IP4_CONFIG (config));
+ g_return_if_fail (NM_IS_DEVICE (parent_device));
+ g_return_if_fail (vpn_gw != 0);
+
+@@ -321,8 +321,6 @@ add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
+ if (!parent_gw)
+ return;
+
+- vpn4_config = nm_ip4_config_new ();
+-
+ memset (&route, 0, sizeof (route));
+ route.network = vpn_gw;
+ route.plen = 32;
+@@ -335,7 +333,7 @@ add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
+ if (nm_ip4_config_destination_is_direct (parent_config, vpn_gw, 32))
+ route.gateway = 0;
+
+- nm_ip4_config_add_route (vpn4_config, &route);
++ nm_ip4_config_add_route (config, &route);
+
+ /* Ensure there's a route to the parent device's gateway through the
+ * parent device, since if the VPN claims the default route and the VPN
+@@ -346,21 +344,19 @@ add_ip4_vpn_gateway_route (NMDevice *parent_device, guint32 vpn_gw)
+ route.network = parent_gw;
+ route.plen = 32;
+
+- nm_ip4_config_add_route (vpn4_config, &route);
+-
+- nm_device_set_vpn4_config (parent_device, vpn4_config);
+- g_object_unref (vpn4_config);
++ nm_ip4_config_add_route (config, &route);
+ }
+
+ static void
+-add_ip6_vpn_gateway_route (NMDevice *parent_device,
++add_ip6_vpn_gateway_route (NMIP6Config *config,
++ NMDevice *parent_device,
+ const struct in6_addr *vpn_gw)
+ {
+ NMIP6Config *parent_config;
+ const struct in6_addr *parent_gw;
+ NMPlatformIP6Route route;
+- NMIP6Config *vpn6_config;
+
++ g_return_if_fail (NM_IS_IP6_CONFIG (config));
+ g_return_if_fail (NM_IS_DEVICE (parent_device));
+ g_return_if_fail (vpn_gw != NULL);
+
+@@ -370,8 +366,6 @@ add_ip6_vpn_gateway_route (NMDevice *parent_device,
+ if (!parent_gw)
+ return;
+
+- vpn6_config = nm_ip6_config_new ();
+-
+ memset (&route, 0, sizeof (route));
+ route.network = *vpn_gw;
+ route.plen = 128;
+@@ -384,7 +378,7 @@ add_ip6_vpn_gateway_route (NMDevice *parent_device,
+ if (nm_ip6_config_destination_is_direct (parent_config, vpn_gw, 128))
+ route.gateway = in6addr_any;
+
+- nm_ip6_config_add_route (vpn6_config, &route);
++ nm_ip6_config_add_route (config, &route);
+
+ /* Ensure there's a route to the parent device's gateway through the
+ * parent device, since if the VPN claims the default route and the VPN
+@@ -395,10 +389,7 @@ add_ip6_vpn_gateway_route (NMDevice *parent_device,
+ route.network = *parent_gw;
+ route.plen = 128;
+
+- nm_ip6_config_add_route (vpn6_config, &route);
+-
+- nm_device_set_vpn6_config (parent_device, vpn6_config);
+- g_object_unref (vpn6_config);
++ nm_ip6_config_add_route (config, &route);
+ }
+
+ NMVPNConnection *
+@@ -601,7 +592,7 @@ print_vpn_config (NMVPNConnection *connection)
+ ip6_address_to_string (priv->ip6_external_gw));
+ }
+
+- nm_log_info (LOGD_VPN, "Tunnel Device: %s", priv->ip_iface);
++ nm_log_info (LOGD_VPN, "Tunnel Device: %s", priv->ip_iface ? priv->ip_iface : "(none)");
+
+ if (priv->ip4_config) {
+ nm_log_info (LOGD_VPN, "IPv4 configuration:");
+@@ -692,25 +683,54 @@ nm_vpn_connection_apply_config (NMVPNConnection *connection)
+ nm_vpn_connection_apply_config (NMVPNConnection *connection)
+ {
+ NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
++ NMIP4Config *vpn4_parent_config = NULL;
++ NMIP6Config *vpn6_parent_config = NULL;
+
+- nm_platform_link_set_up (priv->ip_ifindex);
++ if (priv->ip_ifindex > 0) {
++ nm_platform_link_set_up (priv->ip_ifindex);
+
+- if (priv->ip4_config) {
+- if (!nm_ip4_config_commit (priv->ip4_config, priv->ip_ifindex, 0))
+- return FALSE;
++ if (priv->ip4_config) {
++ if (!nm_ip4_config_commit (priv->ip4_config, priv->ip_ifindex, 0))
++ return FALSE;
++ }
++
++ if (priv->ip6_config) {
++ if (!nm_ip6_config_commit (priv->ip6_config, priv->ip_ifindex, 0))
++ return FALSE;
++ }
++
++ if (priv->ip4_config)
++ vpn4_parent_config = nm_ip4_config_new ();
++ if (priv->ip6_config)
++ vpn6_parent_config = nm_ip6_config_new ();
++ } else {
++ /* If the VPN didn't return a network interface, it is a route-based
++ * VPN (like kernel IPSec) and all IP addressing and routing should
++ * be done on the parent interface instead.
++ */
++
++ if (priv->ip4_config)
++ vpn4_parent_config = g_object_ref (priv->ip4_config);
++ if (priv->ip6_config)
++ vpn6_parent_config = g_object_ref (priv->ip6_config);
+ }
+
+- if (priv->ip6_config) {
+- if (!nm_ip6_config_commit (priv->ip6_config, priv->ip_ifindex, 0))
+- /* FIXME: remove ip4 config */
+- return FALSE;
++ if (vpn4_parent_config) {
++ /* Add any explicit route to the VPN gateway through the parent device */
++ if (priv->ip4_external_gw)
++ add_ip4_vpn_gateway_route (vpn4_parent_config, priv->parent_dev, priv->ip4_external_gw);
++
++ nm_device_set_vpn4_config (priv->parent_dev, vpn4_parent_config);
++ g_object_unref (vpn4_parent_config);
+ }
++ if (vpn6_parent_config) {
++ /* Add any explicit route to the VPN gateway through the parent device */
++ if (priv->ip6_external_gw)
++ add_ip6_vpn_gateway_route (vpn6_parent_config, priv->parent_dev, priv->ip6_external_gw);
+
+- /* Add any explicit route to the VPN gateway through the parent device */
+- if (priv->ip4_external_gw)
+- add_ip4_vpn_gateway_route (priv->parent_dev, priv->ip4_external_gw);
+- if (priv->ip6_external_gw)
+- add_ip6_vpn_gateway_route (priv->parent_dev, priv->ip6_external_gw);
++ nm_device_set_vpn6_config (priv->parent_dev, vpn6_parent_config);
++ g_object_unref (vpn6_parent_config);
++ }
+
+ nm_log_info (LOGD_VPN, "VPN connection '%s' (IP Config Get) complete.",
+ nm_connection_get_id (priv->connection));
+@@ -768,21 +788,25 @@ process_generic_config (NMVPNConnection *connection,
+ NMVPNConnectionPrivate *priv = NM_VPN_CONNECTION_GET_PRIVATE (connection);
+ GValue *val;
+
++ g_clear_pointer (&priv->ip_iface, g_free);
++
+ val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_CONFIG_TUNDEV);
+- if (val)
+- priv->ip_iface = g_strdup (g_value_get_string (val));
+- else {
+- nm_log_err (LOGD_VPN, "invalid or missing tunnel device received!");
+- nm_vpn_connection_config_maybe_complete (connection, FALSE);
+- return FALSE;
++ if (val) {
++ const char *tmp = g_value_get_string (val);
++
++ /* Backwards compat with NM-openswan */
++ if (g_strcmp0 (tmp, "_none_") != 0)
++ priv->ip_iface = g_strdup (tmp);
+ }
+
+- /* Grab the interface index for address/routing operations */
+- priv->ip_ifindex = nm_platform_link_get_ifindex (priv->ip_iface);
+- if (!priv->ip_ifindex) {
+- nm_log_err (LOGD_VPN, "(%s): failed to look up VPN interface index", priv->ip_iface);
+- nm_vpn_connection_config_maybe_complete (connection, FALSE);
+- return FALSE;
++ if (priv->ip_iface) {
++ /* Grab the interface index for address/routing operations */
++ priv->ip_ifindex = nm_platform_link_get_ifindex (priv->ip_iface);
++ if (!priv->ip_ifindex) {
++ nm_log_err (LOGD_VPN, "(%s): failed to look up VPN interface index", priv->ip_iface);
++ nm_vpn_connection_config_maybe_complete (connection, FALSE);
++ return FALSE;
++ }
+ }
+
+ val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_CONFIG_BANNER);
+--
+1.7.11.7
+
diff --git a/rh1048046-dhcp-no-ipv6.patch b/rh1048046-dhcp-no-ipv6.patch
new file mode 100644
index 0000000..dff0a3d
--- /dev/null
+++ b/rh1048046-dhcp-no-ipv6.patch
@@ -0,0 +1,61 @@
+From a9f1d121783a7f3c65c9f47d3419b5a8a255fe47 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Thu, 23 Jan 2014 12:16:02 -0600
+Subject: [PATCH] dhcp: don't add an IPv6 address if one wasn't given (rh
+ #1048046)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+In information-only mode (where RA is providing addresses), DHCPv6
+may not give an address. NetworkManager was adding a blank one
+anyway, which is invalid. Don't do that.
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/dhcp-manager/nm-dhcp-client.c | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
+index 75cd818..57298c8 100644
+--- a/src/dhcp-manager/nm-dhcp-client.c
++++ b/src/dhcp-manager/nm-dhcp-client.c
+@@ -1404,6 +1404,12 @@ ip6_options_to_config (NMDHCPClient *self)
+
+ ip6_config = nm_ip6_config_new ();
+
++ str = g_hash_table_lookup (priv->options, "new_dhcp_lease_time");
++ if (str) {
++ address.lifetime = address.preferred = strtoul (str, NULL, 10);
++ nm_log_info (LOGD_DHCP6, " lease time %d", address.lifetime);
++ }
++
+ str = g_hash_table_lookup (priv->options, "new_ip6_address");
+ if (str) {
+ if (!inet_pton (AF_INET6, str, &tmp_addr)) {
+@@ -1413,21 +1419,13 @@ ip6_options_to_config (NMDHCPClient *self)
+ }
+
+ address.address = tmp_addr;
++ nm_ip6_config_add_address (ip6_config, &address);
+ nm_log_info (LOGD_DHCP6, " address %s", str);
+-
+ } else if (priv->info_only == FALSE) {
+ /* No address in Managed mode is a hard error */
+ goto error;
+ }
+
+- str = g_hash_table_lookup (priv->options, "new_dhcp_lease_time");
+- if (str) {
+- address.lifetime = address.preferred = strtoul (str, NULL, 10);
+- nm_log_info (LOGD_DHCP6, " lease time %d", address.lifetime);
+- }
+-
+- nm_ip6_config_add_address (ip6_config, &address);
+-
+ str = g_hash_table_lookup (priv->options, "new_host_name");
+ if (str)
+ nm_log_info (LOGD_DHCP6, " hostname '%s'", str);
+--
+1.7.11.7
+
diff --git a/rh1057738-dbus-clean-exit.patch b/rh1057738-dbus-clean-exit.patch
new file mode 100644
index 0000000..94bd64c
--- /dev/null
+++ b/rh1057738-dbus-clean-exit.patch
@@ -0,0 +1,203 @@
+From e62b212be3b51b0dc31fd12ea70d78358164063e Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Fri, 24 Jan 2014 12:49:57 -0600
+Subject: [PATCH] core: exit cleanly if D-Bus cannot be initialized (rh
+ #1057738)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Instead of crashing, let's exit cleanly.
+
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/nm-manager.c | 90 ++++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 49 insertions(+), 41 deletions(-)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index e6ff8d5..1545e72 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -217,6 +217,7 @@ typedef struct {
+
+ NMDBusManager *dbus_mgr;
+ guint dbus_connection_changed_id;
++ gboolean prop_filter_added;
+ NMAtmManager *atm_mgr;
+ NMRfkillManager *rfkill_mgr;
+ NMBluezManager *bluez_mgr;
+@@ -250,7 +251,6 @@ typedef struct {
+ GHashTable *nm_bridges;
+
+ gboolean startup;
+- gboolean disposed;
+ } NMManagerPrivate;
+
+ #define NM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MANAGER, NMManagerPrivate))
+@@ -4503,6 +4503,16 @@ nm_manager_new (NMSettings *settings,
+
+ priv = NM_MANAGER_GET_PRIVATE (singleton);
+
++ bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
++ if (!bus) {
++ nm_log_err (LOGD_CORE, "Failed to initialize D-Bus connection");
++ g_object_unref (singleton);
++ return NULL;
++ }
++
++ dbus_connection = dbus_g_connection_get_connection (bus);
++ g_assert (dbus_connection);
++
+ priv->policy = nm_policy_new (singleton, settings);
+ g_signal_connect (priv->policy, "notify::" NM_POLICY_DEFAULT_IP4_DEVICE,
+ G_CALLBACK (policy_default_device_changed), singleton);
+@@ -4517,16 +4527,12 @@ nm_manager_new (NMSettings *settings,
+ g_signal_connect (priv->connectivity, "notify::" NM_CONNECTIVITY_STATE,
+ G_CALLBACK (connectivity_changed), singleton);
+
+- bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
+- g_assert (bus);
+- dbus_connection = dbus_g_connection_get_connection (bus);
+- g_assert (dbus_connection);
+-
+ if (!dbus_connection_add_filter (dbus_connection, prop_filter, singleton, NULL)) {
+ nm_log_err (LOGD_CORE, "failed to register DBus connection filter");
+ g_object_unref (singleton);
+ return NULL;
+- }
++ }
++ priv->prop_filter_added = TRUE;
+
+ priv->settings = g_object_ref (settings);
+
+@@ -4614,14 +4620,9 @@ dispose (GObject *object)
+ DBusConnection *dbus_connection;
+ GSList *iter;
+
+- if (priv->disposed) {
+- G_OBJECT_CLASS (nm_manager_parent_class)->dispose (object);
+- return;
+- }
+- priv->disposed = TRUE;
+-
+ g_slist_foreach (priv->auth_chains, (GFunc) nm_auth_chain_unref, NULL);
+ g_slist_free (priv->auth_chains);
++ priv->auth_chains = NULL;
+
+ nm_auth_changed_func_unregister (authority_changed_cb, manager);
+
+@@ -4635,8 +4636,7 @@ dispose (GObject *object)
+
+ for (iter = priv->active_connections; iter; iter = g_slist_next (iter))
+ active_connection_removed (manager, NM_ACTIVE_CONNECTION (iter->data));
+- g_slist_free (priv->active_connections);
+- priv->active_connections = NULL;
++ g_clear_pointer (&priv->active_connections, g_slist_free);
+ g_clear_object (&priv->primary_connection);
+ g_clear_object (&priv->activating_connection);
+
+@@ -4644,12 +4644,14 @@ dispose (GObject *object)
+
+ g_free (priv->hostname);
+
+- g_signal_handlers_disconnect_by_func (priv->policy, G_CALLBACK (policy_default_device_changed), singleton);
+- g_signal_handlers_disconnect_by_func (priv->policy, G_CALLBACK (policy_activating_device_changed), singleton);
+- g_object_unref (priv->policy);
++ if (priv->policy) {
++ g_signal_handlers_disconnect_by_func (priv->policy, G_CALLBACK (policy_default_device_changed), singleton);
++ g_signal_handlers_disconnect_by_func (priv->policy, G_CALLBACK (policy_activating_device_changed), singleton);
++ g_clear_object (&priv->policy);
++ }
+
+- g_object_unref (priv->settings);
+- g_object_unref (priv->vpn_manager);
++ g_clear_object (&priv->settings);
++ g_clear_object (&priv->vpn_manager);
+
+ if (priv->modem_added_id) {
+ g_source_remove (priv->modem_added_id);
+@@ -4659,39 +4661,42 @@ dispose (GObject *object)
+ g_source_remove (priv->modem_removed_id);
+ priv->modem_removed_id = 0;
+ }
+- g_object_unref (priv->modem_manager);
++ g_clear_object (&priv->modem_manager);
+
+ /* Unregister property filter */
+- bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
+- if (bus) {
+- dbus_connection = dbus_g_connection_get_connection (bus);
+- g_assert (dbus_connection);
+- dbus_connection_remove_filter (dbus_connection, prop_filter, manager);
++ if (priv->dbus_mgr) {
++ bus = nm_dbus_manager_get_connection (priv->dbus_mgr);
++ if (bus) {
++ dbus_connection = dbus_g_connection_get_connection (bus);
++ if (dbus_connection && priv->prop_filter_added) {
++ dbus_connection_remove_filter (dbus_connection, prop_filter, manager);
++ priv->prop_filter_added = FALSE;
++ }
++ }
++ g_signal_handler_disconnect (priv->dbus_mgr, priv->dbus_connection_changed_id);
++ priv->dbus_mgr = NULL;
+ }
+- g_signal_handler_disconnect (priv->dbus_mgr, priv->dbus_connection_changed_id);
+- priv->dbus_mgr = NULL;
+-
+- if (priv->bluez_mgr)
+- g_object_unref (priv->bluez_mgr);
+-
+- if (priv->aipd_proxy)
+- g_object_unref (priv->aipd_proxy);
+
+- if (priv->sleep_monitor)
+- g_object_unref (priv->sleep_monitor);
++ g_clear_object (&priv->bluez_mgr);
++ g_clear_object (&priv->aipd_proxy);
++ g_clear_object (&priv->sleep_monitor);
+
+ if (priv->fw_monitor) {
+- if (priv->fw_monitor_id)
++ if (priv->fw_monitor_id) {
+ g_signal_handler_disconnect (priv->fw_monitor, priv->fw_monitor_id);
++ priv->fw_monitor_id = 0;
++ }
+
+- if (priv->fw_changed_id)
++ if (priv->fw_changed_id) {
+ g_source_remove (priv->fw_changed_id);
++ priv->fw_changed_id = 0;
++ }
+
+ g_file_monitor_cancel (priv->fw_monitor);
+- g_object_unref (priv->fw_monitor);
++ g_clear_object (&priv->fw_monitor);
+ }
+
+- g_slist_free (priv->factories);
++ g_clear_pointer (&priv->factories, g_slist_free);
+
+ if (priv->timestamp_update_id) {
+ g_source_remove (priv->timestamp_update_id);
+@@ -4945,14 +4950,17 @@ dbus_connection_changed_cb (NMDBusManager *dbus_mgr,
+ gpointer user_data)
+ {
+ NMManager *self = NM_MANAGER (user_data);
++ gboolean success = FALSE;
+
+ if (dbus_connection) {
+ /* Register property filter on new connection; there's no reason this
+ * should fail except out-of-memory or program error; if it does fail
+ * then there's no Manager property access control, which is bad.
+ */
+- g_assert (dbus_connection_add_filter (dbus_connection, prop_filter, self, NULL));
++ success = dbus_connection_add_filter (dbus_connection, prop_filter, self, NULL);
++ g_assert (success);
+ }
++ NM_MANAGER_GET_PRIVATE (self)->prop_filter_added = success;
+ }
+
+ static void
+--
+1.7.11.7
+
diff --git a/rh983325-add-route-for-dhcp-server.patch b/rh983325-add-route-for-dhcp-server.patch
new file mode 100644
index 0000000..bbbee4e
--- /dev/null
+++ b/rh983325-add-route-for-dhcp-server.patch
@@ -0,0 +1,83 @@
+From 31fe84e467732463eabc8f70c2a419008e7a227c Mon Sep 17 00:00:00 2001
+From: Scott Shambarger <devel at shambarger.net>
+Date: Thu, 9 Jan 2014 14:26:53 -0800
+Subject: [PATCH] core: Add host route for DHCP4 server if outside assigned
+ subnet (bgo #721767)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Some ISP's provide leases from central servers that are on different
+subnets that the address offered. If the host does not configure the
+interface as the default route, the dhcp server may not be reachable
+via unicast, and a host specific route is needed.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=721767
+https://bugzilla.redhat.com/show_bug.cgi?id=983325
+
+Signed-off-by: Thomas Haller <thaller at redhat.com>
+Signed-off-by: Jiří Klimeš <jklimes at redhat.com>
+---
+ src/dhcp-manager/nm-dhcp-client.c | 39 +++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 37 insertions(+), 2 deletions(-)
+
+diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
+index edea8f8..75cd818 100644
+--- a/src/dhcp-manager/nm-dhcp-client.c
++++ b/src/dhcp-manager/nm-dhcp-client.c
+@@ -1200,8 +1200,8 @@ ip4_options_to_config (NMDHCPClient *self)
+
+ for (s = routers; *s; s++) {
+ /* FIXME: how to handle multiple routers? */
+- if (inet_pton (AF_INET, *s, &tmp_addr) > 0) {
+- nm_ip4_config_set_gateway (ip4_config, tmp_addr);
++ if (inet_pton (AF_INET, *s, &gwaddr) > 0) {
++ nm_ip4_config_set_gateway (ip4_config, gwaddr);
+ nm_log_info (LOGD_DHCP4, " gateway %s", *s);
+ break;
+ } else
+@@ -1211,6 +1211,41 @@ ip4_options_to_config (NMDHCPClient *self)
+ }
+ }
+
++ /*
++ * RFC 2132, section 9.7
++ * DHCP clients use the contents of the 'server identifier' field
++ * as the destination address for any DHCP messages unicast to
++ * the DHCP server.
++ *
++ * Some ISP's provide leases from central servers that are on
++ * different subnets that the address offered. If the host
++ * does not configure the interface as the default route, the
++ * dhcp server may not be reachable via unicast, and a host
++ * specific route is needed.
++ **/
++ str = g_hash_table_lookup (priv->options, "new_dhcp_server_identifier");
++ if (str) {
++ if (inet_pton (AF_INET, str, &tmp_addr) > 0) {
++ NMPlatformIP4Route route;
++ guint32 mask = nm_utils_ip4_prefix_to_netmask (address.plen);
++
++ nm_log_info (LOGD_DHCP4, " server identifier %s", str);
++ if ((tmp_addr & mask) != (address.address & mask)) {
++ /* DHCP server not on assigned subnet, route needed */
++ memset (&route, 0, sizeof (route));
++ route.network = tmp_addr;
++ route.plen = 32;
++ /* this will be a device route if gwaddr is 0 */
++ route.gateway = gwaddr;
++ nm_ip4_config_add_route (ip4_config, &route);
++ nm_log_dbg (LOGD_IP, "adding route for server identifier: %s",
++ nm_platform_ip4_route_to_string (&route));
++ }
++ }
++ else
++ nm_log_warn (LOGD_DHCP4, "ignoring invalid server identifier '%s'", str);
++ }
++
+ str = g_hash_table_lookup (priv->options, "new_dhcp_lease_time");
+ if (str) {
+ address.lifetime = address.preferred = strtoul (str, NULL, 10);
+--
+1.7.11.7
+
More information about the scm-commits
mailing list