From f53db99e24ff6ea7b28cd18194443a3df0c439ec Mon Sep 17 00:00:00 2001 From: Jiří Klimeš Date: Jan 05 2015 12:04:49 +0000 Subject: Update to the latest snapshot of 0.9.10 dhcp: fix dhclient abnormal exit due to SIGPIPE (bgo #735962) (rh #1178666) --- diff --git a/.gitignore b/.gitignore index 340cb9c..90e062b 100644 --- a/.gitignore +++ b/.gitignore @@ -308,3 +308,4 @@ network-manager-applet-0.8.1.tar.bz2 /NetworkManager-0.9.9.95.git20140609.1963adda.tar.bz2 /NetworkManager-0.9.9.98.git20140620.63b0a2f5.tar.bz2 /NetworkManager-0.9.10.0.git20140704.6eb82acd.tar.bz2 +/NetworkManager-0.9.10.1.git20150105.b00ad26.tar.bz2 diff --git a/0001-policy-allow-non-local-admin-sessions-to-control-the.patch b/0001-policy-allow-non-local-admin-sessions-to-control-the.patch deleted file mode 100644 index 5086775..0000000 --- a/0001-policy-allow-non-local-admin-sessions-to-control-the.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 2a10b58fad810aca1a041cd37b00241ace9be0c7 Mon Sep 17 00:00:00 2001 -From: Marius Vollmer -Date: Mon, 13 Oct 2014 15:58:46 -0500 -Subject: [PATCH 1/4] policy: allow non-local admin sessions to control the - network (rh #1145646) - -(cherry picked from commit 4f950ee5692e57bbc9737720adfd7ad6788dabb7) ---- - policy/org.freedesktop.NetworkManager.policy.in.in | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/policy/org.freedesktop.NetworkManager.policy.in.in b/policy/org.freedesktop.NetworkManager.policy.in.in -index cb22999..daefd80 100644 ---- a/policy/org.freedesktop.NetworkManager.policy.in.in -+++ b/policy/org.freedesktop.NetworkManager.policy.in.in -@@ -58,6 +58,7 @@ - <_description>Allow control of network connections - <_message>System policy prevents control of network connections - -+ auth_admin - yes - yes - --- -1.9.3 - diff --git a/0002-bluez-split-out-errors.patch b/0002-bluez-split-out-errors.patch deleted file mode 100644 index 6d3d438..0000000 --- a/0002-bluez-split-out-errors.patch +++ /dev/null @@ -1,171 +0,0 @@ -From 616d032c62f0d02be7ec29ff012c45c284f397a8 Mon Sep 17 00:00:00 2001 -From: Dan Williams -Date: Mon, 16 Jun 2014 11:04:06 -0500 -Subject: [PATCH 2/4] bluez: split out errors - -We'll use them from more places than nm nm-bt-device.c in the future. - -(cherry picked from commit 5254ac456ecd2f5ef76b0a1937f52b75e319f204) ---- - src/devices/bluetooth/Makefile.am | 4 +++- - src/devices/bluetooth/nm-bt-error.c | 33 +++++++++++++++++++++++++++++++++ - src/devices/bluetooth/nm-bt-error.h | 35 +++++++++++++++++++++++++++++++++++ - src/devices/bluetooth/nm-device-bt.c | 13 ++----------- - src/devices/bluetooth/nm-device-bt.h | 6 ------ - 5 files changed, 73 insertions(+), 18 deletions(-) - create mode 100644 src/devices/bluetooth/nm-bt-error.c - create mode 100644 src/devices/bluetooth/nm-bt-error.h - -diff --git a/src/devices/bluetooth/Makefile.am b/src/devices/bluetooth/Makefile.am -index 639a1ad..4342d4b 100644 ---- a/src/devices/bluetooth/Makefile.am -+++ b/src/devices/bluetooth/Makefile.am -@@ -24,7 +24,7 @@ AM_CPPFLAGS = \ - GLIB_GENERATED = nm-bt-enum-types.h nm-bt-enum-types.c - GLIB_MKENUMS_H_FLAGS = --identifier-prefix NM - GLIB_MKENUMS_C_FLAGS = --identifier-prefix NM --nm_bt_enum_types_sources = $(srcdir)/nm-device-bt.h -+nm_bt_enum_types_sources = $(srcdir)/nm-bt-error.h - - nm-device-bt-glue.h: $(top_srcdir)/introspection/nm-device-bt.xml - dbus-binding-tool --prefix=nm_device_bt --mode=glib-server --output=$@ $< -@@ -47,6 +47,8 @@ libnm_device_plugin_bluetooth_la_SOURCES = \ - nm-bluez4-manager.h \ - nm-bluez5-manager.c \ - nm-bluez5-manager.h \ -+ nm-bt-error.h \ -+ nm-bt-error.c \ - \ - nm-device-bt.c \ - nm-device-bt.h \ -diff --git a/src/devices/bluetooth/nm-bt-error.c b/src/devices/bluetooth/nm-bt-error.c -new file mode 100644 -index 0000000..d014a10 ---- /dev/null -+++ b/src/devices/bluetooth/nm-bt-error.c -@@ -0,0 +1,33 @@ -+/* -*- 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) 2014 Red Hat, Inc. -+ */ -+ -+#include -+#include "nm-bt-error.h" -+ -+GQuark -+nm_bt_error_quark (void) -+{ -+ static GQuark quark = 0; -+ if (!quark) -+ quark = g_quark_from_static_string ("nm-bt-error"); -+ return quark; -+} -+ -+ -diff --git a/src/devices/bluetooth/nm-bt-error.h b/src/devices/bluetooth/nm-bt-error.h -new file mode 100644 -index 0000000..fa3a957 ---- /dev/null -+++ b/src/devices/bluetooth/nm-bt-error.h -@@ -0,0 +1,35 @@ -+/* -*- 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) 2014 Red Hat, Inc. -+ */ -+ -+#ifndef _NM_BLUEZ5_ERROR_H_ -+#define _NM_BLUEZ5_ERROR_H_ -+ -+typedef enum { -+ NM_BT_ERROR_CONNECTION_NOT_BT = 0, /*< nick=ConnectionNotBt >*/ -+ NM_BT_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/ -+ NM_BT_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/ -+ NM_BT_ERROR_DUN_CONNECT_FAILED, /*< nick=DunConnectFailed >*/ -+} NMBtError; -+ -+#define NM_BT_ERROR (nm_bt_error_quark ()) -+GQuark nm_bt_error_quark (void); -+ -+#endif /* _NM_BT_ERROR_H_ */ -+ -diff --git a/src/devices/bluetooth/nm-device-bt.c b/src/devices/bluetooth/nm-device-bt.c -index 6e1a399..ca3deb2 100644 ---- a/src/devices/bluetooth/nm-device-bt.c -+++ b/src/devices/bluetooth/nm-device-bt.c -@@ -46,6 +46,8 @@ - #include "NetworkManagerUtils.h" - #include "nm-bt-enum-types.h" - #include "nm-utils.h" -+#include "nm-bt-error.h" -+#include "nm-bt-enum-types.h" - - #define MM_OLD_DBUS_SERVICE "org.freedesktop.ModemManager" - #define MM_NEW_DBUS_SERVICE "org.freedesktop.ModemManager1" -@@ -94,17 +96,6 @@ enum { - static guint signals[LAST_SIGNAL] = { 0 }; - - --#define NM_BT_ERROR (nm_bt_error_quark ()) -- --static GQuark --nm_bt_error_quark (void) --{ -- static GQuark quark = 0; -- if (!quark) -- quark = g_quark_from_static_string ("nm-bt-error"); -- return quark; --} -- - guint32 nm_device_bt_get_capabilities (NMDeviceBt *self) - { - g_return_val_if_fail (NM_IS_DEVICE_BT (self), NM_BT_CAPABILITY_NONE); -diff --git a/src/devices/bluetooth/nm-device-bt.h b/src/devices/bluetooth/nm-device-bt.h -index 83732bc..ac5b115 100644 ---- a/src/devices/bluetooth/nm-device-bt.h -+++ b/src/devices/bluetooth/nm-device-bt.h -@@ -34,12 +34,6 @@ G_BEGIN_DECLS - #define NM_IS_DEVICE_BT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DEVICE_BT)) - #define NM_DEVICE_BT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DEVICE_BT, NMDeviceBtClass)) - --typedef enum { -- NM_BT_ERROR_CONNECTION_NOT_BT = 0, /*< nick=ConnectionNotBt >*/ -- NM_BT_ERROR_CONNECTION_INVALID, /*< nick=ConnectionInvalid >*/ -- NM_BT_ERROR_CONNECTION_INCOMPATIBLE, /*< nick=ConnectionIncompatible >*/ --} NMBtError; -- - #define NM_DEVICE_BT_NAME "name" - #define NM_DEVICE_BT_CAPABILITIES "bt-capabilities" - #define NM_DEVICE_BT_DEVICE "bt-device" --- -1.9.3 - diff --git a/0003-bluez-track-adapter-address-in-NMBluezDevice.patch b/0003-bluez-track-adapter-address-in-NMBluezDevice.patch deleted file mode 100644 index a50219f..0000000 --- a/0003-bluez-track-adapter-address-in-NMBluezDevice.patch +++ /dev/null @@ -1,147 +0,0 @@ -From d59bd3c9b57e55b20fd4d2e4781a8da123546f4d Mon Sep 17 00:00:00 2001 -From: Dan Williams -Date: Mon, 16 Jun 2014 10:20:29 -0500 -Subject: [PATCH 3/4] bluez: track adapter address in NMBluezDevice - -We'll need it for bluez5 DUN support. - -[lkundrak@v3.sk: Turn the addresses to strings from guint8[ETH_ALEN], as that -is what rest of NetworkManager uses for MAC addresses and what Bluez utility -functions expect as well.] - -(cherry picked from commit 384ec8606488e67433753eb52440b4846a3090e7) ---- - src/devices/bluetooth/nm-bluez-device.c | 29 ++++++++++++++++++++++++++--- - src/devices/bluetooth/nm-bluez-device.h | 5 ++++- - src/devices/bluetooth/nm-bluez4-adapter.c | 2 +- - src/devices/bluetooth/nm-bluez5-manager.c | 2 +- - 4 files changed, 32 insertions(+), 6 deletions(-) - -diff --git a/src/devices/bluetooth/nm-bluez-device.c b/src/devices/bluetooth/nm-bluez-device.c -index 4c448a3..edebb75 100644 ---- a/src/devices/bluetooth/nm-bluez-device.c -+++ b/src/devices/bluetooth/nm-bluez-device.c -@@ -55,6 +55,7 @@ typedef struct { - gboolean usable; - NMBluetoothCapabilities connection_bt_type; - -+ char *adapter_address; - char *address; - guint8 bin_address[ETH_ALEN]; - char *name; -@@ -270,7 +271,7 @@ check_emit_usable (NMBluezDevice *self) - new_usable = (priv->initialized && priv->capabilities && priv->name && - ((priv->bluez_version == 4) || - (priv->bluez_version == 5 && priv->adapter5 && priv->adapter_powered) ) && -- priv->dbus_connection && priv->address); -+ priv->dbus_connection && priv->address && priv->adapter_address); - - if (!new_usable) - goto END; -@@ -558,6 +559,18 @@ nm_bluez_device_connect_finish (NMBluezDevice *self, - - /***********************************************************/ - -+static void -+set_adapter_address (NMBluezDevice *self, const char *address) -+{ -+ NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); -+ -+ g_return_if_fail (address); -+ -+ if (priv->adapter_address) -+ g_free (priv->adapter_address); -+ priv->adapter_address = g_strdup (address); -+} -+ - static guint32 - convert_uuids_to_capabilities (const char **strings, int bluez_version) - { -@@ -752,6 +765,10 @@ adapter5_on_acquired (GObject *object, GAsyncResult *res, NMBluezDevice *self) - if (v) - g_variant_unref (v); - -+ v = g_dbus_proxy_get_cached_property (priv->adapter5, "Address"); -+ if (VARIANT_IS_OF_TYPE_STRING (v)) -+ set_adapter_address (self, g_variant_get_string (v, NULL)); -+ - priv->initialized = TRUE; - g_signal_emit (self, signals[INITIALIZED], 0, TRUE); - -@@ -957,7 +974,10 @@ on_bus_acquired (GObject *object, GAsyncResult *res, NMBluezDevice *self) - /********************************************************************/ - - NMBluezDevice * --nm_bluez_device_new (const char *path, NMConnectionProvider *provider, int bluez_version) -+nm_bluez_device_new (const char *path, -+ const char *adapter_address, -+ NMConnectionProvider *provider, -+ int bluez_version) - { - NMBluezDevice *self; - NMBluezDevicePrivate *priv; -@@ -978,8 +998,10 @@ nm_bluez_device_new (const char *path, NMConnectionProvider *provider, int bluez - priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); - - priv->bluez_version = bluez_version; -- - priv->provider = provider; -+ g_return_val_if_fail (bluez_version == 5 || (bluez_version == 4 && adapter_address), NULL); -+ if (adapter_address) -+ set_adapter_address (self, adapter_address); - - g_signal_connect (priv->provider, - NM_CP_SIGNAL_CONNECTION_ADDED, -@@ -1073,6 +1095,7 @@ finalize (GObject *object) - nm_log_dbg (LOGD_BT, "bluez[%s]: finalize NMBluezDevice", priv->path); - - g_free (priv->path); -+ g_free (priv->adapter_address); - g_free (priv->address); - g_free (priv->name); - g_free (priv->bt_iface); -diff --git a/src/devices/bluetooth/nm-bluez-device.h b/src/devices/bluetooth/nm-bluez-device.h -index 0bf7d89..25891a0 100644 ---- a/src/devices/bluetooth/nm-bluez-device.h -+++ b/src/devices/bluetooth/nm-bluez-device.h -@@ -62,7 +62,10 @@ typedef struct { - - GType nm_bluez_device_get_type (void); - --NMBluezDevice *nm_bluez_device_new (const char *path, NMConnectionProvider *provider, int bluez_version); -+NMBluezDevice *nm_bluez_device_new (const char *path, -+ const char *adapter_address, -+ NMConnectionProvider *provider, -+ int bluez_version); - - const char *nm_bluez_device_get_path (NMBluezDevice *self); - -diff --git a/src/devices/bluetooth/nm-bluez4-adapter.c b/src/devices/bluetooth/nm-bluez4-adapter.c -index ad1786f..9c57d97 100644 ---- a/src/devices/bluetooth/nm-bluez4-adapter.c -+++ b/src/devices/bluetooth/nm-bluez4-adapter.c -@@ -162,7 +162,7 @@ device_created (DBusGProxy *proxy, const char *path, gpointer user_data) - NMBluez4AdapterPrivate *priv = NM_BLUEZ4_ADAPTER_GET_PRIVATE (self); - NMBluezDevice *device; - -- device = nm_bluez_device_new (path, priv->provider, 4); -+ device = nm_bluez_device_new (path, priv->address, priv->provider, 4); - g_signal_connect (device, "initialized", G_CALLBACK (device_initialized), self); - g_signal_connect (device, "notify::usable", G_CALLBACK (device_usable), self); - g_hash_table_insert (priv->devices, (gpointer) nm_bluez_device_get_path (device), device); -diff --git a/src/devices/bluetooth/nm-bluez5-manager.c b/src/devices/bluetooth/nm-bluez5-manager.c -index 63006b3..8653c28 100644 ---- a/src/devices/bluetooth/nm-bluez5-manager.c -+++ b/src/devices/bluetooth/nm-bluez5-manager.c -@@ -143,7 +143,7 @@ device_added (GDBusProxy *proxy, const gchar *path, NMBluez5Manager *self) - NMBluez5ManagerPrivate *priv = NM_BLUEZ5_MANAGER_GET_PRIVATE (self); - NMBluezDevice *device; - -- device = nm_bluez_device_new (path, priv->provider, 5); -+ device = nm_bluez_device_new (path, NULL, priv->provider, 5); - g_signal_connect (device, "initialized", G_CALLBACK (device_initialized), self); - g_signal_connect (device, "notify::usable", G_CALLBACK (device_usable), self); - g_hash_table_insert (priv->devices, (gpointer) nm_bluez_device_get_path (device), device); --- -1.9.3 - diff --git a/0004-bluez-re-add-DUN-support-for-Bluez5.patch b/0004-bluez-re-add-DUN-support-for-Bluez5.patch deleted file mode 100644 index 7797781..0000000 --- a/0004-bluez-re-add-DUN-support-for-Bluez5.patch +++ /dev/null @@ -1,810 +0,0 @@ -From 2ca59ef657b1f2a584807adea923589e5a4470a1 Mon Sep 17 00:00:00 2001 -From: Lubomir Rintel -Date: Wed, 1 Oct 2014 10:59:13 +0200 -Subject: [PATCH 4/4] bluez: re-add DUN support for Bluez5 - -This adds service discovery via SDP and RFCOMM tty management to -NetworkManager, as it was dropped from Bluez. - -Based on work by Dan Williams . -The SDP discovery is based on code from Bluez project. - -(cherry picked from commit f1c9595311f52d8b79e8d2032e006005613a8fb1) ---- -[lkundrak@v3.sk: contrib/fedora/rpm/NetworkManager.spec hunk removed for RPM] - - configure.ac | 14 ++ - contrib/fedora/rpm/NetworkManager.spec | 3 + - src/devices/bluetooth/Makefile.am | 10 + - src/devices/bluetooth/nm-bluez-device.c | 134 +++++++---- - src/devices/bluetooth/nm-bluez5-dun.c | 409 ++++++++++++++++++++++++++++++++ - src/devices/bluetooth/nm-bluez5-dun.h | 46 ++++ - 6 files changed, 573 insertions(+), 43 deletions(-) - create mode 100644 src/devices/bluetooth/nm-bluez5-dun.c - create mode 100644 src/devices/bluetooth/nm-bluez5-dun.h - -diff --git a/configure.ac b/configure.ac -index d4437a6..d1ba66a 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -586,6 +586,20 @@ else - fi - AM_CONDITIONAL(WITH_MODEM_MANAGER_1, test "${with_modem_manager_1}" = "yes") - -+# Bluez5 DUN support -+PKG_CHECK_MODULES(BLUEZ5, [bluez >= 5], [have_bluez5=yes],[have_bluez5=no]) -+AC_ARG_ENABLE(bluez5-dun, AS_HELP_STRING([--enable-bluez5-dun], [enable Bluez5 DUN support]), -+ [enable_bluez5_dun=${enableval}], [enable_bluez5_dun=${have_bluez5}]) -+if (test "${enable_bluez5_dun}" = "yes"); then -+ if test x"$have_bluez5" = x"no"; then -+ AC_MSG_ERROR(Bluez 5.x development headers are required) -+ fi -+ AC_DEFINE(WITH_BLUEZ5_DUN, 1, [Define if you have Bluez 5 libraries]) -+else -+ AC_DEFINE(HAVE_BLUEZ5_DUN, 0, [Define if you have Bluez 5 libraries]) -+fi -+AM_CONDITIONAL(WITH_BLUEZ5_DUN, test "${enable_bluez5_dun}" = "yes") -+ - # DHCP client support - AC_ARG_WITH([dhclient], AS_HELP_STRING([--with-dhclient=yes|no|path], [Enable dhclient 4.x support])) - AC_ARG_WITH([dhcpcd], AS_HELP_STRING([--with-dhcpcd=yes|no|path], [Enable dhcpcd 4.x support])) -diff --git a/src/devices/bluetooth/Makefile.am b/src/devices/bluetooth/Makefile.am -index 4342d4b..7840a21 100644 ---- a/src/devices/bluetooth/Makefile.am -+++ b/src/devices/bluetooth/Makefile.am -@@ -64,6 +64,16 @@ libnm_device_plugin_bluetooth_la_LIBADD = \ - $(DBUS_LIBS) \ - $(GUDEV_LIBS) - -+if WITH_BLUEZ5_DUN -+AM_CPPFLAGS += $(BLUEZ5_CFLAGS) -+ -+libnm_device_plugin_bluetooth_la_SOURCES += \ -+ nm-bluez5-dun.c \ -+ nm-bluez5-dun.h -+ -+libnm_device_plugin_bluetooth_la_LIBADD += $(BLUEZ5_LIBS) -+endif -+ - CLEANFILES = $(BUILT_SOURCES) - EXTRA_DIST = $(SYMBOL_VIS_FILE) - -diff --git a/src/devices/bluetooth/nm-bluez-device.c b/src/devices/bluetooth/nm-bluez-device.c -index edebb75..5ca370a 100644 ---- a/src/devices/bluetooth/nm-bluez-device.c -+++ b/src/devices/bluetooth/nm-bluez-device.c -@@ -34,7 +34,8 @@ - #include "nm-logging.h" - #include "nm-utils.h" - #include "nm-settings-connection.h" -- -+#include "nm-bluez5-dun.h" -+#include "NetworkManagerUtils.h" - - G_DEFINE_TYPE (NMBluezDevice, nm_bluez_device, G_TYPE_OBJECT) - -@@ -62,7 +63,8 @@ typedef struct { - guint32 capabilities; - gboolean connected; - -- char *bt_iface; -+ char *b4_iface; -+ NMBluez5DunContext *b5_dun_context; - - NMConnectionProvider *provider; - GSList *connections; -@@ -157,9 +159,12 @@ nm_bluez_device_get_capabilities (NMBluezDevice *self) - gboolean - nm_bluez_device_get_connected (NMBluezDevice *self) - { -+ NMBluezDevicePrivate *priv; -+ - g_return_val_if_fail (NM_IS_BLUEZ_DEVICE (self), FALSE); - -- return NM_BLUEZ_DEVICE_GET_PRIVATE (self)->connected; -+ priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); -+ return priv->connected; - } - - static void -@@ -265,8 +270,7 @@ check_emit_usable (NMBluezDevice *self) - gboolean new_usable; - - /* only expect the supported capabilities set. */ -- g_assert (priv->bluez_version != 4 || ((priv->capabilities & ~(NM_BT_CAPABILITY_NAP | NM_BT_CAPABILITY_DUN)) == NM_BT_CAPABILITY_NONE )); -- g_assert (priv->bluez_version != 5 || ((priv->capabilities & ~(NM_BT_CAPABILITY_NAP )) == NM_BT_CAPABILITY_NONE )); -+ g_assert ((priv->capabilities & ~(NM_BT_CAPABILITY_NAP | NM_BT_CAPABILITY_DUN)) == NM_BT_CAPABILITY_NONE ); - - new_usable = (priv->initialized && priv->capabilities && priv->name && - ((priv->bluez_version == 4) || -@@ -421,26 +425,33 @@ nm_bluez_device_disconnect (NMBluezDevice *self) - { - NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); - GVariant *args = NULL; -- const char *dbus_iface; -+ const char *dbus_iface = NULL; - - g_return_if_fail (priv->dbus_connection); - -- if (priv->bluez_version == 5) { -- g_return_if_fail (priv->connection_bt_type == NM_BT_CAPABILITY_NAP); -- dbus_iface = BLUEZ5_NETWORK_INTERFACE; -- } else if (priv->bluez_version == 4 && priv->connection_bt_type == NM_BT_CAPABILITY_DUN) { -- /* Can't pass a NULL interface name through dbus to bluez, so just -- * ignore the disconnect if the interface isn't known. -- */ -- if (!priv->bt_iface) -- return; -- -- args = g_variant_new ("(s)", priv->bt_iface), -- dbus_iface = BLUEZ4_SERIAL_INTERFACE; -- } else { -- g_return_if_fail (priv->bluez_version == 4 && priv->connection_bt_type == NM_BT_CAPABILITY_NAP); -- dbus_iface = BLUEZ4_NETWORK_INTERFACE; -- } -+ if (priv->connection_bt_type == NM_BT_CAPABILITY_DUN) { -+ if (priv->bluez_version == 4) { -+ /* Can't pass a NULL interface name through dbus to bluez, so just -+ * ignore the disconnect if the interface isn't known. -+ */ -+ if (!priv->b4_iface) -+ goto out; -+ args = g_variant_new ("(s)", priv->b4_iface), -+ dbus_iface = BLUEZ4_SERIAL_INTERFACE; -+ } else if (priv->bluez_version == 5) { -+ nm_bluez5_dun_cleanup (priv->b5_dun_context); -+ priv->connected = FALSE; -+ goto out; -+ } -+ } else if (priv->connection_bt_type == NM_BT_CAPABILITY_NAP) { -+ if (priv->bluez_version == 4) -+ dbus_iface = BLUEZ4_NETWORK_INTERFACE; -+ else if (priv->bluez_version == 5) -+ dbus_iface = BLUEZ5_NETWORK_INTERFACE; -+ else -+ g_assert_not_reached (); -+ } else -+ g_assert_not_reached (); - - g_dbus_connection_call (priv->dbus_connection, - BLUEZ_SERVICE, -@@ -455,6 +466,8 @@ nm_bluez_device_disconnect (NMBluezDevice *self) - (GAsyncReadyCallback) bluez_disconnect_cb, - g_object_ref (self)); - -+out: -+ g_clear_pointer (&priv->b4_iface, g_free); - priv->connection_bt_type = NM_BT_CAPABILITY_NONE; - } - -@@ -481,7 +494,7 @@ bluez_connect_cb (GDBusConnection *dbus_connection, - g_simple_async_result_set_op_res_gpointer (result, - g_strdup (device), - g_free); -- priv->bt_iface = device; -+ priv->b4_iface = device; - g_variant_unref (variant); - } - -@@ -490,6 +503,26 @@ bluez_connect_cb (GDBusConnection *dbus_connection, - g_object_unref (result_object); - } - -+static void -+bluez5_dun_connect_cb (NMBluez5DunContext *context, -+ const char *device, -+ GError *error, -+ gpointer user_data) -+{ -+ GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (user_data); -+ -+ if (error) { -+ g_simple_async_result_take_error (result, error); -+ } else { -+ g_simple_async_result_set_op_res_gpointer (result, -+ g_strdup (device), -+ g_free); -+ } -+ -+ g_simple_async_result_complete (result); -+ g_object_unref (result); -+} -+ - void - nm_bluez_device_connect_async (NMBluezDevice *self, - NMBluetoothCapabilities connection_bt_type, -@@ -498,26 +531,35 @@ nm_bluez_device_connect_async (NMBluezDevice *self, - { - GSimpleAsyncResult *simple; - NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); -- const char *dbus_iface; -- const char *connect_type = BLUETOOTH_CONNECT_NAP; -+ const char *dbus_iface = NULL; -+ const char *connect_type = NULL; - - g_return_if_fail (priv->capabilities & connection_bt_type & (NM_BT_CAPABILITY_DUN | NM_BT_CAPABILITY_NAP)); - -- if (priv->bluez_version == 5) { -- g_return_if_fail (connection_bt_type == NM_BT_CAPABILITY_NAP); -- dbus_iface = BLUEZ5_NETWORK_INTERFACE; -- } else if (priv->bluez_version == 4 && connection_bt_type == NM_BT_CAPABILITY_DUN) { -- dbus_iface = BLUEZ4_SERIAL_INTERFACE; -- connect_type = BLUETOOTH_CONNECT_DUN; -- } else { -- g_return_if_fail (priv->bluez_version == 4 && connection_bt_type == NM_BT_CAPABILITY_NAP); -- dbus_iface = BLUEZ4_NETWORK_INTERFACE; -- } -- - simple = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - nm_bluez_device_connect_async); -+ priv->connection_bt_type = connection_bt_type; -+ -+ if (connection_bt_type == NM_BT_CAPABILITY_NAP) { -+ connect_type = BLUETOOTH_CONNECT_NAP; -+ if (priv->bluez_version == 4) -+ dbus_iface = BLUEZ4_NETWORK_INTERFACE; -+ else if (priv->bluez_version == 5) -+ dbus_iface = BLUEZ5_NETWORK_INTERFACE; -+ } else if (connection_bt_type == NM_BT_CAPABILITY_DUN) { -+ connect_type = BLUETOOTH_CONNECT_DUN; -+ if (priv->bluez_version == 4) -+ dbus_iface = BLUEZ4_SERIAL_INTERFACE; -+ else if (priv->bluez_version == 5) { -+ if (priv->b5_dun_context == NULL) -+ priv->b5_dun_context = nm_bluez5_dun_new (priv->adapter_address, priv->address); -+ nm_bluez5_dun_connect (priv->b5_dun_context, bluez5_dun_connect_cb, simple); -+ return; -+ } -+ } else -+ g_assert_not_reached (); - - g_dbus_connection_call (priv->dbus_connection, - BLUEZ_SERVICE, -@@ -531,8 +573,6 @@ nm_bluez_device_connect_async (NMBluezDevice *self, - NULL, - (GAsyncReadyCallback) bluez_connect_cb, - simple); -- -- priv->connection_bt_type = connection_bt_type; - } - - const char * -@@ -540,6 +580,7 @@ nm_bluez_device_connect_finish (NMBluezDevice *self, - GAsyncResult *result, - GError **error) - { -+ NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); - GSimpleAsyncResult *simple; - const char *device; - -@@ -554,6 +595,9 @@ nm_bluez_device_connect_finish (NMBluezDevice *self, - return NULL; - - device = (const char *) g_simple_async_result_get_op_res_gpointer (simple); -+ if (device && priv->bluez_version == 5) -+ priv->connected = TRUE; -+ - return device; - } - -@@ -572,7 +616,7 @@ set_adapter_address (NMBluezDevice *self, const char *address) - } - - static guint32 --convert_uuids_to_capabilities (const char **strings, int bluez_version) -+convert_uuids_to_capabilities (const char **strings) - { - const char **iter; - guint32 capabilities = 0; -@@ -584,8 +628,7 @@ convert_uuids_to_capabilities (const char **strings, int bluez_version) - if (parts && parts[0]) { - switch (g_ascii_strtoull (parts[0], NULL, 16)) { - case 0x1103: -- if (bluez_version == 4) -- capabilities |= NM_BT_CAPABILITY_DUN; -+ capabilities |= NM_BT_CAPABILITY_DUN; - break; - case 0x1116: - capabilities |= NM_BT_CAPABILITY_NAP; -@@ -606,7 +649,7 @@ _set_property_capabilities (NMBluezDevice *self, const char **uuids) - guint32 uint_val; - NMBluezDevicePrivate *priv = NM_BLUEZ_DEVICE_GET_PRIVATE (self); - -- uint_val = convert_uuids_to_capabilities (uuids, priv->bluez_version); -+ uint_val = convert_uuids_to_capabilities (uuids); - if (priv->capabilities != uint_val) { - if (priv->capabilities) { - /* changing (relevant) capabilities is not supported and ignored -- except setting initially */ -@@ -1067,6 +1110,11 @@ dispose (GObject *object) - g_clear_object (&priv->pan_connection_original); - } - -+ if (priv->b5_dun_context) { -+ nm_bluez5_dun_free (priv->b5_dun_context); -+ priv->b5_dun_context = NULL; -+ } -+ - g_signal_handlers_disconnect_by_func (priv->provider, cp_connection_added, self); - g_signal_handlers_disconnect_by_func (priv->provider, cp_connection_removed, self); - g_signal_handlers_disconnect_by_func (priv->provider, cp_connection_updated, self); -@@ -1098,7 +1146,7 @@ finalize (GObject *object) - g_free (priv->adapter_address); - g_free (priv->address); - g_free (priv->name); -- g_free (priv->bt_iface); -+ g_free (priv->b4_iface); - - if (priv->proxy) - g_signal_handlers_disconnect_by_data (priv->proxy, object); -diff --git a/src/devices/bluetooth/nm-bluez5-dun.c b/src/devices/bluetooth/nm-bluez5-dun.c -new file mode 100644 -index 0000000..dcd3d73 ---- /dev/null -+++ b/src/devices/bluetooth/nm-bluez5-dun.c -@@ -0,0 +1,409 @@ -+/* -*- 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) 2014 Red Hat, Inc. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "nm-bluez5-dun.h" -+#include "nm-bt-error.h" -+#include "nm-logging.h" -+#include "NetworkManagerUtils.h" -+ -+typedef struct _NMBluez5DunContext { -+ bdaddr_t src; -+ bdaddr_t dst; -+ char *src_str; -+ char *dst_str; -+ int rfcomm_channel; -+ int rfcomm_fd; -+ int rfcomm_tty_fd; -+ int rfcomm_id; -+ NMBluez5DunFunc callback; -+ gpointer user_data; -+ sdp_session_t *sdp_session; -+ guint sdp_watch_id; -+} NMBluez5DunContext; -+ -+static void -+dun_connect (NMBluez5DunContext *context) -+{ -+ struct sockaddr_rc sa; -+ int devid, try = 30; -+ char tty[100]; -+ const int ttylen = sizeof (tty) - 1; -+ GError *error = NULL; -+ -+ struct rfcomm_dev_req req = { -+ .flags = (1 << RFCOMM_REUSE_DLC) | (1 << RFCOMM_RELEASE_ONHUP), -+ .dev_id = -1, -+ .channel = context->rfcomm_channel -+ }; -+ -+ context->rfcomm_fd = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); -+ if (context->rfcomm_fd < 0) { -+ int errsv = errno; -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to create RFCOMM socket: (%d) %s", -+ errsv, strerror (errsv)); -+ goto done; -+ } -+ -+ /* Connect to the remote device */ -+ sa.rc_family = AF_BLUETOOTH; -+ sa.rc_channel = 0; -+ memcpy (&sa.rc_bdaddr, &context->src, ETH_ALEN); -+ if (bind (context->rfcomm_fd, (struct sockaddr *) &sa, sizeof(sa))) { -+ int errsv = errno; -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to bind socket: (%d) %s", -+ errsv, strerror (errsv)); -+ goto done; -+ } -+ -+ sa.rc_channel = context->rfcomm_channel; -+ memcpy (&sa.rc_bdaddr, &context->dst, ETH_ALEN); -+ if (connect (context->rfcomm_fd, (struct sockaddr *) &sa, sizeof (sa)) ) { -+ int errsv = errno; -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to connect to remote device: (%d) %s", -+ errsv, strerror (errsv)); -+ goto done; -+ } -+ -+ nm_log_dbg (LOGD_BT, "(%s): connected to %s on channel %d", -+ context->src_str, context->dst_str, context->rfcomm_channel); -+ -+ /* Create an RFCOMM kernel device for the DUN channel */ -+ memcpy (&req.src, &context->src, ETH_ALEN); -+ memcpy (&req.dst, &context->dst, ETH_ALEN); -+ devid = ioctl (context->rfcomm_fd, RFCOMMCREATEDEV, &req); -+ if (devid < 0) { -+ int errsv = errno; -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to create rfcomm device: (%d) %s", -+ errsv, strerror (errsv)); -+ goto done; -+ } -+ context->rfcomm_id = devid; -+ -+ snprintf (tty, ttylen, "/dev/rfcomm%d", devid); -+ while ((context->rfcomm_tty_fd = open (tty, O_RDONLY | O_NOCTTY)) < 0 && try--) { -+ if (try) { -+ g_usleep (100 * 1000); -+ continue; -+ } -+ -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to find rfcomm device: %s", -+ tty); -+ break; -+ } -+ -+done: -+ context->callback (context, tty, error, context->user_data); -+} -+ -+static void -+sdp_search_cleanup (NMBluez5DunContext *context) -+{ -+ if (context->sdp_session) { -+ sdp_close (context->sdp_session); -+ context->sdp_session = NULL; -+ } -+ -+ if (context->sdp_watch_id) { -+ g_source_remove (context->sdp_watch_id); -+ context->sdp_watch_id = 0; -+ } -+} -+ -+static void -+sdp_search_completed_cb (uint8_t type, uint16_t status, uint8_t *rsp, size_t size, void *user_data) -+{ -+ NMBluez5DunContext *context = user_data; -+ int scanned, seqlen = 0, bytesleft = size; -+ uint8_t dataType; -+ int channel = -1; -+ -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SDP search finished with type=%d status=%d", -+ context->src_str, context->dst_str, status, type); -+ -+ /* SDP response received */ -+ if (status || type != SDP_SVC_SEARCH_ATTR_RSP) { -+ GError *error = g_error_new (NM_BT_ERROR, -+ NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Did not get a Service Discovery response"); -+ context->callback (context, NULL, error, context->user_data); -+ goto done; -+ } -+ -+ scanned = sdp_extract_seqtype (rsp, bytesleft, &dataType, &seqlen); -+ -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SDP sequence type scanned=%d length=%d", -+ context->src_str, context->dst_str, scanned, seqlen); -+ -+ scanned = sdp_extract_seqtype (rsp, bytesleft, &dataType, &seqlen); -+ if (!scanned || !seqlen) { -+ /* Short read or unknown sequence type */ -+ GError *error = g_error_new (NM_BT_ERROR, -+ NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Improper Service Discovery response"); -+ context->callback (context, NULL, error, context->user_data); -+ goto done; -+ } -+ -+ rsp += scanned; -+ bytesleft -= scanned; -+ do { -+ sdp_record_t *rec; -+ int recsize = 0; -+ sdp_list_t *protos; -+ -+ rec = sdp_extract_pdu (rsp, bytesleft, &recsize); -+ if (!rec) -+ break; -+ -+ if (!recsize) { -+ sdp_record_free (rec); -+ break; -+ } -+ -+ if (sdp_get_access_protos (rec, &protos) == 0) { -+ /* Extract the DUN channel number */ -+ channel = sdp_get_proto_port (protos, RFCOMM_UUID); -+ sdp_list_free (protos, NULL); -+ -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SDP channel=%d", -+ context->src_str, context->dst_str, channel); -+ } -+ sdp_record_free (rec); -+ -+ scanned += recsize; -+ rsp += recsize; -+ bytesleft -= recsize; -+ } while ((scanned < (ssize_t) size) && (bytesleft > 0) && (channel < 0)); -+ -+done: -+ if (channel != -1) { -+ context->rfcomm_channel = channel; -+ dun_connect (context); -+ } -+ -+ sdp_search_cleanup (context); -+} -+ -+static gboolean -+sdp_search_process_cb (GIOChannel *channel, GIOCondition condition, gpointer user_data) -+{ -+ NMBluez5DunContext *context = user_data; -+ -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SDP search progressed with condition=%d", -+ context->src_str, context->dst_str, condition); -+ -+ if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL)) { -+ GError *error = g_error_new (NM_BT_ERROR, -+ NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Service Discovery interrupted"); -+ context->callback (context, NULL, error, context->user_data); -+ sdp_search_cleanup (context); -+ return FALSE; -+ } -+ -+ if (sdp_process (context->sdp_session) < 0) { -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SDP search finished", -+ context->src_str, context->dst_str); -+ -+ /* Search finished successfully. */ -+ return FALSE; -+ } -+ -+ /* Search progressed successfully. */ -+ return TRUE; -+} -+ -+static gboolean -+sdp_connect_watch (GIOChannel *channel, GIOCondition condition, gpointer user_data) -+{ -+ NMBluez5DunContext *context = user_data; -+ sdp_list_t *search, *attrs; -+ uuid_t svclass; -+ uint16_t attr; -+ int fd, err, fd_err = 0; -+ socklen_t len = sizeof (fd_err); -+ GError *error = NULL; -+ -+ context->sdp_watch_id = 0; -+ -+ fd = g_io_channel_unix_get_fd (channel); -+ if (getsockopt (fd, SOL_SOCKET, SO_ERROR, &fd_err, &len) < 0) { -+ nm_log_dbg (LOGD_BT, "(%s -> %s): getsockopt error=%d", -+ context->src_str, context->dst_str, errno); -+ err = errno; -+ } else { -+ nm_log_dbg (LOGD_BT, "(%s -> %s): SO_ERROR error=%d", -+ context->src_str, context->dst_str, fd_err); -+ err = fd_err; -+ } -+ -+ if (err != 0) { -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Error on Service Discovery socket: (%d) %s", -+ err, strerror (err)); -+ goto done; -+ } -+ -+ if (sdp_set_notify (context->sdp_session, sdp_search_completed_cb, context) < 0) { -+ /* Should not be reached, only can fail if we passed bad sdp_session. */ -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Could not request Service Discovery notification"); -+ goto done; -+ } -+ -+ sdp_uuid16_create (&svclass, DIALUP_NET_SVCLASS_ID); -+ search = sdp_list_append (NULL, &svclass); -+ attr = SDP_ATTR_PROTO_DESC_LIST; -+ attrs = sdp_list_append (NULL, &attr); -+ -+ if (!sdp_service_search_attr_async (context->sdp_session, search, SDP_ATTR_REQ_INDIVIDUAL, attrs)) { -+ /* Set callback responsible for update the internal SDP transaction */ -+ context->sdp_watch_id = g_io_add_watch (channel, -+ G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL, -+ sdp_search_process_cb, -+ context); -+ } else { -+ err = sdp_get_error (context->sdp_session); -+ error = g_error_new (NM_BT_ERROR, -+ NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Error starting Service Discovery: (%d) %s", -+ err, strerror (err)); -+ } -+ -+ sdp_list_free (attrs, NULL); -+ sdp_list_free (search, NULL); -+ -+done: -+ if (error) { -+ context->callback (context, NULL, error, context->user_data); -+ sdp_search_cleanup (context); -+ } -+ -+ return G_SOURCE_REMOVE; -+} -+ -+NMBluez5DunContext * -+nm_bluez5_dun_new (const char *adapter, -+ const char *remote) -+ -+{ -+ NMBluez5DunContext *context; -+ -+ context = g_slice_new0 (NMBluez5DunContext); -+ str2ba (adapter, &context->src); -+ str2ba (remote, &context->dst); -+ context->src_str = g_strdup (adapter); -+ context->dst_str = g_strdup (remote); -+ context->rfcomm_channel = -1; -+ context->rfcomm_id = -1; -+ context->rfcomm_fd = -1; -+ return context; -+} -+ -+void -+nm_bluez5_dun_connect (NMBluez5DunContext *context, -+ NMBluez5DunFunc callback, -+ gpointer user_data) -+{ -+ GIOChannel *channel; -+ -+ context->callback = callback; -+ context->user_data = user_data; -+ -+ if (context->rfcomm_channel != -1) { -+ nm_log_dbg (LOGD_BT, "(%s): channel number on device %s cached: %d", -+ context->src_str, context->dst_str, context->rfcomm_channel); -+ dun_connect (context); -+ return; -+ } -+ -+ nm_log_dbg (LOGD_BT, "(%s): starting channel number discovery for device %s", -+ context->src_str, context->dst_str); -+ -+ context->sdp_session = sdp_connect (&context->src, &context->dst, SDP_NON_BLOCKING); -+ if (!context->sdp_session) { -+ GError *error; -+ int err = sdp_get_error (context->sdp_session); -+ -+ error = g_error_new (NM_BT_ERROR, NM_BT_ERROR_DUN_CONNECT_FAILED, -+ "Failed to connect to the SDP server: (%d) %s", -+ err, strerror (err)); -+ context->callback (context, NULL, error, context->user_data); -+ return; -+ } -+ -+ channel = g_io_channel_unix_new (sdp_get_socket (context->sdp_session)); -+ context->sdp_watch_id = g_io_add_watch (channel, -+ G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL, -+ sdp_connect_watch, -+ context); -+ g_io_channel_unref (channel); -+} -+ -+/* Only clean up connection-related stuff to allow reconnect */ -+void -+nm_bluez5_dun_cleanup (NMBluez5DunContext *context) -+{ -+ g_return_if_fail (context != NULL); -+ -+ sdp_search_cleanup (context); -+ -+ if (context->rfcomm_fd >= 0) { -+ if (context->rfcomm_id >= 0) { -+ struct rfcomm_dev_req req = { 0 }; -+ -+ req.dev_id = context->rfcomm_id; -+ ioctl (context->rfcomm_fd, RFCOMMRELEASEDEV, &req); -+ context->rfcomm_id = -1; -+ } -+ close (context->rfcomm_fd); -+ context->rfcomm_fd = -1; -+ } -+ -+ close (context->rfcomm_tty_fd); -+ context->rfcomm_tty_fd = -1; -+} -+ -+void -+nm_bluez5_dun_free (NMBluez5DunContext *context) -+{ -+ g_return_if_fail (context != NULL); -+ -+ nm_bluez5_dun_cleanup (context); -+ g_clear_pointer (&context->src_str, g_free); -+ g_clear_pointer (&context->dst_str, g_free); -+ g_slice_free (NMBluez5DunContext, context); -+} -diff --git a/src/devices/bluetooth/nm-bluez5-dun.h b/src/devices/bluetooth/nm-bluez5-dun.h -new file mode 100644 -index 0000000..7e25972 ---- /dev/null -+++ b/src/devices/bluetooth/nm-bluez5-dun.h -@@ -0,0 +1,46 @@ -+/* -*- 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) 2014 Red Hat, Inc. -+ */ -+ -+#ifndef _NM_BLUEZ5_UTILS_H_ -+#define _NM_BLUEZ5_UTILS_H_ -+ -+#include -+#include -+ -+typedef struct _NMBluez5DunContext NMBluez5DunContext; -+ -+typedef void (*NMBluez5DunFunc) (NMBluez5DunContext *context, -+ const char *rfcomm_dev, -+ GError *error, -+ gpointer user_data); -+ -+NMBluez5DunContext *nm_bluez5_dun_new (const char *adapter, -+ const char *remote); -+ -+void nm_bluez5_dun_connect (NMBluez5DunContext *context, -+ NMBluez5DunFunc callback, gpointer user_data); -+ -+/* Clean up connection resources */ -+void nm_bluez5_dun_cleanup (NMBluez5DunContext *context); -+ -+/* Clean up and dispose all resources */ -+void nm_bluez5_dun_free (NMBluez5DunContext *context); -+ -+#endif /* _NM_BLUEZ5_UTILS_H_ */ --- -1.9.3 - diff --git a/0005-core-only-set-IPv6-hop_limit-for-values-greater-than.patch b/0005-core-only-set-IPv6-hop_limit-for-values-greater-than.patch deleted file mode 100644 index 0762d3a..0000000 --- a/0005-core-only-set-IPv6-hop_limit-for-values-greater-than.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 6a79acb03abc3406b3889738f8003e5f385af1eb Mon Sep 17 00:00:00 2001 -From: Christian Hesse -Date: Mon, 15 Sep 2014 11:35:53 +0200 -Subject: [PATCH] core: only set IPv6 hop_limit for values greater than zero - -A "Cur Hop Limit" field value of 0 in a router advertisement means -"unspecified by this router" and should not be set in the kernel. - -(cherry picked from commit c668297257aef17f921518f6a7efac2ede2af76a) ---- - src/devices/nm-device.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c -index 291f03f..3d8baf8 100644 ---- a/src/devices/nm-device.c -+++ b/src/devices/nm-device.c -@@ -3616,7 +3616,9 @@ rdisc_config_changed (NMRDisc *rdisc, NMRDiscConfigMap changed, NMDevice *device - } - } - -- if (changed & NM_RDISC_CONFIG_HOP_LIMIT) { -+ /* hop_limit == 0 is a special value "unspecified", so do not touch -+ * in this case */ -+ if (changed & NM_RDISC_CONFIG_HOP_LIMIT && rdisc->hop_limit > 0) { - char val[16]; - - g_snprintf (val, sizeof (val), "%d", rdisc->hop_limit); --- -1.9.3 - diff --git a/0006-platform-deal-with-default-route-being-passed-to-rou.patch b/0006-platform-deal-with-default-route-being-passed-to-rou.patch deleted file mode 100644 index 8c86bf7..0000000 --- a/0006-platform-deal-with-default-route-being-passed-to-rou.patch +++ /dev/null @@ -1,73 +0,0 @@ -From ace746df4e2936ab50224d9fbef88025b69d2379 Mon Sep 17 00:00:00 2001 -From: Dan Winship -Date: Fri, 24 Oct 2014 13:48:46 -0400 -Subject: [PATCH] platform: deal with default route being passed to - route_sync() (bgo 735325) - -NMIP4Configs and NMIP6Configs are never supposed to contain a default -route, and thus nm_platform_ip6_route_sync() should never have to deal -with one. Unfortunately, if it *does* get passed a default route, it -will add it even if it was already there. This will result in an -RTM_NEWROUTE notification, which will cause NMPlatform to emit -ip6-route-changed, which will result in NMDevice doing some work and -then calling nm_ip6_config_commit(), which will result in NMIP6Config -passing the same list of routes to nm_platform_ip6_route_sync() again, -including the default route, which will cause NMPlatform to add the -route again... - -(Something eventually causes this cycle to get broken, but it starts -up again the next time NM receives an RA.) - -Fix this by having the route_sync() functions never add/modify the -default route (They were already not deleting it.) ---- - src/platform/nm-platform.c | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c -index 75e6448..5d478e8 100644 ---- a/src/platform/nm-platform.c -+++ b/src/platform/nm-platform.c -@@ -1908,6 +1908,9 @@ array_contains_ip6_route (const GArray *routes, const NMPlatformIP6Route *route) - * with the least possible disturbance. It simply removes routes that are - * not listed and adds routes that are. - * -+ * @known_routes should not contain a default route; if it does, it will be -+ * ignored. -+ * - * Returns: %TRUE on success. - */ - gboolean -@@ -1938,6 +1941,9 @@ nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes) - for (i = 0; i < known_routes->len && success; i++) { - known_route = &g_array_index (known_routes, NMPlatformIP4Route, i); - -+ if (known_route->plen == 0) -+ continue; -+ - if ((known_route->gateway == 0) ^ (i_type != 0)) { - /* Make two runs over the list of routes. On the first, only add - * device routes, on the second the others (gateway routes). */ -@@ -1975,6 +1981,9 @@ nm_platform_ip4_route_sync (int ifindex, const GArray *known_routes) - * with the least possible disturbance. It simply removes routes that are - * not listed and adds routes that are. - * -+ * @known_routes should not contain a default route; if it does, it will be -+ * ignored. -+ * - * Returns: %TRUE on success. - */ - gboolean -@@ -2006,6 +2015,9 @@ nm_platform_ip6_route_sync (int ifindex, const GArray *known_routes) - for (i = 0; i < known_routes->len && success; i++) { - known_route = &g_array_index (known_routes, NMPlatformIP6Route, i); - -+ if (known_route->plen == 0) -+ continue; -+ - if (IN6_IS_ADDR_UNSPECIFIED (&known_route->gateway) ^ (i_type != 0)) { - /* Make two runs over the list of routes. On the first, only add - * device routes, on the second the others (gateway routes). */ --- -1.9.3 - diff --git a/0007-rh1159408-cli-multiple-wifi-devices-fix.patch b/0007-rh1159408-cli-multiple-wifi-devices-fix.patch deleted file mode 100644 index 75247e7..0000000 --- a/0007-rh1159408-cli-multiple-wifi-devices-fix.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 45358f51fc0cc29d26cd70dcd16c884fb02d210d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= -Date: Mon, 18 Aug 2014 12:41:01 +0200 -Subject: [PATCH] cli: fix crash in `nmcli device wifi` with multiple wifi - devices (bgo #734466) - -And separate details for particular devices with an empty line. - -https://bugzilla.gnome.org/show_bug.cgi?id=734466 - -Reported-by: Martin Pitt - -(cherry picked from commit cc67c72b5e36a5776fa5665c61afdb8d33afc134) ---- - cli/src/devices.c | 27 +++++++++++++++++++++++++-- - 1 file changed, 25 insertions(+), 2 deletions(-) - -diff --git a/cli/src/devices.c b/cli/src/devices.c -index a493387..d2e4c4f 100644 ---- a/cli/src/devices.c -+++ b/cli/src/devices.c -@@ -1839,6 +1839,8 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) - goto error; - } - } else { -+ gboolean empty_line = FALSE; -+ - /* List APs for all devices */ - if (bssid_user) { - /* Specific AP requested - list only that */ -@@ -1850,6 +1852,7 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) - - /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev)); -+ nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); - - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); -@@ -1875,8 +1878,11 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) - } - g_free (bssid_up); - } -+ if (empty_line) -+ printf ("\n"); /* Empty line between devices' APs */ - print_data (nmc); /* Print all data */ - nmc_empty_output_fields (nmc); -+ empty_line = TRUE; - } - if (!ap) { - g_string_printf (nmc->return_text, _("Error: Access point with bssid '%s' not found."), -@@ -1891,8 +1897,14 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv) - /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, - nm_device_get_iface (dev)); -- if (NM_IS_DEVICE_WIFI (dev)) -+ nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); -+ -+ if (NM_IS_DEVICE_WIFI (dev)) { -+ if (empty_line) -+ printf ("\n"); /* Empty line between devices' APs */ - show_acces_point_info (dev, nmc); -+ empty_line = TRUE; -+ } - } - } - } -@@ -2572,6 +2584,8 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv) - goto error; - } - } else { -+ gboolean empty_line = FALSE; -+ - /* List NSPs for all devices */ - if (nsp_user) { - /* Specific NSP requested - list only that */ -@@ -2584,6 +2598,7 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv) - - /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, nm_device_get_iface (dev)); -+ nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); - - arr = nmc_dup_fields_array (tmpl, tmpl_len, NMC_OF_FLAG_MAIN_HEADER_ADD | NMC_OF_FLAG_FIELD_NAMES); - g_ptr_array_add (nmc->output_data, arr); -@@ -2601,8 +2616,11 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv) - } - g_free (nsp_up); - } -+ if (empty_line) -+ printf ("\n"); /* Empty line between devices' NSPs */ - print_data (nmc); /* Print all data */ - nmc_empty_output_fields (nmc); -+ empty_line = TRUE; - } - if (!nsp) { - g_string_printf (nmc->return_text, _("Error: Access point with nsp '%s' not found."), nsp_user); -@@ -2616,9 +2634,14 @@ do_device_wimax_list (NmCli *nmc, int argc, char **argv) - /* Main header name */ - nmc->print_fields.header_name = (char *) construct_header_name (base_hdr, - nm_device_get_iface (dev)); -+ nmc->print_fields.indices = parse_output_fields (fields_str, tmpl, FALSE, NULL, NULL); - -- if (NM_IS_DEVICE_WIMAX (dev)) -+ if (NM_IS_DEVICE_WIMAX (dev)) { -+ if (empty_line) -+ printf ("\n"); /* Empty line between devices' NSPs */ - show_nsp_info (dev, nmc); -+ empty_line = TRUE; -+ } - } - } - } --- -1.7.11.7 - diff --git a/0008-bgo739436-vpn-service-assert-fix.patch b/0008-bgo739436-vpn-service-assert-fix.patch deleted file mode 100644 index ba0b062..0000000 --- a/0008-bgo739436-vpn-service-assert-fix.patch +++ /dev/null @@ -1,68 +0,0 @@ -From d1d5196fd45c939d0d91d4a34b63e20b4b12bc34 Mon Sep 17 00:00:00 2001 -From: Lubomir Rintel -Date: Sun, 9 Nov 2014 12:38:38 +0100 -Subject: [PATCH 1/2] vpn: propagate daemon exec error correctly (bgo #739436) - -NetworkManager[31624]: VPN service 'openvpn': could not launch the VPN service. error: (8) Failed to execute child process "/usr/local/libexec/nm-openvpn-service" (No such file or directory). -** -NetworkManager:ERROR:nm-manager.c:3094:_activation_auth_done: assertion failed: (error) - -https://bugzilla.gnome.org/show_bug.cgi?id=739436 - -(cherry picked from commit 282d9b0e10c08dcda4a1d082b15dc2bdda8ee3d2) ---- - src/vpn-manager/nm-vpn-service.c | 10 +++++----- - 1 file changed, 5 insertions(+), 5 deletions(-) - -diff --git a/src/vpn-manager/nm-vpn-service.c b/src/vpn-manager/nm-vpn-service.c -index 824543f..64eb78b 100644 ---- a/src/vpn-manager/nm-vpn-service.c -+++ b/src/vpn-manager/nm-vpn-service.c -@@ -54,7 +54,7 @@ typedef struct { - - #define VPN_CONNECTION_GROUP "VPN Connection" - --static gboolean start_pending_vpn (NMVPNService *self); -+static gboolean start_pending_vpn (NMVPNService *self, GError **error); - - NMVPNService * - nm_vpn_service_new (const char *namefile, GError **error) -@@ -130,7 +130,7 @@ connection_vpn_state_changed (NMVPNConnection *connection, - g_signal_handlers_disconnect_by_func (connection, G_CALLBACK (connection_vpn_state_changed), self); - if (connection == priv->active) { - priv->active = NULL; -- start_pending_vpn (self); -+ start_pending_vpn (self, NULL); - } else - priv->pending = g_slist_remove (priv->pending, connection); - g_object_unref (connection); -@@ -253,7 +253,7 @@ start_active_vpn (NMVPNService *self, GError **error) - } - - static gboolean --start_pending_vpn (NMVPNService *self) -+start_pending_vpn (NMVPNService *self, GError **error) - { - NMVPNServicePrivate *priv = NM_VPN_SERVICE_GET_PRIVATE (self); - -@@ -266,7 +266,7 @@ start_pending_vpn (NMVPNService *self) - priv->active = g_slist_nth_data (priv->pending, 0); - priv->pending = g_slist_remove (priv->pending, priv->active); - -- return start_active_vpn (self, NULL); -+ return start_active_vpn (self, error); - } - - gboolean -@@ -300,7 +300,7 @@ nm_vpn_service_activate (NMVPNService *service, - } - - /* Otherwise start the next VPN */ -- return start_pending_vpn (service); -+ return start_pending_vpn (service, error); - } - - static void --- -1.7.11.7 - diff --git a/0009-rh1167345-external-master-slave-assert-fix.patch b/0009-rh1167345-external-master-slave-assert-fix.patch deleted file mode 100644 index bc46bc5..0000000 --- a/0009-rh1167345-external-master-slave-assert-fix.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 05f686009a32e23815f7371b144f8dfa72f966d0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= -Date: Wed, 24 Sep 2014 16:02:37 +0200 -Subject: [PATCH 2/2] core: do not assert when a device is enslaved externally - (rh #1167345) - -Test case: - # ip link add name BR type bridge - # brctl addif BR eth0 - -Monitoring external master/slave changes was intruduced by -08e0cfb484dfc6aa6342871158ffe752c7c50f03. - -https://bugzilla.redhat.com/show_bug.cgi?id=1167345 - -(cherry picked from commit c9b9229c2e7de2bbb12e493a868921b7a788ee92) ---- - src/devices/nm-device.c | 4 ---- - src/nm-active-connection.c | 4 ++-- - 2 files changed, 2 insertions(+), 6 deletions(-) - -diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c -index 35ee470..7d7d528 100644 ---- a/src/devices/nm-device.c -+++ b/src/devices/nm-device.c -@@ -2966,8 +2966,6 @@ act_stage3_ip4_config_start (NMDevice *self, - g_assert (connection); - - method = nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP4_CONFIG); -- if (priv->master) -- g_assert_cmpstr (method, ==, NM_SETTING_IP4_CONFIG_METHOD_DISABLED); - - if ( strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_MANUAL) != 0 - && priv->is_master -@@ -3864,8 +3862,6 @@ act_stage3_ip6_config_start (NMDevice *self, - g_assert (connection); - - method = nm_utils_get_ip_config_method (connection, NM_TYPE_SETTING_IP6_CONFIG); -- if (priv->master) -- g_assert_cmpstr (method, ==, NM_SETTING_IP6_CONFIG_METHOD_IGNORE); - - if ( strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_MANUAL) != 0 - && priv->is_master -diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c -index 1ac67a9..2dc0688 100644 ---- a/src/nm-active-connection.c -+++ b/src/nm-active-connection.c -@@ -371,11 +371,11 @@ device_master_changed (GObject *object, - return; - if (!nm_device_get_master (device)) - return; -+ if (!nm_active_connection_get_master (self)) -+ return; - g_signal_handlers_disconnect_by_func (device, G_CALLBACK (device_master_changed), self); - - master = nm_active_connection_get_master (self); -- g_assert (master); -- - master_state = nm_active_connection_get_state (master); - if (master_state >= NM_ACTIVE_CONNECTION_STATE_DEACTIVATING) { - /* Master failed before attaching the slave */ --- -1.7.11.7 - diff --git a/NetworkManager.spec b/NetworkManager.spec index dafc047..cdf2b70 100644 --- a/NetworkManager.spec +++ b/NetworkManager.spec @@ -10,10 +10,10 @@ %define ppp_version 2.4.7 %endif -%define snapshot .git20140704 -%define git_sha 6eb82acd -%define realversion 0.9.10.0 -%define release_version 14 +%define snapshot .git20150105 +%define git_sha b00ad26 +%define realversion 0.9.10.1 +%define release_version 1 %define epoch_version 1 %define obsoletes_nmver 1:0.9.9.95-1 @@ -82,15 +82,7 @@ Patch0: 0000-explain-dns1-dns2.patch # Cherry-picks from upstream: # http://cgit.freedesktop.org/NetworkManager/NetworkManager/log/?h=nm-0-9-10 -Patch1: 0001-policy-allow-non-local-admin-sessions-to-control-the.patch -Patch2: 0002-bluez-split-out-errors.patch -Patch3: 0003-bluez-track-adapter-address-in-NMBluezDevice.patch -Patch4: 0004-bluez-re-add-DUN-support-for-Bluez5.patch -Patch5: 0005-core-only-set-IPv6-hop_limit-for-values-greater-than.patch -Patch6: 0006-platform-deal-with-default-route-being-passed-to-rou.patch -Patch7: 0007-rh1159408-cli-multiple-wifi-devices-fix.patch -Patch8: 0008-bgo739436-vpn-service-assert-fix.patch -Patch9: 0009-rh1167345-external-master-slave-assert-fix.patch +# BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -329,15 +321,6 @@ by nm-connection-editor and nm-applet in a non-graphical environment. %setup -q -n NetworkManager-%{realversion} %patch0 -p1 -b .explain-dns1-dns2.orig -%patch1 -p1 -b .policy-allow-non-local-admin-sessions-to-control-the.orig -%patch2 -p1 -b .bluez-split-out-errors.orig -%patch3 -p1 -b .bluez-track-adapter-address-in-NMBluezDevice.orig -%patch4 -p1 -b .bluez-re-add-DUN-support-for-Bluez5.orig -%patch5 -p1 -b .core-only-set-IPv6-hop_limit-for-values-greater-than.orig -%patch6 -p1 -b .default-route-spam -%patch7 -p1 -b .rh1159408-cli-multiple-wifi-devices-fix.orig -%patch8 -p1 -b .bgo739436-vpn-service-assert-fix.patch.orig -%patch9 -p1 -b .rh1167345-external-master-slave-assert-fix.orig %build @@ -609,6 +592,10 @@ fi %endif %changelog +* Mon Jan 5 2015 Jiří Klimeš - 1:0.9.10.1-1.git20150105 +- update to latest snapshot of 0.9.10 +- dhcp: fix dhclient abnormal exit due to SIGPIPE (bgo #735962) (rh #1178666) + * Mon Nov 24 2014 Jiří Klimeš - 1:0.9.10.0-14.git20140704 - vpn: propagate daemon exec error correctly (bgo #739436) - core: do not assert when a device is enslaved externally (rh #1167345) diff --git a/sources b/sources index e86d960..7808705 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -94d9a02ce5afcec1b5bcf965f2459004 NetworkManager-0.9.10.0.git20140704.6eb82acd.tar.bz2 +8b017e8066cfa3e92e3417bf03daa8cf NetworkManager-0.9.10.1.git20150105.b00ad26.tar.bz2