summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2017-05-23 13:06:50 +0200
committerLubomir Rintel <lkundrak@v3.sk>2017-05-31 20:18:24 +0200
commit53482c38e20c213cf48d58ce2b9e2a27f46848d6 (patch)
treef82f20597925a1394064c93921187c05880bc921
parentb866a12667224bbed3029897a873126f499807bb (diff)
downloadNetworkManager-53482c38e20c213cf48d58ce2b9e2a27f46848d6.tar.gz
device: register a bridge for Bluetooth NAP with Bluez
Bluez needs to know about then so that it can eventually enslave the BNEP links for PANU client connections to it.
-rw-r--r--src/devices/bluetooth/nm-bluez-common.h2
-rw-r--r--src/devices/nm-device.c76
-rw-r--r--src/devices/nm-device.h12
3 files changed, 89 insertions, 1 deletions
diff --git a/src/devices/bluetooth/nm-bluez-common.h b/src/devices/bluetooth/nm-bluez-common.h
index 7abc0ddabc..19344d36c4 100644
--- a/src/devices/bluetooth/nm-bluez-common.h
+++ b/src/devices/bluetooth/nm-bluez-common.h
@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * Copyright (C) 2009 Red Hat, Inc.
+ * Copyright (C) 2017 Red Hat, Inc.
*/
#ifndef __NETWORKMANAGER_BLUEZ_COMMON_H__
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e11b7158fb..252402fb96 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -70,6 +70,7 @@
#include "nm-arping-manager.h"
#include "nm-connectivity.h"
#include "nm-dbus-interface.h"
+#include "bluetooth/nm-bluez-common.h"
#include "nm-device-logging.h"
_LOG_DECLARE_SELF (NMDevice);
@@ -4364,6 +4365,70 @@ dnsmasq_state_changed_cb (NMDnsMasqManager *manager, guint32 status, gpointer us
/*****************************************************************************/
+const NMBtVTableNetworkServer *nm_bt_vtable_network_server = NULL;
+
+static NMSettingBluetooth *
+_setting_bluetooth_for_bt_nap (NMConnection *connection)
+{
+ NMSettingBluetooth *s_bt = nm_connection_get_setting_bluetooth (connection);
+
+ if (!s_bt)
+ return NULL;
+ if (!nm_streq0 (nm_setting_bluetooth_get_connection_type (s_bt), NM_SETTING_BLUETOOTH_TYPE_NAP))
+ return NULL;
+
+ return s_bt;
+}
+
+static gboolean
+bt_network_server_available (NMConnection *connection)
+{
+ NMSettingBluetooth *s_bt = _setting_bluetooth_for_bt_nap (connection);
+
+ if (!s_bt)
+ return TRUE;
+ if (!nm_bt_vtable_network_server)
+ return FALSE;
+ return nm_bt_vtable_network_server->is_available (nm_bt_vtable_network_server,
+ nm_setting_bluetooth_get_bdaddr (s_bt));
+}
+
+static gboolean
+bt_network_server_register (NMDevice *self)
+{
+ NMConnection *connection = nm_device_get_applied_connection (self);
+ NMSettingBluetooth *s_bt = _setting_bluetooth_for_bt_nap (connection);
+
+ if (!s_bt)
+ return TRUE;
+ if (!nm_bt_vtable_network_server)
+ return FALSE;
+ return nm_bt_vtable_network_server->register_bridge (nm_bt_vtable_network_server,
+ nm_setting_bluetooth_get_bdaddr (s_bt),
+ BLUETOOTH_CONNECT_NAP,
+ self);
+}
+
+static void
+bt_network_server_unregister (NMDevice *self)
+{
+ NMConnection *connection = nm_device_get_applied_connection (self);
+ NMSettingBluetooth *s_bt;
+
+ if (!connection)
+ return;
+ s_bt = _setting_bluetooth_for_bt_nap (connection);
+ if (!s_bt)
+ return;
+
+ if (!nm_bt_vtable_network_server)
+ return;
+ nm_bt_vtable_network_server->unregister_bridge (nm_bt_vtable_network_server,
+ self);
+}
+
+/*****************************************************************************/
+
static gboolean
activation_source_handle_cb4 (gpointer user_data)
{
@@ -4749,6 +4814,12 @@ activate_stage2_device_config (NMDevice *self)
nm_device_queue_recheck_assume (info->slave);
}
+ if (!bt_network_server_register (self)) {
+ /* The HCI we could use is no longer present. */
+ nm_device_state_changed (self, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_REMOVED);
+ return;
+ }
+
lldp_init (self, TRUE);
nm_device_activate_schedule_stage3_ip_config_start (self);
}
@@ -11438,6 +11509,9 @@ _nm_device_check_connection_available (NMDevice *self,
{
NMDeviceState state;
+ if (!bt_network_server_available (connection))
+ return FALSE;
+
/* an unrealized software device is always available, hardware devices never. */
if (!nm_device_is_real (self)) {
if (nm_device_is_software (self))
@@ -11879,6 +11953,8 @@ _cleanup_generic_pre (NMDevice *self, CleanupType cleanup_type)
queued_state_clear (self);
+ bt_network_server_unregister (self);
+
_cleanup_ip4_pre (self, cleanup_type);
_cleanup_ip6_pre (self, cleanup_type);
}
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index cc1510ed7b..271810d293 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -705,4 +705,16 @@ void nm_device_check_connectivity (NMDevice *self,
gpointer user_data);
NMConnectivityState nm_device_get_connectivity_state (NMDevice *self);
+typedef struct _NMBtVTableNetworkServer NMBtVTableNetworkServer;
+struct _NMBtVTableNetworkServer {
+ gboolean (*is_available) (const NMBtVTableNetworkServer *vtable,
+ const char *addr);
+ gboolean (*register_bridge) (const NMBtVTableNetworkServer *vtable,
+ const char *addr, const char *uuid, NMDevice *device);
+ gboolean (*unregister_bridge) (const NMBtVTableNetworkServer *vtable,
+ NMDevice *device);
+};
+
+extern const NMBtVTableNetworkServer *nm_bt_vtable_network_server;
+
#endif /* __NETWORKMANAGER_DEVICE_H__ */