diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2017-05-23 13:06:50 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2017-05-31 20:18:24 +0200 |
commit | 53482c38e20c213cf48d58ce2b9e2a27f46848d6 (patch) | |
tree | f82f20597925a1394064c93921187c05880bc921 | |
parent | b866a12667224bbed3029897a873126f499807bb (diff) | |
download | NetworkManager-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.h | 2 | ||||
-rw-r--r-- | src/devices/nm-device.c | 76 | ||||
-rw-r--r-- | src/devices/nm-device.h | 12 |
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__ */ |