broadband-modem-mbim,sim-mbim: support subscriber ready status from MBIMEx 3.0

Whenever MBIMEx v3.0 is enabled, the logic should parse the response
and indication messages using the updated format.
This commit is contained in:
Aleksander Morgado
2021-11-20 22:40:32 +01:00
parent 83ebc2b4a8
commit c76da3bed9
2 changed files with 168 additions and 81 deletions

View File

@@ -1455,31 +1455,62 @@ pin_query_ready (MbimDevice *device,
static gboolean wait_for_sim_ready (GTask *task);
static void
unlock_required_subscriber_ready_state_ready (MbimDevice *device,
unlock_required_subscriber_ready_state_ready (MbimDevice *device,
GAsyncResult *res,
GTask *task)
GTask *task)
{
LoadUnlockRequiredContext *ctx;
MMBroadbandModemMbim *self;
MbimMessage *response;
GError *error = NULL;
MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
MMBroadbandModemMbim *self;
g_autoptr(MbimMessage) response = NULL;
GError *error = NULL;
MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
ctx = g_task_get_task_data (task);
self = g_task_get_source_object (task);
/* reset to the default if any error happens */
self->priv->last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
response = mbim_device_command_finish (device, res, &error);
if (response &&
mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) &&
mbim_message_subscriber_ready_status_response_parse (
response,
&ready_state,
NULL, /* subscriber_id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&error)) {
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
g_task_return_error (task, error);
g_object_unref (task);
return;
}
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse (
response,
&ready_state,
NULL, /* flags */
NULL, /* subscriber id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&error))
g_prefix_error (&error, "Failed processing MBIMEx v3.0 subscriber ready status response: ");
else
mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response");
} else {
if (!mbim_message_subscriber_ready_status_response_parse (
response,
&ready_state,
NULL, /* subscriber id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&error))
g_prefix_error (&error, "Failed processing subscriber ready status response: ");
else
mm_obj_dbg (self, "processed subscriber ready status response");
}
if (!error) {
/* Store last valid status loaded */
self->priv->last_ready_state = ready_state;
switch (ready_state) {
case MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED:
case MBIM_SUBSCRIBER_READY_STATE_INITIALIZED:
@@ -1502,13 +1533,11 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
}
}
self->priv->last_ready_state = ready_state;
/* Fatal errors are reported right away */
if (error) {
g_task_return_error (task, error);
g_object_unref (task);
goto out;
return;
}
/* Need to retry? */
@@ -1525,7 +1554,7 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_RETRY,
"SIM not ready yet (retry)");
g_object_unref (task);
goto out;
return;
}
/* Initialized but locked? */
@@ -1542,14 +1571,10 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
(GAsyncReadyCallback)pin_query_ready,
task);
mbim_message_unref (message);
goto out;
return;
}
g_assert_not_reached ();
out:
if (response)
mbim_message_unref (response);
}
static gboolean
@@ -1705,52 +1730,76 @@ modem_load_unlock_retries (MMIfaceModem *self,
/* Own numbers loading */
static GStrv
modem_load_own_numbers_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
modem_load_own_numbers_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
{
return g_task_propagate_pointer (G_TASK (res), error);
}
static void
own_numbers_subscriber_ready_state_ready (MbimDevice *device,
own_numbers_subscriber_ready_state_ready (MbimDevice *device,
GAsyncResult *res,
GTask *task)
GTask *task)
{
MbimMessage *response;
GError *error = NULL;
gchar **telephone_numbers;
MMBroadbandModemMbim *self;
g_autoptr(MbimMessage) response = NULL;
GError *error = NULL;
gchar **telephone_numbers;
self = g_task_get_source_object (task);
response = mbim_device_command_finish (device, res, &error);
if (response &&
mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) &&
mbim_message_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
NULL, /* subscriber_id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
&error)) {
g_task_return_pointer (task, telephone_numbers, (GDestroyNotify)g_strfreev);
} else
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
g_task_return_error (task, error);
g_object_unref (task);
return;
}
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
NULL, /* flags */
NULL, /* subscriber id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
&error))
g_prefix_error (&error, "Failed processing MBIMEx v3.0 subscriber ready status response: ");
else
mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response");
} else {
if (!mbim_message_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
NULL, /* subscriber id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
&error))
g_prefix_error (&error, "Failed processing subscriber ready status response: ");
else
mm_obj_dbg (self, "processed subscriber ready status response");
}
if (error)
g_task_return_error (task, error);
else
g_task_return_pointer (task, telephone_numbers, (GDestroyNotify)g_strfreev);
g_object_unref (task);
if (response)
mbim_message_unref (response);
}
static void
modem_load_own_numbers (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
modem_load_own_numbers (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
MbimDevice *device;
MbimMessage *message;
GTask *task;
MbimDevice *device;
GTask *task;
g_autoptr(MbimMessage) message = NULL;
if (!peek_device (self, &device, callback, user_data))
return;
@@ -1764,7 +1813,6 @@ modem_load_own_numbers (MMIfaceModem *self,
NULL,
(GAsyncReadyCallback)own_numbers_subscriber_ready_state_ready,
task);
mbim_message_unref (message);
}
/*****************************************************************************/
@@ -3866,18 +3914,38 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
MbimMessage *notification)
{
MbimSubscriberReadyState ready_state;
gchar **telephone_numbers;
g_auto(GStrv) telephone_numbers = NULL;
g_autoptr(GError) error = NULL;
if (!mbim_message_subscriber_ready_status_notification_parse (
notification,
&ready_state,
NULL, /* subscriber_id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
NULL)) {
return;
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_notification_parse (
notification,
&ready_state,
NULL, /* flags */
NULL, /* subscriber id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
&error)) {
mm_obj_warn (self, "Failed processing MBIMEx v3.0 subscriber ready status response: %s", error->message);
return;
}
mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response");
} else {
if (!mbim_message_subscriber_ready_status_notification_parse (
notification,
&ready_state,
NULL, /* subscriber_id */
NULL, /* sim_iccid */
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
&telephone_numbers,
&error)) {
mm_obj_warn (self, "Failed processing subscriber ready status notification: %s", error->message);
return;
}
mm_obj_dbg (self, "processed subscriber ready status notification");
}
if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED)
@@ -3893,7 +3961,6 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
}
self->priv->last_ready_state = ready_state;
g_strfreev (telephone_numbers);
}
typedef struct {

View File

@@ -103,18 +103,38 @@ subscriber_ready_status_ready (MbimDevice *device,
g_assert (!self->priv->iccid_error);
response = mbim_device_command_finish (device, res, &self->priv->preload_error);
if (response &&
mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error) &&
mbim_message_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
&self->priv->imsi,
&raw_iccid,
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&self->priv->preload_error)) {
self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error);
if (response && mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error)) {
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
NULL, /* flags */
&self->priv->imsi,
&raw_iccid,
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&self->priv->preload_error))
g_prefix_error (&self->priv->preload_error, "Failed processing MBIMEx v3.0 subscriber ready status response: ");
else
mm_obj_dbg (self, "processed MBIMEx v3.0 subscriber ready status response");
} else {
if (!mbim_message_subscriber_ready_status_response_parse (
response,
NULL, /* ready_state */
&self->priv->imsi,
&raw_iccid,
NULL, /* ready_info */
NULL, /* telephone_numbers_count */
NULL, /* telephone_numbers */
&self->priv->preload_error))
g_prefix_error (&self->priv->preload_error, "Failed processing subscriber ready status response: ");
else
mm_obj_dbg (self, "processed subscriber ready status response");
}
if (raw_iccid)
self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error);
}
/* At this point we just complete, as all the info and errors have already