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:
Lubomir Rintel
2017-05-23 13:06:50 +02:00
parent b866a12667
commit 53482c38e2
3 changed files with 89 additions and 1 deletions

View File

@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc., * with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * 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__ #ifndef __NETWORKMANAGER_BLUEZ_COMMON_H__

View File

@@ -70,6 +70,7 @@
#include "nm-arping-manager.h" #include "nm-arping-manager.h"
#include "nm-connectivity.h" #include "nm-connectivity.h"
#include "nm-dbus-interface.h" #include "nm-dbus-interface.h"
#include "bluetooth/nm-bluez-common.h"
#include "nm-device-logging.h" #include "nm-device-logging.h"
_LOG_DECLARE_SELF (NMDevice); _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 static gboolean
activation_source_handle_cb4 (gpointer user_data) activation_source_handle_cb4 (gpointer user_data)
{ {
@@ -4749,6 +4814,12 @@ activate_stage2_device_config (NMDevice *self)
nm_device_queue_recheck_assume (info->slave); 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); lldp_init (self, TRUE);
nm_device_activate_schedule_stage3_ip_config_start (self); nm_device_activate_schedule_stage3_ip_config_start (self);
} }
@@ -11438,6 +11509,9 @@ _nm_device_check_connection_available (NMDevice *self,
{ {
NMDeviceState state; NMDeviceState state;
if (!bt_network_server_available (connection))
return FALSE;
/* an unrealized software device is always available, hardware devices never. */ /* an unrealized software device is always available, hardware devices never. */
if (!nm_device_is_real (self)) { if (!nm_device_is_real (self)) {
if (nm_device_is_software (self)) if (nm_device_is_software (self))
@@ -11879,6 +11953,8 @@ _cleanup_generic_pre (NMDevice *self, CleanupType cleanup_type)
queued_state_clear (self); queued_state_clear (self);
bt_network_server_unregister (self);
_cleanup_ip4_pre (self, cleanup_type); _cleanup_ip4_pre (self, cleanup_type);
_cleanup_ip6_pre (self, cleanup_type); _cleanup_ip6_pre (self, cleanup_type);
} }

View File

@@ -705,4 +705,16 @@ void nm_device_check_connectivity (NMDevice *self,
gpointer user_data); gpointer user_data);
NMConnectivityState nm_device_get_connectivity_state (NMDevice *self); 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__ */ #endif /* __NETWORKMANAGER_DEVICE_H__ */