diff options
| author | Jeremy Bicha <jbicha@ubuntu.com> | 2017-11-12 15:05:40 -0500 |
|---|---|---|
| committer | Jeremy Bicha <jbicha@ubuntu.com> | 2017-11-12 17:33:41 -0500 |
| commit | 4c81b8e520f9349f6e5ef6902786712d07e91122 (patch) | |
| tree | 9767a51c4cc2537c6476479429f0b114c1bbf491 /debian | |
| parent | 5c866128b172760e407957141e8d15e7f5654eee (diff) | |
Import Ubuntu patches
Diffstat (limited to 'debian')
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 |