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:
@@ -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 {
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user