mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-06 12:50:33 +01:00
core: better matching of rfkill types
This also fixes a bug where WWAN devices were not correctly recognized for enable/disable operations.
This commit is contained in:
parent
6773cc6a63
commit
89af61f73c
7 changed files with 40 additions and 20 deletions
|
|
@ -30,6 +30,7 @@
|
|||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-marshal.h"
|
||||
#include "nm-properties-changed-signal.h"
|
||||
#include "nm-rfkill.h"
|
||||
|
||||
#include "nm-device-cdma-glue.h"
|
||||
|
||||
|
|
@ -326,6 +327,7 @@ nm_device_cdma_new (NMModemCdma *modem, const char *driver)
|
|||
NM_DEVICE_INTERFACE_DRIVER, driver,
|
||||
NM_DEVICE_INTERFACE_TYPE_DESC, "CDMA",
|
||||
NM_DEVICE_INTERFACE_DEVICE_TYPE, NM_DEVICE_TYPE_CDMA,
|
||||
NM_DEVICE_INTERFACE_RFKILL_TYPE, RFKILL_TYPE_WWAN,
|
||||
NULL);
|
||||
if (device) {
|
||||
g_signal_connect (device, "state-changed", G_CALLBACK (device_state_changed), device);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "NetworkManagerUtils.h"
|
||||
#include "nm-marshal.h"
|
||||
#include "nm-properties-changed-signal.h"
|
||||
#include "nm-rfkill.h"
|
||||
|
||||
#include "nm-device-gsm-glue.h"
|
||||
|
||||
|
|
@ -326,6 +327,7 @@ nm_device_gsm_new (NMModemGsm *modem, const char *driver)
|
|||
NM_DEVICE_INTERFACE_DRIVER, driver,
|
||||
NM_DEVICE_INTERFACE_TYPE_DESC, "GSM",
|
||||
NM_DEVICE_INTERFACE_DEVICE_TYPE, NM_DEVICE_TYPE_GSM,
|
||||
NM_DEVICE_INTERFACE_RFKILL_TYPE, RFKILL_TYPE_WWAN,
|
||||
NULL);
|
||||
if (device) {
|
||||
g_signal_connect (device, "state-changed", G_CALLBACK (device_state_changed), device);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include "nm-device-interface.h"
|
||||
#include "nm-utils.h"
|
||||
#include "nm-properties-changed-signal.h"
|
||||
#include "nm-rfkill.h"
|
||||
|
||||
static gboolean impl_device_disconnect (NMDeviceInterface *device,
|
||||
GError **error);
|
||||
|
|
@ -176,6 +177,15 @@ nm_device_interface_init (gpointer g_iface)
|
|||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | NM_PROPERTY_PARAM_NO_EXPORT));
|
||||
|
||||
g_object_interface_install_property
|
||||
(g_iface, g_param_spec_uint (NM_DEVICE_INTERFACE_RFKILL_TYPE,
|
||||
"Rfkill Type",
|
||||
"Type of rfkill switch (if any) supported by this device",
|
||||
RFKILL_TYPE_WLAN,
|
||||
RFKILL_TYPE_MAX,
|
||||
RFKILL_TYPE_UNKNOWN,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | NM_PROPERTY_PARAM_NO_EXPORT));
|
||||
|
||||
/* Signals */
|
||||
g_signal_new ("state-changed",
|
||||
iface_type,
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ typedef enum
|
|||
#define NM_DEVICE_INTERFACE_DEVICE_TYPE "device-type" /* ugh */
|
||||
#define NM_DEVICE_INTERFACE_MANAGED "managed"
|
||||
#define NM_DEVICE_INTERFACE_TYPE_DESC "type-desc" /* Internal only */
|
||||
#define NM_DEVICE_INTERFACE_RFKILL_TYPE "rfkill-type" /* Internal only */
|
||||
|
||||
typedef enum {
|
||||
NM_DEVICE_INTERFACE_PROP_FIRST = 0x1000,
|
||||
|
|
@ -75,6 +76,7 @@ typedef enum {
|
|||
NM_DEVICE_INTERFACE_PROP_DEVICE_TYPE,
|
||||
NM_DEVICE_INTERFACE_PROP_MANAGED,
|
||||
NM_DEVICE_INTERFACE_PROP_TYPE_DESC,
|
||||
NM_DEVICE_INTERFACE_PROP_RFKILL_TYPE,
|
||||
} NMDeviceInterfaceProp;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3485,6 +3485,7 @@ nm_device_wifi_new (const char *udi,
|
|||
NM_DEVICE_WIFI_IFINDEX, ifindex,
|
||||
NM_DEVICE_INTERFACE_TYPE_DESC, "802.11 WiFi",
|
||||
NM_DEVICE_INTERFACE_DEVICE_TYPE, NM_DEVICE_TYPE_WIFI,
|
||||
NM_DEVICE_INTERFACE_RFKILL_TYPE, RFKILL_TYPE_WLAN,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include "nm-dhcp4-config.h"
|
||||
#include "nm-ip6-manager.h"
|
||||
#include "nm-marshal.h"
|
||||
#include "nm-rfkill.h"
|
||||
|
||||
#define NM_ACT_REQUEST_IP4_CONFIG "nm-act-request-ip4-config"
|
||||
#define NM_ACT_REQUEST_IP6_CONFIG "nm-act-request-ip6-config"
|
||||
|
|
@ -87,6 +88,7 @@ typedef struct {
|
|||
guint32 capabilities;
|
||||
char * driver;
|
||||
gboolean managed; /* whether managed by NM or not */
|
||||
RfKillType rfkill_type;
|
||||
|
||||
guint32 ip4_address;
|
||||
|
||||
|
|
@ -194,6 +196,7 @@ nm_device_init (NMDevice *self)
|
|||
priv->capabilities = NM_DEVICE_CAP_NONE;
|
||||
priv->state = NM_DEVICE_STATE_UNMANAGED;
|
||||
priv->dhcp_timeout = 0;
|
||||
priv->rfkill_type = RFKILL_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
static GObject*
|
||||
|
|
@ -3069,6 +3072,9 @@ set_property (GObject *object, guint prop_id,
|
|||
g_free (priv->type_desc);
|
||||
priv->type_desc = g_value_dup_string (value);
|
||||
break;
|
||||
case NM_DEVICE_INTERFACE_PROP_RFKILL_TYPE:
|
||||
priv->rfkill_type = g_value_get_uint (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -3145,6 +3151,9 @@ get_property (GObject *object, guint prop_id,
|
|||
case NM_DEVICE_INTERFACE_PROP_TYPE_DESC:
|
||||
g_value_set_string (value, priv->type_desc);
|
||||
break;
|
||||
case NM_DEVICE_INTERFACE_PROP_RFKILL_TYPE:
|
||||
g_value_set_uint (value, priv->rfkill_type);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -3231,6 +3240,10 @@ nm_device_class_init (NMDeviceClass *klass)
|
|||
NM_DEVICE_INTERFACE_PROP_TYPE_DESC,
|
||||
NM_DEVICE_INTERFACE_TYPE_DESC);
|
||||
|
||||
g_object_class_override_property (object_class,
|
||||
NM_DEVICE_INTERFACE_PROP_RFKILL_TYPE,
|
||||
NM_DEVICE_INTERFACE_RFKILL_TYPE);
|
||||
|
||||
signals[AUTOCONNECT_ALLOWED] =
|
||||
g_signal_new ("autoconnect-allowed",
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
|
|
|
|||
|
|
@ -154,12 +154,12 @@ typedef struct {
|
|||
typedef struct {
|
||||
gboolean enabled;
|
||||
gboolean hw_enabled;
|
||||
RfKillType rtype;
|
||||
const char *desc;
|
||||
const char *key;
|
||||
const char *prop;
|
||||
const char *hw_prop;
|
||||
RfKillState (*other_enabled_func) (NMManager *);
|
||||
gboolean (*object_filter_func) (GObject *);
|
||||
} RadioState;
|
||||
|
||||
typedef struct {
|
||||
|
|
@ -1242,8 +1242,10 @@ manager_set_radio_enabled (NMManager *manager,
|
|||
|
||||
/* enable/disable wireless devices as required */
|
||||
for (iter = priv->devices; iter; iter = iter->next) {
|
||||
if ( rstate->object_filter_func
|
||||
&& rstate->object_filter_func (G_OBJECT (iter->data)))
|
||||
RfKillType devtype = RFKILL_TYPE_UNKNOWN;
|
||||
|
||||
g_object_get (G_OBJECT (iter->data), NM_DEVICE_INTERFACE_RFKILL_TYPE, &devtype, NULL);
|
||||
if (devtype == rstate->rtype)
|
||||
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (iter->data), enabled);
|
||||
}
|
||||
}
|
||||
|
|
@ -1356,18 +1358,6 @@ nm_manager_get_modem_enabled_state (NMManager *self)
|
|||
return wwan_state;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
rfkill_wlan_filter (GObject *object)
|
||||
{
|
||||
return NM_IS_DEVICE_WIFI (object);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
rfkill_wwan_filter (GObject *object)
|
||||
{
|
||||
return NM_IS_MODEM (object);
|
||||
}
|
||||
|
||||
static void
|
||||
manager_rfkill_update_one_type (NMManager *self,
|
||||
RadioState *rstate,
|
||||
|
|
@ -2704,11 +2694,11 @@ impl_manager_sleep (NMManager *self, gboolean sleep, GError **error)
|
|||
for (i = 0; i < RFKILL_TYPE_MAX; i++) {
|
||||
RadioState *rstate = &priv->radio_states[i];
|
||||
gboolean enabled = (rstate->hw_enabled && rstate->enabled);
|
||||
RfKillType devtype = RFKILL_TYPE_UNKNOWN;
|
||||
|
||||
if ( rstate->object_filter_func
|
||||
&& rstate->object_filter_func (G_OBJECT (device))) {
|
||||
g_object_get (G_OBJECT (device), NM_DEVICE_INTERFACE_RFKILL_TYPE, &devtype, NULL);
|
||||
if (devtype == rstate->rtype)
|
||||
nm_device_interface_set_enabled (NM_DEVICE_INTERFACE (device), enabled);
|
||||
}
|
||||
}
|
||||
|
||||
nm_device_clear_autoconnect_inhibit (device);
|
||||
|
|
@ -3123,7 +3113,7 @@ nm_manager_init (NMManager *manager)
|
|||
priv->radio_states[RFKILL_TYPE_WLAN].hw_prop = NM_MANAGER_WIRELESS_HARDWARE_ENABLED;
|
||||
priv->radio_states[RFKILL_TYPE_WLAN].desc = "WiFi";
|
||||
priv->radio_states[RFKILL_TYPE_WLAN].other_enabled_func = nm_manager_get_ipw_rfkill_state;
|
||||
priv->radio_states[RFKILL_TYPE_WLAN].object_filter_func = rfkill_wlan_filter;
|
||||
priv->radio_states[RFKILL_TYPE_WLAN].rtype = RFKILL_TYPE_WLAN;
|
||||
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].enabled = TRUE;
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].key = "WWANEnabled";
|
||||
|
|
@ -3131,7 +3121,7 @@ nm_manager_init (NMManager *manager)
|
|||
priv->radio_states[RFKILL_TYPE_WWAN].hw_prop = NM_MANAGER_WWAN_HARDWARE_ENABLED;
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].desc = "WWAN";
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].other_enabled_func = nm_manager_get_modem_enabled_state;
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].object_filter_func = rfkill_wwan_filter;
|
||||
priv->radio_states[RFKILL_TYPE_WWAN].rtype = RFKILL_TYPE_WWAN;
|
||||
|
||||
for (i = 0; i < RFKILL_TYPE_MAX; i++)
|
||||
priv->radio_states[i].hw_enabled = TRUE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue