diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2022-05-20 14:31:49 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-05-25 11:14:45 +0200 |
commit | 234f185c3a7731f858dac6c82339711806376472 (patch) | |
tree | 70b31a9ba01fe77d19b7758f58671abba9ecfac4 | |
parent | 012303013699bf23fde74a3ecb067c5c3a011554 (diff) |
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.
-rw-r--r-- | include/ModemManager-enums.h | 10 | ||||
-rw-r--r-- | include/ModemManager-errors.h | 30 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 4 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 19 |
4 files changed, 45 insertions, 18 deletions
diff --git a/include/ModemManager-enums.h b/include/ModemManager-enums.h index dd5601ce..fb3fd3ef 100644 --- a/include/ModemManager-enums.h +++ b/include/ModemManager-enums.h @@ -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; /** diff --git a/include/ModemManager-errors.h b/include/ModemManager-errors.h index 854e83ac..6d3315b5 100644 --- a/include/ModemManager-errors.h +++ b/include/ModemManager-errors.h @@ -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; /** diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 2998b779..5c87caf2 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -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); diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 02849048..41f220b3 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -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, |