iface-modem: fail initialization if eSIM without profiles

A modem using an eSIM without profiles should not be allowed to get
enabled, it should be really treated as a modem without a physical
SIM.
This commit is contained in:
Aleksander Morgado
2022-05-20 14:31:49 +02:00
parent 0123030136
commit 234f185c3a
4 changed files with 45 additions and 18 deletions

View File

@@ -146,16 +146,18 @@ typedef enum { /*< underscore_name=mm_modem_state >*/
* @MM_MODEM_STATE_FAILED_REASON_UNKNOWN: Unknown error.
* @MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: SIM is required but missing.
* @MM_MODEM_STATE_FAILED_REASON_SIM_ERROR: SIM is available, but unusable (e.g. permanently locked).
* @MM_MODEM_STATE_FAILED_REASON_ESIM_WITHOUT_PROFILES: eSIM is not initialized. Since 1.20.
*
* Enumeration of possible errors when the modem is in @MM_MODEM_STATE_FAILED.
*
* Since: 1.0
*/
typedef enum { /*< underscore_name=mm_modem_state_failed_reason >*/
MM_MODEM_STATE_FAILED_REASON_NONE = 0,
MM_MODEM_STATE_FAILED_REASON_UNKNOWN = 1,
MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2,
MM_MODEM_STATE_FAILED_REASON_SIM_ERROR = 3,
MM_MODEM_STATE_FAILED_REASON_NONE = 0,
MM_MODEM_STATE_FAILED_REASON_UNKNOWN = 1,
MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2,
MM_MODEM_STATE_FAILED_REASON_SIM_ERROR = 3,
MM_MODEM_STATE_FAILED_REASON_ESIM_WITHOUT_PROFILES = 4,
} MMModemStateFailedReason;
/**

View File

@@ -101,26 +101,28 @@
* @MM_CORE_ERROR_NOT_FOUND: Item not found.
* @MM_CORE_ERROR_RETRY: Operation cannot yet be performed, retry later.
* @MM_CORE_ERROR_EXISTS: Item already exists.
* @MM_CORE_ERROR_WRONG_SIM_STATE: Operation cannot be executed in the current SIM state. Since 1.20.
*
* Common errors that may be reported by ModemManager.
*
* Since: 1.0
*/
typedef enum { /*< underscore_name=mm_core_error >*/
MM_CORE_ERROR_FAILED = 0, /*< nick=Failed >*/
MM_CORE_ERROR_CANCELLED = 1, /*< nick=Cancelled >*/
MM_CORE_ERROR_ABORTED = 2, /*< nick=Aborted >*/
MM_CORE_ERROR_UNSUPPORTED = 3, /*< nick=Unsupported >*/
MM_CORE_ERROR_NO_PLUGINS = 4, /*< nick=NoPlugins >*/
MM_CORE_ERROR_UNAUTHORIZED = 5, /*< nick=Unauthorized >*/
MM_CORE_ERROR_INVALID_ARGS = 6, /*< nick=InvalidArgs >*/
MM_CORE_ERROR_IN_PROGRESS = 7, /*< nick=InProgress >*/
MM_CORE_ERROR_WRONG_STATE = 8, /*< nick=WrongState >*/
MM_CORE_ERROR_CONNECTED = 9, /*< nick=Connected >*/
MM_CORE_ERROR_TOO_MANY = 10, /*< nick=TooMany >*/
MM_CORE_ERROR_NOT_FOUND = 11, /*< nick=NotFound >*/
MM_CORE_ERROR_RETRY = 12, /*< nick=Retry >*/
MM_CORE_ERROR_EXISTS = 13, /*< nick=Exists >*/
MM_CORE_ERROR_FAILED = 0, /*< nick=Failed >*/
MM_CORE_ERROR_CANCELLED = 1, /*< nick=Cancelled >*/
MM_CORE_ERROR_ABORTED = 2, /*< nick=Aborted >*/
MM_CORE_ERROR_UNSUPPORTED = 3, /*< nick=Unsupported >*/
MM_CORE_ERROR_NO_PLUGINS = 4, /*< nick=NoPlugins >*/
MM_CORE_ERROR_UNAUTHORIZED = 5, /*< nick=Unauthorized >*/
MM_CORE_ERROR_INVALID_ARGS = 6, /*< nick=InvalidArgs >*/
MM_CORE_ERROR_IN_PROGRESS = 7, /*< nick=InProgress >*/
MM_CORE_ERROR_WRONG_STATE = 8, /*< nick=WrongState >*/
MM_CORE_ERROR_CONNECTED = 9, /*< nick=Connected >*/
MM_CORE_ERROR_TOO_MANY = 10, /*< nick=TooMany >*/
MM_CORE_ERROR_NOT_FOUND = 11, /*< nick=NotFound >*/
MM_CORE_ERROR_RETRY = 12, /*< nick=Retry >*/
MM_CORE_ERROR_EXISTS = 13, /*< nick=Exists >*/
MM_CORE_ERROR_WRONG_SIM_STATE = 14, /*< nick=WrongSimState >*/
} MMCoreError;
/**

View File

@@ -12389,6 +12389,10 @@ iface_modem_initialize_ready (MMBroadbandModem *self,
MM_MOBILE_EQUIPMENT_ERROR,
MM_MOBILE_EQUIPMENT_ERROR_SIM_WRONG))
failed_reason = MM_MODEM_STATE_FAILED_REASON_SIM_MISSING;
else if (g_error_matches (error,
MM_CORE_ERROR,
MM_CORE_ERROR_WRONG_SIM_STATE))
failed_reason = MM_MODEM_STATE_FAILED_REASON_ESIM_WITHOUT_PROFILES;
g_error_free (error);

View File

@@ -4711,6 +4711,7 @@ typedef enum {
INITIALIZATION_STEP_SIM,
INITIALIZATION_STEP_SETUP_CARRIER_CONFIG,
INITIALIZATION_STEP_OWN_NUMBERS,
INITIALIZATION_STEP_VALIDATE_ESIM_STATUS,
INITIALIZATION_STEP_LAST
} InitializationStep;
@@ -6011,6 +6012,24 @@ interface_initialization_step (GTask *task)
ctx->step++;
/* fall-through */
case INITIALIZATION_STEP_VALIDATE_ESIM_STATUS: {
g_autoptr(MMBaseSim) sim = NULL;
g_object_get (self,
MM_IFACE_MODEM_SIM, &sim,
NULL);
/* If the current SIM is an eSIM without profiles, we transition to FAILED
* status because the modem is really unusable. */
if (sim && mm_base_sim_is_esim_without_profiles (sim)) {
g_clear_error (&ctx->fatal_error);
ctx->fatal_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_WRONG_SIM_STATE,
"eSIM without profiles detected");
}
ctx->step++;
} /* fall-through */
case INITIALIZATION_STEP_LAST:
/* Setup all method handlers */
g_object_connect (ctx->skeleton,