diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-14 14:18:07 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-17 15:19:50 +0200 |
commit | 07d4aa993803a7c83349f9865dd0654086439b31 (patch) | |
tree | 3ccef5d2c9ddaba9c8b55db168a1fcca209dcfde | |
parent | 6cbb3e9fc9caf24e09e476ec86e5041d7a1f6dbb (diff) | |
download | ModemManager-07d4aa993803a7c83349f9865dd0654086439b31.tar.gz |
bearer-mbim: activate packet service during connection request
-rw-r--r-- | src/mm-bearer-mbim.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c index e5fa09f7e..ebd2a963c 100644 --- a/src/mm-bearer-mbim.c +++ b/src/mm-bearer-mbim.c @@ -110,6 +110,7 @@ peek_ports (gpointer self, typedef enum { CONNECT_STEP_FIRST, + CONNECT_STEP_PACKET_SERVICE, CONNECT_STEP_PROVISIONED_CONTEXTS, CONNECT_STEP_CONNECT, CONNECT_STEP_LAST @@ -271,6 +272,56 @@ provisioned_contexts_query_ready (MbimDevice *device, } static void +packet_service_set_ready (MbimDevice *device, + GAsyncResult *res, + ConnectContext *ctx) +{ + GError *error = NULL; + MbimMessage *response; + guint32 nw_error; + MbimPacketServiceState packet_service_state; + MbimDataClass highest_available_data_class; + guint64 uplink_speed; + guint64 downlink_speed; + + response = mbim_device_command_finish (device, res, &error); + if (response && + mbim_message_command_done_get_result (response, &error) && + mbim_message_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + &highest_available_data_class, + &uplink_speed, + &downlink_speed, + &error)) { + if (nw_error) + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); + else { + gchar *str; + + str = mbim_data_class_build_string_from_mask (highest_available_data_class); + mm_dbg ("Packet service update:"); + mm_dbg (" state: '%s'", mbim_packet_service_state_get_string (packet_service_state)); + mm_dbg (" data class: '%s'", str); + mm_dbg (" uplink: '%" G_GUINT64_FORMAT "' bps", uplink_speed); + mm_dbg (" downlink: '%" G_GUINT64_FORMAT "' bps", downlink_speed); + g_free (str); + } + } + + if (error) { + g_simple_async_result_take_error (ctx->result, error); + connect_context_complete_and_free (ctx); + return; + } + + /* Keep on */ + ctx->step++; + connect_context_step (ctx); +} + +static void connect_context_step (ConnectContext *ctx) { MbimMessage *message; @@ -290,6 +341,29 @@ connect_context_step (ConnectContext *ctx) /* Fall down */ ctx->step++; + case CONNECT_STEP_PACKET_SERVICE: { + GError *error = NULL; + + mm_dbg ("Activating packet service..."); + message = (mbim_message_packet_service_set_new ( + MBIM_PACKET_SERVICE_ACTION_ATTACH, + &error)); + if (!message) { + g_simple_async_result_take_error (ctx->result, error); + connect_context_complete_and_free (ctx); + return; + } + + mbim_device_command (ctx->device, + message, + 10, + NULL, + (GAsyncReadyCallback)packet_service_set_ready, + ctx); + mbim_message_unref (message); + return; + } + case CONNECT_STEP_PROVISIONED_CONTEXTS: mm_dbg ("Listing provisioned contexts..."); message = mbim_message_provisioned_contexts_query_new (NULL); |