core: ignore modem management service state in rfkill handling

rfkill handling should only pay attention to actual rfkill, since
rfkill is global but the modem management service state is per-device.
Thus calculating a global state from multiple devices is very
likely to get things wrong.

Remove all of the code that used to handle that sort of thing,
which means removing the 'enable-changed' signal from the Modem
device, since now nothing external to the modem device should
need to care whether it's enabled internally or not.
This commit is contained in:
Dan Williams 2013-05-31 14:28:16 -05:00
parent 876ec0c755
commit 5d8197a80b
3 changed files with 6 additions and 85 deletions

View file

@ -53,13 +53,6 @@ enum {
PROP_CURRENT_CAPABILITIES,
};
enum {
ENABLE_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static void set_enabled (NMDevice *device, gboolean enabled);
/*****************************************************************************/
@ -175,13 +168,8 @@ data_port_changed_cb (NMModem *modem, GParamSpec *pspec, gpointer user_data)
static void
modem_enabled_cb (NMModem *modem, GParamSpec *pspec, gpointer user_data)
{
NMDeviceModem *self = NM_DEVICE_MODEM (user_data);
NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE (self);
set_enabled (NM_DEVICE (self), nm_modem_get_mm_enabled (priv->modem));
g_signal_emit (G_OBJECT (self), signals[ENABLE_CHANGED], 0);
nm_device_emit_recheck_auto_activate (NM_DEVICE (self));
set_enabled (NM_DEVICE (user_data), nm_modem_get_mm_enabled (modem));
nm_device_emit_recheck_auto_activate (NM_DEVICE (user_data));
}
static void
@ -530,15 +518,6 @@ nm_device_modem_class_init (NMDeviceModemClass *mclass)
0, G_MAXUINT32, NM_DEVICE_MODEM_CAPABILITY_NONE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
/* Signals */
signals[ENABLE_CHANGED] =
g_signal_new (NM_DEVICE_MODEM_ENABLE_CHANGED,
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
nm_dbus_manager_register_exported_type (nm_dbus_manager_get (),
G_TYPE_FROM_CLASS (mclass),
&dbus_glib_nm_device_modem_object_info);

View file

@ -38,8 +38,6 @@
#define NM_DEVICE_MODEM_CAPABILITIES "modem-capabilities"
#define NM_DEVICE_MODEM_CURRENT_CAPABILITIES "current-capabilities"
#define NM_DEVICE_MODEM_ENABLE_CHANGED "enable-changed"
typedef struct {
NMDevice parent;
} NMDeviceModem;

View file

@ -163,7 +163,6 @@ static void nm_manager_update_state (NMManager *manager);
typedef struct {
gboolean user_enabled;
gboolean daemon_enabled;
gboolean sw_enabled;
gboolean hw_enabled;
RfKillType rtype;
@ -172,7 +171,6 @@ typedef struct {
const char *prop;
const char *hw_prop;
RfKillState (*other_enabled_func) (NMManager *);
RfKillState (*daemon_enabled_func) (NMManager *);
} RadioState;
typedef struct {
@ -1282,11 +1280,8 @@ radio_enabled_for_rstate (RadioState *rstate, gboolean check_changeable)
gboolean enabled;
enabled = rstate->user_enabled && rstate->hw_enabled;
if (check_changeable) {
if (check_changeable)
enabled &= rstate->sw_enabled;
if (rstate->daemon_enabled_func)
enabled &= rstate->daemon_enabled;
}
return enabled;
}
@ -1384,29 +1379,6 @@ nm_manager_get_ipw_rfkill_state (NMManager *self)
return ipw_state;
}
static RfKillState
nm_manager_get_modem_enabled_state (NMManager *self)
{
NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
GSList *iter;
RfKillState wwan_state = RFKILL_UNBLOCKED;
for (iter = priv->devices; iter; iter = g_slist_next (iter)) {
NMDevice *candidate = NM_DEVICE (iter->data);
RfKillState candidate_state = RFKILL_UNBLOCKED;
if (nm_device_get_rfkill_type (candidate) == RFKILL_TYPE_WWAN) {
if (!nm_device_get_enabled (candidate))
candidate_state = RFKILL_SOFT_BLOCKED;
if (candidate_state > wwan_state)
wwan_state = candidate_state;
}
}
return wwan_state;
}
static void
update_rstate_from_rfkill (RadioState *rstate, RfKillState rfkill)
{
@ -1431,8 +1403,7 @@ manager_rfkill_update_one_type (NMManager *self,
RfKillState udev_state = RFKILL_UNBLOCKED;
RfKillState other_state = RFKILL_UNBLOCKED;
RfKillState composite;
gboolean old_enabled, new_enabled, old_rfkilled, new_rfkilled;
gboolean old_hwe, old_daemon_enabled = FALSE;
gboolean old_enabled, new_enabled, old_rfkilled, new_rfkilled, old_hwe;
old_enabled = radio_enabled_for_rstate (rstate, TRUE);
old_rfkilled = rstate->hw_enabled && rstate->sw_enabled;
@ -1453,26 +1424,10 @@ manager_rfkill_update_one_type (NMManager *self,
update_rstate_from_rfkill (rstate, composite);
/* If the device has a management daemon that can affect enabled state, check that now */
if (rstate->daemon_enabled_func) {
old_daemon_enabled = rstate->daemon_enabled;
rstate->daemon_enabled = (rstate->daemon_enabled_func (self) == RFKILL_UNBLOCKED);
if (old_daemon_enabled != rstate->daemon_enabled) {
nm_log_info (LOGD_RFKILL, "%s now %s by management service",
rstate->desc,
rstate->daemon_enabled ? "enabled" : "disabled");
}
}
/* Print out all states affecting device enablement */
if (rstate->desc) {
if (rstate->daemon_enabled_func) {
nm_log_dbg (LOGD_RFKILL, "%s hw-enabled %d sw-enabled %d daemon-enabled %d",
rstate->desc, rstate->hw_enabled, rstate->sw_enabled, rstate->daemon_enabled);
} else {
nm_log_dbg (LOGD_RFKILL, "%s hw-enabled %d sw-enabled %d",
rstate->desc, rstate->hw_enabled, rstate->sw_enabled);
}
nm_log_dbg (LOGD_RFKILL, "%s hw-enabled %d sw-enabled %d",
rstate->desc, rstate->hw_enabled, rstate->sw_enabled);
}
/* Log new killswitch state */
@ -1522,12 +1477,6 @@ manager_ipw_rfkill_state_changed (NMDeviceWifi *device,
nm_manager_rfkill_update (NM_MANAGER (user_data), RFKILL_TYPE_WLAN);
}
static void
manager_modem_enabled_changed (NMDevice *device, gpointer user_data)
{
nm_manager_rfkill_update (NM_MANAGER (user_data), RFKILL_TYPE_WWAN);
}
static void
device_auth_done_cb (NMAuthChain *chain,
GError *auth_error,
@ -1807,10 +1756,6 @@ add_device (NMManager *self, NMDevice *device, gboolean generate_con)
g_signal_connect (device, "notify::" NM_DEVICE_WIFI_IPW_RFKILL_STATE,
G_CALLBACK (manager_ipw_rfkill_state_changed),
self);
} else if (devtype == NM_DEVICE_TYPE_MODEM) {
g_signal_connect (device, "enable-changed",
G_CALLBACK (manager_modem_enabled_changed),
self);
}
/* Update global rfkill state for this device type with the device's
@ -4807,7 +4752,6 @@ nm_manager_init (NMManager *manager)
priv->radio_states[RFKILL_TYPE_WWAN].prop = NM_MANAGER_WWAN_ENABLED;
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].daemon_enabled_func = nm_manager_get_modem_enabled_state;
priv->radio_states[RFKILL_TYPE_WWAN].rtype = RFKILL_TYPE_WWAN;
priv->radio_states[RFKILL_TYPE_WIMAX].user_enabled = TRUE;