diff --git a/src/nm-device-cdma.c b/src/nm-device-cdma.c index bc73e9dab0..6725b15181 100644 --- a/src/nm-device-cdma.c +++ b/src/nm-device-cdma.c @@ -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); diff --git a/src/nm-device-gsm.c b/src/nm-device-gsm.c index 1bb7017533..bfcadc6c54 100644 --- a/src/nm-device-gsm.c +++ b/src/nm-device-gsm.c @@ -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); diff --git a/src/nm-device-interface.c b/src/nm-device-interface.c index f0a4fd1c6b..5f7f5fbdc5 100644 --- a/src/nm-device-interface.c +++ b/src/nm-device-interface.c @@ -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, diff --git a/src/nm-device-interface.h b/src/nm-device-interface.h index 306f2dbe6d..b86dac5950 100644 --- a/src/nm-device-interface.h +++ b/src/nm-device-interface.h @@ -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; diff --git a/src/nm-device-wifi.c b/src/nm-device-wifi.c index aa03063760..6f473e1b1c 100644 --- a/src/nm-device-wifi.c +++ b/src/nm-device-wifi.c @@ -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); } diff --git a/src/nm-device.c b/src/nm-device.c index 6ffa8ac63d..556cc187ed 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -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), diff --git a/src/nm-manager.c b/src/nm-manager.c index 1b3fe5b317..9b69632270 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -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;