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 gboolean wait_for_sim_ready (GTask *task);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unlock_required_subscriber_ready_state_ready (MbimDevice *device,
|
unlock_required_subscriber_ready_state_ready (MbimDevice *device,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GTask *task)
|
GTask *task)
|
||||||
{
|
{
|
||||||
LoadUnlockRequiredContext *ctx;
|
LoadUnlockRequiredContext *ctx;
|
||||||
MMBroadbandModemMbim *self;
|
MMBroadbandModemMbim *self;
|
||||||
MbimMessage *response;
|
g_autoptr(MbimMessage) response = NULL;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
|
MbimSubscriberReadyState ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
|
||||||
|
|
||||||
ctx = g_task_get_task_data (task);
|
ctx = g_task_get_task_data (task);
|
||||||
self = g_task_get_source_object (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);
|
response = mbim_device_command_finish (device, res, &error);
|
||||||
if (response &&
|
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
|
||||||
mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) &&
|
g_task_return_error (task, error);
|
||||||
mbim_message_subscriber_ready_status_response_parse (
|
g_object_unref (task);
|
||||||
response,
|
return;
|
||||||
&ready_state,
|
}
|
||||||
NULL, /* subscriber_id */
|
|
||||||
NULL, /* sim_iccid */
|
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
|
||||||
NULL, /* ready_info */
|
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse (
|
||||||
NULL, /* telephone_numbers_count */
|
response,
|
||||||
NULL, /* telephone_numbers */
|
&ready_state,
|
||||||
&error)) {
|
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) {
|
switch (ready_state) {
|
||||||
case MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED:
|
case MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED:
|
||||||
case MBIM_SUBSCRIBER_READY_STATE_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 */
|
/* Fatal errors are reported right away */
|
||||||
if (error) {
|
if (error) {
|
||||||
g_task_return_error (task, error);
|
g_task_return_error (task, error);
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Need to retry? */
|
/* 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,
|
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_RETRY,
|
||||||
"SIM not ready yet (retry)");
|
"SIM not ready yet (retry)");
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialized but locked? */
|
/* Initialized but locked? */
|
||||||
@@ -1542,14 +1571,10 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
|
|||||||
(GAsyncReadyCallback)pin_query_ready,
|
(GAsyncReadyCallback)pin_query_ready,
|
||||||
task);
|
task);
|
||||||
mbim_message_unref (message);
|
mbim_message_unref (message);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
|
||||||
out:
|
|
||||||
if (response)
|
|
||||||
mbim_message_unref (response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -1705,52 +1730,76 @@ modem_load_unlock_retries (MMIfaceModem *self,
|
|||||||
/* Own numbers loading */
|
/* Own numbers loading */
|
||||||
|
|
||||||
static GStrv
|
static GStrv
|
||||||
modem_load_own_numbers_finish (MMIfaceModem *self,
|
modem_load_own_numbers_finish (MMIfaceModem *self,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
return g_task_propagate_pointer (G_TASK (res), error);
|
return g_task_propagate_pointer (G_TASK (res), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
own_numbers_subscriber_ready_state_ready (MbimDevice *device,
|
own_numbers_subscriber_ready_state_ready (MbimDevice *device,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GTask *task)
|
GTask *task)
|
||||||
{
|
{
|
||||||
MbimMessage *response;
|
MMBroadbandModemMbim *self;
|
||||||
GError *error = NULL;
|
g_autoptr(MbimMessage) response = NULL;
|
||||||
gchar **telephone_numbers;
|
GError *error = NULL;
|
||||||
|
gchar **telephone_numbers;
|
||||||
|
|
||||||
|
self = g_task_get_source_object (task);
|
||||||
|
|
||||||
response = mbim_device_command_finish (device, res, &error);
|
response = mbim_device_command_finish (device, res, &error);
|
||||||
if (response &&
|
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
|
||||||
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
|
|
||||||
g_task_return_error (task, 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);
|
g_object_unref (task);
|
||||||
|
|
||||||
if (response)
|
|
||||||
mbim_message_unref (response);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
modem_load_own_numbers (MMIfaceModem *self,
|
modem_load_own_numbers (MMIfaceModem *self,
|
||||||
GAsyncReadyCallback callback,
|
GAsyncReadyCallback callback,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
MbimDevice *device;
|
MbimDevice *device;
|
||||||
MbimMessage *message;
|
GTask *task;
|
||||||
GTask *task;
|
g_autoptr(MbimMessage) message = NULL;
|
||||||
|
|
||||||
if (!peek_device (self, &device, callback, user_data))
|
if (!peek_device (self, &device, callback, user_data))
|
||||||
return;
|
return;
|
||||||
@@ -1764,7 +1813,6 @@ modem_load_own_numbers (MMIfaceModem *self,
|
|||||||
NULL,
|
NULL,
|
||||||
(GAsyncReadyCallback)own_numbers_subscriber_ready_state_ready,
|
(GAsyncReadyCallback)own_numbers_subscriber_ready_state_ready,
|
||||||
task);
|
task);
|
||||||
mbim_message_unref (message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -3866,18 +3914,38 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
|
|||||||
MbimMessage *notification)
|
MbimMessage *notification)
|
||||||
{
|
{
|
||||||
MbimSubscriberReadyState ready_state;
|
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 (
|
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
|
||||||
notification,
|
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_notification_parse (
|
||||||
&ready_state,
|
notification,
|
||||||
NULL, /* subscriber_id */
|
&ready_state,
|
||||||
NULL, /* sim_iccid */
|
NULL, /* flags */
|
||||||
NULL, /* ready_info */
|
NULL, /* subscriber id */
|
||||||
NULL, /* telephone_numbers_count */
|
NULL, /* sim_iccid */
|
||||||
&telephone_numbers,
|
NULL, /* ready_info */
|
||||||
NULL)) {
|
NULL, /* telephone_numbers_count */
|
||||||
return;
|
&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)
|
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;
|
self->priv->last_ready_state = ready_state;
|
||||||
g_strfreev (telephone_numbers);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@@ -103,18 +103,38 @@ subscriber_ready_status_ready (MbimDevice *device,
|
|||||||
g_assert (!self->priv->iccid_error);
|
g_assert (!self->priv->iccid_error);
|
||||||
|
|
||||||
response = mbim_device_command_finish (device, res, &self->priv->preload_error);
|
response = mbim_device_command_finish (device, res, &self->priv->preload_error);
|
||||||
if (response &&
|
if (response && mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &self->priv->preload_error)) {
|
||||||
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)) {
|
||||||
mbim_message_subscriber_ready_status_response_parse (
|
if (!mbim_message_ms_basic_connect_v3_subscriber_ready_status_response_parse (
|
||||||
response,
|
response,
|
||||||
NULL, /* ready_state */
|
NULL, /* ready_state */
|
||||||
&self->priv->imsi,
|
NULL, /* flags */
|
||||||
&raw_iccid,
|
&self->priv->imsi,
|
||||||
NULL, /* ready_info */
|
&raw_iccid,
|
||||||
NULL, /* telephone_numbers_count */
|
NULL, /* ready_info */
|
||||||
NULL, /* telephone_numbers */
|
NULL, /* telephone_numbers_count */
|
||||||
&self->priv->preload_error)) {
|
NULL, /* telephone_numbers */
|
||||||
self->priv->iccid = mm_3gpp_parse_iccid (raw_iccid, &self->priv->iccid_error);
|
&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
|
/* At this point we just complete, as all the info and errors have already
|
||||||
|
Reference in New Issue
Block a user