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.
This commit is contained in:
@@ -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__
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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__ */
|
||||
|
Reference in New Issue
Block a user