about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeremy Bicha <jbicha@ubuntu.com>2017-11-12 15:05:40 -0500
committerJeremy Bicha <jbicha@ubuntu.com>2017-11-12 17:33:41 -0500
commit4c81b8e520f9349f6e5ef6902786712d07e91122 (patch)
tree9767a51c4cc2537c6476479429f0b114c1bbf491
parent5c866128b172760e407957141e8d15e7f5654eee (diff)
Import Ubuntu patches
-rw-r--r--debian/patches/Disable-general-with-expect.patch21
-rw-r--r--debian/patches/Ignore-p2p0-wifi-devices-from-android.patch29
-rw-r--r--debian/patches/Ignore-rmnet_usbX-devices.patch25
-rw-r--r--debian/patches/Only-test-team-devices-if-we-built-support-for-them.patch25
-rw-r--r--debian/patches/Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch35
-rw-r--r--debian/patches/Read-system-connections-from-run.patch46
-rw-r--r--debian/patches/Track-killswitch-change-signals-from-urfkill.patch585
-rw-r--r--debian/patches/Update-dnsmasq-parameters.patch58
-rw-r--r--debian/patches/dns-manager-don-t-merge-split-DNS-search-domains.patch88
-rw-r--r--debian/patches/fix-resolved-detection.patch22
-rw-r--r--debian/patches/libnm-Check-self-still-NMManager-or-not.patch33
-rw-r--r--debian/patches/series11
12 files changed, 978 insertions, 0 deletions
diff --git a/debian/patches/Disable-general-with-expect.patch b/debian/patches/Disable-general-with-expect.patch
new file mode 100644
index 00000000..fd96d4fd
--- /dev/null
+++ b/debian/patches/Disable-general-with-expect.patch
@@ -0,0 +1,21 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Fri, 13 May 2016 11:13:20 +0800
+Subject: Disable general-with-expect
+
+which tends to fail on ppc64el and arm64
+---
+ Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 698e3e3..4979f2b 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -3073,7 +3073,6 @@ src_tests_ldadd = \
+ 
+ check_programs += \
+ 	src/tests/test-general \
+-	src/tests/test-general-with-expect \
+ 	src/tests/test-ip4-config \
+ 	src/tests/test-ip6-config \
+ 	src/tests/test-dcb \
diff --git a/debian/patches/Ignore-p2p0-wifi-devices-from-android.patch b/debian/patches/Ignore-p2p0-wifi-devices-from-android.patch
new file mode 100644
index 00000000..471242cc
--- /dev/null
+++ b/debian/patches/Ignore-p2p0-wifi-devices-from-android.patch
@@ -0,0 +1,29 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Fri, 13 May 2016 11:08:30 +0800
+Subject: Ignore p2p0 wifi devices from android.
+
+---
+ src/nm-manager.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 294221e..072f4cd 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -2403,6 +2403,16 @@ platform_link_added (NMManager *self,
+ 		!strncmp (plink->name, "ccmni", NM_STRLEN ("ccmni")))
+ 		return;
+ 
++	/*
++	 * Ubuntu: Explicitly unmanage p2p Wi-Fi devices exposed by Android JB Wi-Fi drivers.
++	 */
++	NMDeviceType devtype = nm_device_get_device_type (device);
++	if ((plink->type == NM_LINK_TYPE_WIFI)
++	    && !strncmp (plink->name, "p2p0", NM_STRLEN ("p2p0"))) {
++		nm_log_info (LOGD_PLATFORM, "(%s): ignoring P2P wireless iface", plink->name);
++		return;
++	}
++
+ 	if (device == NULL) {
+ 		gboolean nm_plugin_missing = FALSE;
+ 
diff --git a/debian/patches/Ignore-rmnet_usbX-devices.patch b/debian/patches/Ignore-rmnet_usbX-devices.patch
new file mode 100644
index 00000000..3cc67810
--- /dev/null
+++ b/debian/patches/Ignore-rmnet_usbX-devices.patch
@@ -0,0 +1,25 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Fri, 13 May 2016 11:08:17 +0800
+Subject: Ignore rmnet_usbX devices.
+
+---
+ src/nm-manager.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 413ec0b..294221e 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -2397,6 +2397,12 @@ platform_link_added (NMManager *self,
+ 		}
+ 	}
+ 
++	/* Ignore rmnet_usb devices, which will be handled by their modem parent
++	 */
++	if (!strncmp (plink->name, "rmnet_usb", NM_STRLEN ("rmnet_usb")) ||
++		!strncmp (plink->name, "ccmni", NM_STRLEN ("ccmni")))
++		return;
++
+ 	if (device == NULL) {
+ 		gboolean nm_plugin_missing = FALSE;
+ 
diff --git a/debian/patches/Only-test-team-devices-if-we-built-support-for-them.patch b/debian/patches/Only-test-team-devices-if-we-built-support-for-them.patch
new file mode 100644
index 00000000..4883a2b5
--- /dev/null
+++ b/debian/patches/Only-test-team-devices-if-we-built-support-for-them.patch
@@ -0,0 +1,25 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Fri, 13 May 2016 11:13:16 +0800
+Subject: Only test team devices if we built support for them.
+
+Team device support is already conditional to teamdctl being available at
+compile time. If we're not building support for them, we shouldn't attempt
+to test them either as doing so would fail the build.
+---
+ src/platform/tests/test-link.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
+index ed43556..6395e02 100644
+--- a/src/platform/tests/test-link.c
++++ b/src/platform/tests/test-link.c
+@@ -2509,7 +2509,9 @@ _nmtstp_setup_tests (void)
+ 	g_test_add_func ("/link/internal", test_internal);
+ 	g_test_add_func ("/link/software/bridge", test_bridge);
+ 	g_test_add_func ("/link/software/bond", test_bond);
++#if WITH_TEAMDCTL
+ 	g_test_add_func ("/link/software/team", test_team);
++#endif
+ 	g_test_add_func ("/link/software/vlan", test_vlan);
+ 	g_test_add_func ("/link/software/bridge/addr", test_bridge_addr);
+ 
diff --git a/debian/patches/Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch b/debian/patches/Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch
new file mode 100644
index 00000000..8d67799f
--- /dev/null
+++ b/debian/patches/Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch
@@ -0,0 +1,35 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Thu, 12 May 2016 22:25:32 +0800
+Subject: Provide access to some of NM's interfaces to whoopsie.
+
+Whoopsie is the crash database reporting daemon. It needs access to some of
+the information NM keeps about devices to avoid sending data over the network
+when connected to 3G or other systems that are potentially billable.
+---
+ src/org.freedesktop.NetworkManager.conf | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/src/org.freedesktop.NetworkManager.conf b/src/org.freedesktop.NetworkManager.conf
+index 6be1feb..3dd2350 100644
+--- a/src/org.freedesktop.NetworkManager.conf
++++ b/src/org.freedesktop.NetworkManager.conf
+@@ -36,6 +36,19 @@
+                 <allow own="org.freedesktop.NetworkManager.dnsmasq"/>
+                 <allow send_destination="org.freedesktop.NetworkManager.dnsmasq"/>
+         </policy>
++        <policy user="whoopsie">
++                <allow send_destination="org.freedesktop.NetworkManager"/>
++                <allow send_destination="org.freedesktop.NetworkManager"
++                       send_interface="org.freedesktop.DBus.Introspectable"/>
++                <allow send_destination="org.freedesktop.NetworkManager"
++                       send_interface="org.freedesktop.DBus.Properties"/>
++                <allow send_destination="org.freedesktop.NetworkManager"
++                       send_interface="org.freedesktop.NetworkManager"/>
++                <allow send_destination="org.freedesktop.NetworkManager"
++                       send_interface="org.freedesktop.NetworkManager.Connection.Active"/>
++                <allow send_destination="org.freedesktop.NetworkManager"
++                       send_interface="org.freedesktop.NetworkManager.Device"/>
++        </policy>
+         <policy context="default">
+                 <deny own="org.freedesktop.NetworkManager"/>
+ 
diff --git a/debian/patches/Read-system-connections-from-run.patch b/debian/patches/Read-system-connections-from-run.patch
new file mode 100644
index 00000000..f64fb40c
--- /dev/null
+++ b/debian/patches/Read-system-connections-from-run.patch
@@ -0,0 +1,46 @@
+From: Martin Pitt <martin.pitt@ubuntu.com>
+Date: Tue, 21 Jun 2016 17:22:12 +0200
+Subject: Read system-connections from /run
+
+Bug: https://bugzilla.gnome.org/show_bug.cgi?id=773069
+Bug-Ubuntu: https://launchpad.net/bugs/1594551
+---
+ src/settings/plugins/keyfile/nms-keyfile-plugin.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/src/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
+index 4af8014..297ac3d 100644
+--- a/src/settings/plugins/keyfile/nms-keyfile-plugin.c
++++ b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
+@@ -410,6 +410,8 @@ _sort_paths (const char **f1, const char **f2, GHashTable *paths)
+ 	return strcmp (*f1, *f2);
+ }
+ 
++#define NM_CONFIG_KEYFILE_PATH_RUNTIME "/run/NetworkManager/system-connections"
++
+ static void
+ read_connections (NMSettingsPlugin *config)
+ {
+@@ -445,6 +447,22 @@ read_connections (NMSettingsPlugin *config)
+ 	}
+ 	g_dir_close (dir);
+ 
++	/* Now add files from /run too, unless they have a file in /etc */
++	dir = g_dir_open (NM_CONFIG_KEYFILE_PATH_RUNTIME, 0, &error);
++	if (dir) {
++		while ((item = g_dir_read_name (dir))) {
++			g_autofree char *etc_file = g_build_filename (nms_keyfile_utils_get_path (), item, NULL);
++			if (nms_keyfile_utils_should_ignore_file (item) || g_access (etc_file, F_OK) == 0)
++				continue;
++			g_ptr_array_add (filenames, g_build_filename (NM_CONFIG_KEYFILE_PATH_RUNTIME, item, NULL));
++		}
++		g_dir_close (dir);
++	} else {
++		nm_log_dbg (LOGD_SETTINGS, "keyfile: cannot read directory " NM_CONFIG_KEYFILE_PATH_RUNTIME ": %s",
++		            error->message);
++		g_clear_error (&error);
++	}
++
+ 	/* While reloading, we don't replace connections that we already loaded while
+ 	 * iterating over the files.
+ 	 *
diff --git a/debian/patches/Track-killswitch-change-signals-from-urfkill.patch b/debian/patches/Track-killswitch-change-signals-from-urfkill.patch
new file mode 100644
index 00000000..33e46686
--- /dev/null
+++ b/debian/patches/Track-killswitch-change-signals-from-urfkill.patch
@@ -0,0 +1,585 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Fri, 13 May 2016 11:13:08 +0800
+Subject: Track killswitch change signals from urfkill
+
+... Also do that rather than resetting the killswitch to the NM saved
+WirelessEnabled state if urfkill support is enabled.
+---
+ Makefile.am              |   7 ++
+ config.h.in              |   3 +
+ configure.ac             |  12 ++
+ src/nm-manager.c         | 111 +++++++++++++++++-
+ src/nm-urfkill-manager.c | 290 +++++++++++++++++++++++++++++++++++++++++++++++
+ src/nm-urfkill-manager.h |  49 ++++++++
+ 6 files changed, 470 insertions(+), 2 deletions(-)
+ create mode 100644 src/nm-urfkill-manager.c
+ create mode 100644 src/nm-urfkill-manager.h
+
+diff --git a/Makefile.am b/Makefile.am
+index 7e1e26f..bdab8cd 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -1330,6 +1330,13 @@ src_libNetworkManagerBase_la_SOURCES += \
+ 	src/platform/wifi/wifi-utils-wext.h
+ endif
+ 
++if WITH_URFKILL
++src_libNetworkManagerBase_la_SOURCES += \
++       src/nm-urfkill-manager.c \
++       src/nm-urfkill-manager.h \
++       $(NULL)
++endif
++
+ src_libNetworkManagerBase_la_LIBADD = \
+ 	libnm-core/libnm-core.la \
+ 	introspection/libnmdbus.la \
+diff --git a/config.h.in b/config.h.in
+index ff4567e..843eb1f 100644
+--- a/config.h.in
++++ b/config.h.in
+@@ -304,6 +304,9 @@
+ /* Define if you have Teamd control support */
+ #undef WITH_TEAMDCTL
+ 
+++/* Define if you want to build with support for the urfkill daemon */
+++#undef WITH_URFKILL
++
+ /* Define if you have Wi-Fi support */
+ #undef WITH_WIFI
+ 
+diff --git a/configure.ac b/configure.ac
+index 9706573..14132c3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -274,6 +274,18 @@ else
+ 	AC_DEFINE(HAVE_VLAN_FLAG_LOOSE_BINDING, 0, [Define if you have VLAN_FLAG_LOOSE_BINDING])
+ fi
+ 
++dnl Default to using WEXT but allow it to be disabled
++dnl
++AC_ARG_WITH(urfkill, AS_HELP_STRING([--with-urfkill=yes], [Enable or disable support for urfkill]), ac_with_urfkill=$withval, ac_with_urfkill="yes")
++if test x"$ac_with_urfkill" = x"yes"; then
++	AC_DEFINE(WITH_URFKILL, 1, [Define if you want to build with support for the urfkill daemon])
++else
++	AC_DEFINE(WITH_URFKILL, 0, [Define if you want to build with support for the urfkill daemon])
++fi
++AM_CONDITIONAL(WITH_URFKILL, test x"${ac_with_urfkill}" = x"yes")
++
++dnl
++
+ dnl
+ dnl Checks for libdl - on certain platforms its part of libc
+ dnl
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 072f4cd..70e1996 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -38,6 +38,7 @@
+ #include "platform/nmp-object.h"
+ #include "nm-hostname-manager.h"
+ #include "nm-rfkill-manager.h"
++#include "nm-urfkill-manager.h"
+ #include "dhcp/nm-dhcp-manager.h"
+ #include "settings/nm-settings.h"
+ #include "settings/nm-settings-connection.h"
+@@ -138,6 +139,9 @@ typedef struct {
+ 		guint            id;
+ 	} prop_filter;
+ 	NMRfkillManager *rfkill_mgr;
++#if WITH_URFKILL
++	NMUrfkillManager *urfkill_mgr;
++#endif
+ 
+ 	CList link_cb_lst;
+ 
+@@ -155,6 +159,7 @@ typedef struct {
+ 	gboolean ifstate_force_online;
+ 
+ 	guint timestamp_update_id;
++	guint rfkill_initial_id;
+ 
+ 	guint devices_inited_id;
+ 
+@@ -6121,6 +6126,49 @@ nm_manager_set_capability (NMManager *self,
+ 
+ /*****************************************************************************/
+ 
++#if WITH_URFKILL
++static void
++urfkill_wlan_state_changed_cb (NMUrfkillManager *mgr,
++			       gboolean enabled,
++			       gpointer user_data)
++{
++	NMManager *self = NM_MANAGER (user_data);
++	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
++	GError *error = NULL;
++
++	nm_log_dbg (LOGD_RFKILL, "urfkill wlan state changed to %s",
++		    enabled ? "enabled" : "disabled");
++
++	if (priv->rfkill_initial_id) {
++		g_source_remove (priv->rfkill_initial_id);
++		priv->rfkill_initial_id = 0;
++	}
++
++	manager_update_radio_enabled (self,
++				      &priv->radio_states[RFKILL_TYPE_WLAN],
++				      enabled);
++	nm_manager_update_state (self);
++}
++
++static void
++urfkill_wwan_state_changed_cb (NMUrfkillManager *mgr,
++			       gboolean enabled,
++			       gpointer user_data)
++{
++	NMManager *self = NM_MANAGER (user_data);
++	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
++	GError *error = NULL;
++
++	nm_log_dbg (LOGD_RFKILL, "urfkill wwan state changed to %s",
++		    enabled ? "enabled" : "disabled" );
++
++	manager_update_radio_enabled (self,
++				      &priv->radio_states[RFKILL_TYPE_WWAN],
++				      enabled);
++	nm_manager_update_state (self);
++}
++#endif /* WITH_URFKILL */
++
+ NM_DEFINE_SINGLETON_REGISTER (NMManager);
+ 
+ NMManager *
+@@ -6138,6 +6186,43 @@ nm_settings_get (void)
+ 	return NM_MANAGER_GET_PRIVATE (singleton_instance)->settings;
+ }
+ 
++typedef struct KillState KillState;
++struct KillState {
++	NMManager *manager;
++	gboolean wlan_enabled;
++	gboolean wwan_enabled;
++};
++
++static gboolean
++rfkill_change_timeout (gpointer user_data)
++{
++	KillState *state = (KillState *) user_data;
++	NMManager *mgr = state->manager;
++	NMManagerPrivate *priv;
++
++	g_return_val_if_fail (NM_IS_MANAGER (mgr), G_SOURCE_REMOVE);
++
++	priv = NM_MANAGER_GET_PRIVATE (mgr);
++
++	rfkill_change (mgr, priv->radio_states[RFKILL_TYPE_WLAN].desc, RFKILL_TYPE_WLAN, state->wlan_enabled);
++	rfkill_change (mgr, priv->radio_states[RFKILL_TYPE_WWAN].desc, RFKILL_TYPE_WWAN, state->wwan_enabled);
++
++       return G_SOURCE_REMOVE;
++}
++
++static void
++kill_state_free (gpointer user_data)
++{
++	KillState *state = (KillState *) user_data;
++
++	if (state->manager) {
++		g_object_unref (state->manager);
++		state->manager = NULL;
++	}
++
++	g_slice_free (KillState, (KillState *)user_data);
++}
++
+ NMManager *
+ nm_manager_setup (void)
+ {
+@@ -6217,13 +6302,35 @@ constructed (GObject *object)
+ 	                  G_CALLBACK (rfkill_manager_rfkill_changed_cb),
+ 	                  self);
+ 
++#if WITH_URFKILL
++        priv->urfkill_mgr = nm_urfkill_manager_new ();
++
++        g_signal_connect (priv->urfkill_mgr,
++                        "wlan-state-changed",
++                        G_CALLBACK (urfkill_wlan_state_changed_cb),
++                        self);
++        g_signal_connect (priv->urfkill_mgr,
++                        "wwan-state-changed",
++                        G_CALLBACK (urfkill_wlan_state_changed_cb),
++                        self);
++        urfkill_wlan_state_changed_cb (priv->urfkill_mgr, TRUE, self);
++        urfkill_wwan_state_changed_cb (priv->urfkill_mgr, TRUE, self);
++#endif
++
+ 	/* Force kernel WiFi/WWAN rfkill state to follow NM saved WiFi/WWAN state
+ 	 * in case the BIOS doesn't save rfkill state, and to be consistent with user
+ 	 * changes to the WirelessEnabled/WWANEnabled properties which toggle kernel
+ 	 * rfkill.
+ 	 */
+-	rfkill_change (self, priv->radio_states[RFKILL_TYPE_WLAN].desc, RFKILL_TYPE_WLAN, priv->radio_states[RFKILL_TYPE_WLAN].user_enabled);
+-	rfkill_change (self, priv->radio_states[RFKILL_TYPE_WWAN].desc, RFKILL_TYPE_WWAN, priv->radio_states[RFKILL_TYPE_WWAN].user_enabled);
++        KillState *kill_state = g_slice_new0 (KillState);
++        kill_state->manager = g_object_ref (self);
++        kill_state->wlan_enabled = priv->radio_states[RFKILL_TYPE_WLAN].user_enabled;
++        kill_state->wwan_enabled = priv->radio_states[RFKILL_TYPE_WWAN].user_enabled;
++
++        priv->rfkill_initial_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, 10,
++                                                                rfkill_change_timeout,
++                                                                kill_state,
++                                                                kill_state_free);
+ }
+ 
+ static void
+diff --git a/src/nm-urfkill-manager.c b/src/nm-urfkill-manager.c
+new file mode 100644
+index 0000000..5698cd8
+--- /dev/null
++++ b/src/nm-urfkill-manager.c
+@@ -0,0 +1,290 @@
++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
++/* NetworkManager -- Network link manager
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with this program; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Copyright (C) 2006 - 2010 Red Hat, Inc.
++ * Copyright (C) 2006 - 2008 Novell, Inc.
++ */
++
++#include "nm-default.h"
++
++#include "config.h"
++#include "nm-core-internal.h"
++#include "nm-urfkill-manager.h"
++#include "nm-utils/nm-glib.h"
++
++#include <gio/gio.h>
++#include <string.h>
++#include "nm-logging.h"
++
++enum {
++	WLAN_STATE_CHANGED,
++	WWAN_STATE_CHANGED,
++	NUMBER_OF_SIGNALS
++};
++
++static guint signals[NUMBER_OF_SIGNALS];
++
++struct _NMUrfkillManager {
++	GObject parent_instance;
++
++	guint urfkill_watch;
++
++	GDBusProxy *wlan_proxy;
++	GDBusProxy *wwan_proxy;
++
++	GCancellable *watch_cancellable;
++	GCancellable *wlan_proxy_cancellable;
++	GCancellable *wwan_proxy_cancellable;
++};
++
++typedef GObjectClass NMUrfkillManagerClass;
++
++G_DEFINE_TYPE(NMUrfkillManager, nm_urfkill_manager, G_TYPE_OBJECT)
++
++static void
++wlan_state_changed (GDBusProxy *proxy,
++		    GVariant            *changed_properties,
++		    const gchar* const  *invalidated_properties,
++		    gpointer             user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++	gboolean enabled;
++
++	enabled = nm_urfkill_get_wlan_state (self);
++
++	nm_log_dbg (LOGD_RFKILL, "received state change for WLAN: %s",
++		    enabled ? "unblocked" : "blocked");
++
++	g_signal_emit (self, signals[WLAN_STATE_CHANGED], 0, enabled);
++}
++
++static void
++wwan_state_changed (GDBusProxy *proxy,
++		    GVariant            *changed_properties,
++		    const gchar* const  *invalidated_properties,
++		    gpointer             user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++	gboolean enabled;
++
++	enabled = nm_urfkill_get_wwan_state (self);
++
++	nm_log_dbg (LOGD_RFKILL, "received state change for WWAN: %s",
++		    enabled ? "unblocked" : "blocked");
++
++	g_signal_emit (self, signals[WWAN_STATE_CHANGED], 0, enabled);
++}
++
++static void
++wlan_proxy_created (GObject *source_object,
++		    GAsyncResult *res,
++		    gpointer user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++	GDBusProxy *wlan_proxy;
++	GError *error;
++
++	wlan_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
++
++	if (wlan_proxy) {
++		self->wlan_proxy = wlan_proxy;
++
++		g_signal_connect (self->wlan_proxy, "g-properties-changed",
++				  G_CALLBACK (wlan_state_changed), self);
++		g_signal_emit (self, signals[WLAN_STATE_CHANGED], 0,
++			       nm_urfkill_get_wlan_state (self));
++	} else {
++		nm_log_warn (LOGD_RFKILL, "could not create URfkill WLAN device proxy");
++	}
++}
++
++static void
++wwan_proxy_created (GObject *source_object,
++		    GAsyncResult *res,
++		    gpointer user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++	GDBusProxy *wwan_proxy;
++	GError *error;
++
++	wwan_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
++
++	if (wwan_proxy) {
++		self->wwan_proxy = wwan_proxy;
++
++		g_signal_connect (self->wwan_proxy, "g-properties-changed",
++				  G_CALLBACK (wwan_state_changed), self);
++		g_signal_emit (self, signals[WWAN_STATE_CHANGED], 0,
++			       nm_urfkill_get_wwan_state (self));
++	} else {
++		nm_log_warn (LOGD_RFKILL, "could not create URfkill WWAN device proxy");
++	}
++}
++
++gboolean
++nm_urfkill_get_wlan_state (NMUrfkillManager *self)
++{
++	GVariant *state;
++	gboolean enabled = TRUE;
++
++	g_return_val_if_fail (self->wlan_proxy != NULL, enabled);
++
++	state = g_dbus_proxy_get_cached_property (self->wlan_proxy, "state");
++
++	if (state) {
++		nm_log_dbg (LOGD_RFKILL, "wlan state from urfkill: %d",
++			    g_variant_get_int32 (state));
++		enabled = (g_variant_get_int32 (state) <= 0);
++		g_variant_unref (state);
++	} else {
++		nm_log_warn (LOGD_RFKILL, "invalid wlan state from urfkill cached properties");
++	}
++
++	return enabled;
++}
++
++gboolean
++nm_urfkill_get_wwan_state (NMUrfkillManager *self)
++{
++	GVariant *state;
++	gboolean enabled = TRUE;
++
++	g_return_val_if_fail (self->wwan_proxy != NULL, enabled);
++
++	state = g_dbus_proxy_get_cached_property (self->wwan_proxy, "state");
++
++	if (state) {
++		nm_log_dbg (LOGD_RFKILL, "wwan state from urfkill: %d",
++			    g_variant_get_int32 (state));
++		enabled = (g_variant_get_int32 (state) <= 0);
++		g_variant_unref (state);
++	} else {
++		nm_log_warn (LOGD_RFKILL, "invalid wwan state from urfkill cached properties");
++	}
++
++	return enabled;
++}
++
++static void
++on_urfkill_appeared (GDBusConnection *connection,
++		     const gchar     *name,
++		     const gchar     *name_owner,
++		     gpointer         user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++
++	nm_log_info (LOGD_RFKILL, "urfkill appeared on the bus");
++
++	self->wlan_proxy_cancellable = g_cancellable_new ();
++	self->wwan_proxy_cancellable = g_cancellable_new ();
++
++	g_dbus_proxy_new (connection,
++			  G_DBUS_PROXY_FLAGS_NONE,
++			  NULL,
++			  "org.freedesktop.URfkill",
++			  "/org/freedesktop/URfkill/WLAN",
++			  "org.freedesktop.URfkill.Killswitch",
++			  self->wlan_proxy_cancellable,
++			  wlan_proxy_created,
++			  self);
++
++	g_dbus_proxy_new (connection,
++			  G_DBUS_PROXY_FLAGS_NONE,
++			  NULL,
++			  "org.freedesktop.URfkill",
++			  "/org/freedesktop/URfkill/WWAN",
++			  "org.freedesktop.URfkill.Killswitch",
++			  self->wwan_proxy_cancellable,
++			  wwan_proxy_created,
++			  self);
++}
++
++static void
++on_urfkill_vanished (GDBusConnection *connection,
++		     const gchar     *name,
++		     gpointer         user_data)
++{
++	NMUrfkillManager *self = NM_URFKILL_MANAGER (user_data);
++
++	nm_log_info (LOGD_RFKILL, "urfkill disappeared from the bus");
++
++	if (self->wlan_proxy)
++		g_object_unref (self->wlan_proxy);
++	if (self->wwan_proxy)
++		g_object_unref (self->wwan_proxy);
++}
++
++static void
++nm_urfkill_manager_init (NMUrfkillManager *self)
++{
++	self->urfkill_watch = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
++						"org.freedesktop.URfkill",
++						0,
++						on_urfkill_appeared,
++						on_urfkill_vanished,
++						self,
++						NULL);
++}
++
++NMUrfkillManager *
++nm_urfkill_manager_new (void)
++{
++	return NM_URFKILL_MANAGER (g_object_new (NM_TYPE_URFKILL_MANAGER, NULL));
++}
++
++static void
++nm_urfkill_manager_finalize (GObject *object)
++{
++	NMUrfkillManager *mgr = NM_URFKILL_MANAGER (object);
++
++	if (mgr->wlan_proxy_cancellable)
++		g_cancellable_cancel (mgr->wlan_proxy_cancellable);
++	if (mgr->wwan_proxy_cancellable)
++		g_cancellable_cancel (mgr->wwan_proxy_cancellable);
++
++	if (mgr->urfkill_watch) {
++		g_bus_unwatch_name (mgr->urfkill_watch);
++		mgr->urfkill_watch = 0;
++	}
++
++	if (mgr->wlan_proxy)
++		g_object_unref (mgr->wlan_proxy);
++	if (mgr->wwan_proxy)
++		g_object_unref (mgr->wwan_proxy);
++
++	G_OBJECT_CLASS (nm_urfkill_manager_parent_class)->finalize (object);
++}
++
++static void
++nm_urfkill_manager_class_init (NMUrfkillManagerClass *class)
++{
++	class->finalize = nm_urfkill_manager_finalize;
++
++	signals[WLAN_STATE_CHANGED] =
++		g_signal_new (NM_URFKILL_MANAGER_WLAN_STATE_CHANGED,
++			      G_OBJECT_CLASS_TYPE (class),
++			      G_SIGNAL_RUN_LAST, 0,
++			      NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
++			      G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
++
++	signals[WWAN_STATE_CHANGED] =
++		g_signal_new (NM_URFKILL_MANAGER_WWAN_STATE_CHANGED,
++			      G_OBJECT_CLASS_TYPE (class),
++			      G_SIGNAL_RUN_LAST, 0,
++			      NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
++			      G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
++}
+diff --git a/src/nm-urfkill-manager.h b/src/nm-urfkill-manager.h
+new file mode 100644
+index 0000000..7b872f7
+--- /dev/null
++++ b/src/nm-urfkill-manager.h
+@@ -0,0 +1,49 @@
++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
++/* NetworkManager -- Network link manager
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License along
++ * with this program; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Copyright (C) 2006 - 2008 Red Hat, Inc.
++ * Copyright (C) 2006 - 2008 Novell, Inc.
++ */
++
++#ifndef __NM_URFKILL_MANAGER_H__
++#define __NM_URFKILL_MANAGER_H__
++
++#include <glib-object.h>
++
++#include "nm-utils/nm-glib.h"
++
++G_BEGIN_DECLS
++
++#define NM_TYPE_URFKILL_MANAGER (nm_urfkill_manager_get_type ())
++#define NM_URFKILL_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NM_TYPE_URFKILL_MANAGER, NMUrfkillManager))
++#define NM_IS_URFKILL_MANAGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), NM_TYPE_URFKILL_MANAGER))
++
++#define NM_URFKILL_MANAGER_WLAN_STATE_CHANGED "wlan-state-changed"
++#define NM_URFKILL_MANAGER_WWAN_STATE_CHANGED "wwan-state-changed"
++
++typedef struct _NMUrfkillManager NMUrfkillManager;
++
++GType nm_urfkill_manager_get_type (void);
++
++NMUrfkillManager *nm_urfkill_manager_new (void);
++
++gboolean nm_urfkill_get_wlan_state (NMUrfkillManager *self);
++gboolean nm_urfkill_get_wwan_state (NMUrfkillManager *self);
++
++G_END_DECLS
++
++#endif /* __NM_URFKILL_MANAGER_H__ */
diff --git a/debian/patches/Update-dnsmasq-parameters.patch b/debian/patches/Update-dnsmasq-parameters.patch
new file mode 100644
index 00000000..24c75a3c
--- /dev/null
+++ b/debian/patches/Update-dnsmasq-parameters.patch
@@ -0,0 +1,58 @@
+From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stephane.graber@canonical.com>
+Date: Thu, 12 May 2016 22:44:06 +0800
+Subject: Update dnsmasq parameters
+
+Disable caching since it's a potential security issue (local dns cache poisoning).
+
+See also: https://blueprints.launchpad.net/ubuntu/+spec/foundations-p-dns-resolving
+---
+ src/dns/nm-dns-dnsmasq.c | 4 ++--
+ src/dns/nm-dns-manager.c | 8 ++++----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/dns/nm-dns-dnsmasq.c b/src/dns/nm-dns-dnsmasq.c
+index 3ec1fd2d..9309c0ec 100644
+--- a/src/dns/nm-dns-dnsmasq.c
++++ b/src/dns/nm-dns-dnsmasq.c
+@@ -504,8 +504,8 @@ start_dnsmasq (NMDnsDnsmasq *self)
+ 	argv[idx++] = "--no-hosts"; /* don't use /etc/hosts to resolve */
+ 	argv[idx++] = "--bind-interfaces";
+ 	argv[idx++] = "--pid-file=" PIDFILE;
+-	argv[idx++] = "--listen-address=127.0.0.1"; /* Should work for both 4 and 6 */
+-	argv[idx++] = "--cache-size=400";
++	argv[idx++] = "--listen-address=127.0.1.1"; /* Should work for both 4 and 6 */
++	argv[idx++] = "--cache-size=0";
+ 	argv[idx++] = "--clear-on-reload"; /* clear cache when dns server changes */
+ 	argv[idx++] = "--conf-file=/dev/null"; /* avoid loading /etc/dnsmasq.conf */
+ 	argv[idx++] = "--proxy-dnssec"; /* Allow DNSSEC to pass through */
+diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c
+index 754fb80f..3dbf2f7e 100644
+--- a/src/dns/nm-dns-manager.c
++++ b/src/dns/nm-dns-manager.c
+@@ -1164,12 +1164,12 @@ update_dns (NMDnsManager *self,
+ 		;
+ 	}
+ 
+-	/* If caching was successful, we only send 127.0.0.1 to /etc/resolv.conf
++	/* If caching was successful, we only send 127.0.1.1 to /etc/resolv.conf
+ 	 * to ensure that the glibc resolver doesn't try to round-robin nameservers,
+ 	 * but only uses the local caching nameserver.
+ 	 */
+ 	if (caching) {
+-		const char *lladdr = "127.0.0.1";
++		const char *lladdr = "127.0.1.1";
+ 
+ 		if (NM_IS_DNS_SYSTEMD_RESOLVED (priv->plugin)) {
+ 			/* systemd-resolved uses a different link-local address */
+@@ -1558,7 +1558,7 @@ nm_dns_manager_stop (NMDnsManager *self)
+ 	_LOGT ("stopping...");
+ 
+ 	/* If we're quitting, leave a valid resolv.conf in place, not one
+-	 * pointing to 127.0.0.1 if any plugins were active.  Thus update
++	 * pointing to 127.0.1.1 if any plugins were active.  Thus update
+ 	 * DNS after disposing of all plugins.  But if we haven't done any
+ 	 * DNS updates yet, there's no reason to touch resolv.conf on shutdown.
+ 	 */
+-- 
+2.14.1
+
diff --git a/debian/patches/dns-manager-don-t-merge-split-DNS-search-domains.patch b/debian/patches/dns-manager-don-t-merge-split-DNS-search-domains.patch
new file mode 100644
index 00000000..bc313505
--- /dev/null
+++ b/debian/patches/dns-manager-don-t-merge-split-DNS-search-domains.patch
@@ -0,0 +1,88 @@
+From: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Date: Wed, 15 Jun 2016 16:07:27 +0300
+Subject: dns-manager: don't merge split-DNS search domains
+
+Signed-off-by: Mathieu Trudel-Lapierre <mathieu.trudel-lapierre@canonical.com>
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/network-manager/+bug/1592721
+---
+ src/dns/nm-dns-manager.c | 36 ++++++++++++++++++++----------------
+ 1 file changed, 20 insertions(+), 16 deletions(-)
+
+Index: b/src/dns/nm-dns-manager.c
+===================================================================
+--- a/src/dns/nm-dns-manager.c
++++ b/src/dns/nm-dns-manager.c
+@@ -295,7 +295,7 @@
+ }
+ 
+ static void
+-merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
++merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src, gboolean never_default)
+ {
+ 	guint32 num, num_domains, num_searches, i;
+ 
+@@ -308,13 +308,14 @@
+ 	num_domains = nm_ip4_config_get_num_domains (src);
+ 	num_searches = nm_ip4_config_get_num_searches (src);
+ 
+-	for (i = 0; i < num_searches; i++) {
+-		const char *search;
+-
+-		search = nm_ip4_config_get_search (src, i);
+-		if (!domain_is_valid (search, FALSE))
+-			continue;
+-		add_string_item (rc->searches, search);
++	if (!never_default) {
++		for (i = 0; i < num_searches; i++) {
++			const char *search;
++			search = nm_ip4_config_get_search (src, i);
++			if (!domain_is_valid (search, FALSE))
++				continue;
++			add_string_item (rc->searches, search);
++		}
+ 	}
+ 
+ 	if (num_domains > 1 || !num_searches) {
+@@ -351,7 +352,7 @@
+ }
+ 
+ static void
+-merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src, const char *iface)
++merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src, const char *iface, gboolean never_default)
+ {
+ 	guint32 num, num_domains, num_searches, i;
+ 
+@@ -378,13 +379,14 @@
+ 	num_domains = nm_ip6_config_get_num_domains (src);
+ 	num_searches = nm_ip6_config_get_num_searches (src);
+ 
+-	for (i = 0; i < num_searches; i++) {
+-		const char *search;
+-
+-		search = nm_ip6_config_get_search (src, i);
+-		if (!domain_is_valid (search, FALSE))
+-			continue;
+-		add_string_item (rc->searches, search);
++	if (!never_default) {
++		for (i = 0; i < num_searches; i++) {
++			const char *search;
++			search = nm_ip6_config_get_search (src, i);
++			if (!domain_is_valid (search, FALSE))
++				continue;
++			add_string_item (rc->searches, search);
++		}
+ 	}
+ 
+ 	if (num_domains > 1 || !num_searches) {
+@@ -412,9 +414,9 @@
+                           NMDnsIPConfigData *data)
+ {
+ 	if (NM_IS_IP4_CONFIG (data->config))
+-		merge_one_ip4_config (rc, (NMIP4Config *) data->config);
++		merge_one_ip4_config (rc, (NMIP4Config *) data->config, nm_ip4_config_get_never_default (data->config));
+ 	else if (NM_IS_IP6_CONFIG (data->config))
+-		merge_one_ip6_config (rc, (NMIP6Config *) data->config, data->iface);
++		merge_one_ip6_config (rc, (NMIP6Config *) data->config, data->iface, nm_ip4_config_get_never_default (data->config));
+ 	else
+ 		g_return_if_reached ();
+ }
diff --git a/debian/patches/fix-resolved-detection.patch b/debian/patches/fix-resolved-detection.patch
new file mode 100644
index 00000000..81f1101c
--- /dev/null
+++ b/debian/patches/fix-resolved-detection.patch
@@ -0,0 +1,22 @@
+Description: Fix resolved detection, add stub-resolv.conf support
+ Fix resolved detection, the symlink target is usually relative to the
+ root, such that in chroots the file points to a file inside the
+ chroot. But keep absolute targets too, as these may have been in use
+ with older version of systemd.  Add support for stub-resolv.conf
+ detection.
+Author: Dimitri John Ledkov <xnox@ubuntu.com>
+
+--- network-manager-1.8.2.orig/src/dns/nm-dns-manager.c
++++ network-manager-1.8.2/src/dns/nm-dns-manager.c
+@@ -1645,6 +1645,11 @@ static gboolean
+ _resolvconf_resolved_managed (void)
+ {
+ 	static const char *const RESOLVED_PATHS[] = {
++		"../run/systemd/resolve/stub-resolv.conf",
++		"../run/systemd/resolve/resolv.conf",
++		"../lib/systemd/resolv.conf",
++		"../usr/lib/systemd/resolv.conf",
++		"/run/systemd/resolve/stub-resolv.conf",
+ 		"/run/systemd/resolve/resolv.conf",
+ 		"/lib/systemd/resolv.conf",
+ 		"/usr/lib/systemd/resolv.conf",
diff --git a/debian/patches/libnm-Check-self-still-NMManager-or-not.patch b/debian/patches/libnm-Check-self-still-NMManager-or-not.patch
new file mode 100644
index 00000000..94cd7a01
--- /dev/null
+++ b/debian/patches/libnm-Check-self-still-NMManager-or-not.patch
@@ -0,0 +1,33 @@
+From: "Shih-Yuan Lee (FourDollars)" <sylee@canonical.com>
+Date: Tue, 17 May 2016 17:26:06 +0800
+Subject: libnm: Check self still NMManager or not
+
+Return if self is not NMManager or it will crash.
+---
+ libnm/nm-manager.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/libnm/nm-manager.c b/libnm/nm-manager.c
+index e664b71..f8e2be2 100644
+--- a/libnm/nm-manager.c
++++ b/libnm/nm-manager.c
+@@ -839,7 +839,7 @@ find_active_connection_by_path (NMManager *self, const char *ac_path)
+ static void
+ recheck_pending_activations (NMManager *self)
+ {
+-	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
++	NMManagerPrivate *priv;
+ 	CList *iter, *safe;
+ 	NMActiveConnection *candidate;
+ 	const GPtrArray *devices;
+@@ -849,6 +849,10 @@ recheck_pending_activations (NMManager *self)
+ 
+ 	object_manager = _nm_object_get_dbus_object_manager (NM_OBJECT (self));
+ 
++	g_return_if_fail (NM_IS_MANAGER (self));
++
++	priv = NM_MANAGER_GET_PRIVATE (self);
++
+ 	/* For each pending activation, look for an active connection that has the
+ 	 * pending activation's object path, where the active connection and its
+ 	 * device have both updated their properties to point to each other, and
diff --git a/debian/patches/series b/debian/patches/series
index e44814db..62038d6a 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,14 @@ Fix-arping-path.patch
 Don-t-make-NetworkManager-D-Bus-activatable.patch
 Fix-iscsiadm-path.patch
 libnm-register-empty-NMClient-and-NetworkManager-when-loa.patch
+Provide-access-to-some-of-NM-s-interfaces-to-whoopsie.patch
+Update-dnsmasq-parameters.patch
+Ignore-rmnet_usbX-devices.patch
+Ignore-p2p0-wifi-devices-from-android.patch
+Track-killswitch-change-signals-from-urfkill.patch
+Only-test-team-devices-if-we-built-support-for-them.patch
+Disable-general-with-expect.patch
+libnm-Check-self-still-NMManager-or-not.patch
+dns-manager-don-t-merge-split-DNS-search-domains.patch
+Read-system-connections-from-run.patch
+fix-resolved-detection.patch