aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Chan <benchan@chromium.org>2017-08-07 14:26:10 -0700
committerAleksander Morgado <aleksander@aleksander.es>2017-09-07 19:07:01 +0200
commit33427397980a7868d32bad92524a53d4431ba718 (patch)
tree85ed321b3f3c98d46a78c37aa241a0db7bddffc5
parenteb9ec1b617b27485a4f0ede472e9088f0ca52066 (diff)
broadband-modem-mbim: preserve unlock retries for PIN1 when appropriate
If PIN1 is disabled and we have tried to enable it with a wrong PIN, a MBIM modem would have indicated the number of remaining attempts for PIN1 (unless PUK1 is engaged) in the response to the failed MBIM_CID_PIN set operation. However, a MBIM_CID_PIN query may be issued (e.g. MMBaseSim calls mm_iface_modem_update_lock_info()) after the MBIM_CID_PIN set operation to query the number of remaining attempts for a PIN type. Unfortunately, we can't specify a particular PIN type in a MBIM_CID_PIN query. The modem may not reply with information about PIN1 if PIN1 is disabled. When that happens, we would like to preserve our knowledge about the number of remaining attempts for PIN1. This patch modifies MMBroadbandModemMbim's load_unlock_retries() operation to carry over any previously observed information on PIN1 if the MBIM_CID_PIN query reports something other than PIN1.
-rw-r--r--src/mm-broadband-modem-mbim.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index d4f483f0..93a61085 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -93,6 +93,9 @@ struct _MMBroadbandModemMbimPrivate {
/* For notifying when the mbim-proxy connection is dead */
gulong mbim_device_removed_id;
+
+ /* Previously observed SIM-PIN remaining retries */
+ guint sim_pin_retries;
};
/*****************************************************************************/
@@ -710,16 +713,47 @@ pin_query_unlock_retries_ready (MbimDevice *device,
NULL,
&remaining_attempts,
&error)) {
+ MMBroadbandModemMbim *self;
+ MMModemLock lock;
MMUnlockRetries *retries;
+ self = g_task_get_source_object (task);
+ lock = mm_modem_lock_from_mbim_pin_type (pin_type);
retries = mm_unlock_retries_new ();
- /* According to the MBIM specification, RemainingAttempts is set to
- * 0xffffffff if the device does not support this information. */
- if (remaining_attempts != G_MAXUINT32) {
+
+ /* If PIN1 is disabled and we have tried to enable it with a wrong PIN,
+ * the modem would have indicated the number of remaining attempts for
+ * PIN1 (unless PUK1 is engaged) in the response to the failed
+ * MBIM_CID_PIN set operation. Thus, MMSimMbim would have updated
+ * MMIfaceModem's MMUnlockRetries with information about PIN1.
+ *
+ * However, a MBIM_CID_PIN query may be issued (e.g. MMBaseSim calls
+ * mm_iface_modem_update_lock_info()) after the MBIM_CID_PIN set
+ * operation to query the number of remaining attempts for a PIN type.
+ * Unfortunately, we can't specify a particular PIN type in a
+ * MBIM_CID_PIN query. The modem may not reply with information about
+ * PIN1 if PIN1 is disabled. When that happens, we would like to
+ * preserve our knowledge about the number of remaining attempts for
+ * PIN1. Here we thus carry over any existing information on PIN1 from
+ * MMIfaceModem's MMUnlockRetries if the MBIM_CID_PIN query reports
+ * something other than PIN1. */
+ if (lock != MM_MODEM_LOCK_SIM_PIN &&
+ self->priv->sim_pin_retries != MM_UNLOCK_RETRIES_UNKNOWN) {
mm_unlock_retries_set (retries,
- mm_modem_lock_from_mbim_pin_type (pin_type),
- remaining_attempts);
+ MM_MODEM_LOCK_SIM_PIN,
+ self->priv->sim_pin_retries);
}
+
+ /* According to the MBIM specification, RemainingAttempts is set to
+ * 0xffffffff if the device does not support this information. */
+ if (remaining_attempts != G_MAXUINT32)
+ mm_unlock_retries_set (retries, lock, remaining_attempts);
+ else
+ remaining_attempts = MM_UNLOCK_RETRIES_UNKNOWN;
+
+ if (lock == MM_MODEM_LOCK_SIM_PIN)
+ self->priv->sim_pin_retries = remaining_attempts;
+
g_task_return_pointer (task, retries, g_object_unref);
} else
g_task_return_error (task, error);
@@ -3240,6 +3274,8 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
MM_TYPE_BROADBAND_MODEM_MBIM,
MMBroadbandModemMbimPrivate);
+
+ self->priv->sim_pin_retries = MM_UNLOCK_RETRIES_UNKNOWN;
}
static void