aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-04-14 14:18:07 +0200
committerAleksander Morgado <aleksander@lanedo.com>2013-04-17 15:19:50 +0200
commit07d4aa993803a7c83349f9865dd0654086439b31 (patch)
tree3ccef5d2c9ddaba9c8b55db168a1fcca209dcfde
parent6cbb3e9fc9caf24e09e476ec86e5041d7a1f6dbb (diff)
bearer-mbim: activate packet service during connection request
-rw-r--r--src/mm-bearer-mbim.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index e5fa09f7..ebd2a963 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);