diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-13 18:18:29 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-04-17 15:19:41 +0200 |
commit | 854c371c8aa93b96006e668be6d5163db501febe (patch) | |
tree | 2fd86acb78bef1a51f8b3d0aee59a7cd397c2630 | |
parent | c7f3d33b3e47ead7e012a4a7dbe6c670aa935678 (diff) | |
download | ModemManager-854c371c8aa93b96006e668be6d5163db501febe.tar.gz |
broadband-modem-mbim: implement 3GPP registration request
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 91 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 61 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.h | 2 |
3 files changed, 154 insertions, 0 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 2546f3480..b2b60f49f 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -1893,6 +1893,95 @@ modem_3gpp_run_registration_checks (MMIfaceModem3gpp *self, /*****************************************************************************/ +static gboolean +modem_3gpp_register_in_network_finish (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error) +{ + return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); +} + +static void +register_state_set_ready (MbimDevice *device, + GAsyncResult *res, + GSimpleAsyncResult *simple) +{ + MbimMessage *response; + GError *error = NULL; + MbimNwError nw_error; + + response = mbim_device_command_finish (device, res, &error); + if (response && + mbim_message_command_done_get_result (response, &error) && + mbim_message_register_state_response_parse ( + response, + &nw_error, + NULL, /* ®ister_state */ + NULL, /* register_mode */ + NULL, /* available_data_classes */ + NULL, /* current_cellular_class */ + NULL, /* provider_id */ + NULL, /* provider_name */ + NULL, /* roaming_text */ + NULL, /* registration_flag */ + NULL)) { + if (nw_error) + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); + } + + if (error) + g_simple_async_result_take_error (simple, error); + else + g_simple_async_result_set_op_res_gboolean (simple, TRUE); + + if (response) + mbim_message_unref (response); + g_simple_async_result_complete (simple); + g_object_unref (simple); +} + +static void +modem_3gpp_register_in_network (MMIfaceModem3gpp *self, + const gchar *operator_id, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GSimpleAsyncResult *result; + MbimDevice *device; + MbimMessage *message; + + if (!peek_device (self, &device, callback, user_data)) + return; + + result = g_simple_async_result_new (G_OBJECT (self), + callback, + user_data, + modem_3gpp_run_registration_checks); + + if (operator_id && operator_id[0]) + message = (mbim_message_register_state_set_new ( + operator_id, + MBIM_REGISTER_ACTION_MANUAL, + 0, /* data_class, none preferred */ + NULL)); + else + message = (mbim_message_register_state_set_new ( + "", + MBIM_REGISTER_ACTION_AUTOMATIC, + 0, /* data_class, none preferred */ + NULL)); + mbim_device_command (device, + message, + 60, + NULL, + (GAsyncReadyCallback)register_state_set_ready, + result); + mbim_message_unref (message); +} + +/*****************************************************************************/ + MMBroadbandModemMbim * mm_broadband_modem_mbim_new (const gchar *device, const gchar **drivers, @@ -2019,6 +2108,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->load_operator_name_finish = modem_3gpp_load_operator_name_finish; iface->run_registration_checks = modem_3gpp_run_registration_checks; iface->run_registration_checks_finish = modem_3gpp_run_registration_checks_finish; + iface->register_in_network = modem_3gpp_register_in_network; + iface->register_in_network_finish = modem_3gpp_register_in_network_finish; /* Unneeded things */ iface->enable_unsolicited_registration_events = NULL; diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c index 9ff5439b4..7815d01e2 100644 --- a/src/mm-modem-helpers-mbim.c +++ b/src/mm-modem-helpers-mbim.c @@ -15,6 +15,7 @@ #include "mm-modem-helpers-mbim.h" #include "mm-enums-types.h" +#include "mm-errors-types.h" #include "mm-log.h" /*****************************************************************************/ @@ -82,3 +83,63 @@ mm_modem_3gpp_registration_state_from_mbim_register_state (MbimRegisterState sta return MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN; } } + +GError * +mm_mobile_equipment_error_from_mbim_nw_error (MbimNwError nw_error) +{ + switch (nw_error) { + case MBIM_NW_ERROR_IMSI_UNKNOWN_IN_HLR: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_IMSI_UNKNOWN_IN_HLR, + "IMSI unknown in HLR"); + case MBIM_NW_ERROR_IMSI_UNKNOWN_IN_VLR: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_IMSI_UNKNOWN_IN_VLR, + "IMSI unknown in VLR"); + case MBIM_NW_ERROR_ILLEGAL_ME: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_ILLEGAL_ME, + "Illegal ME"); + case MBIM_NW_ERROR_GPRS_NOT_ALLOWED: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_NOT_ALLOWED, + "GPRS not allowed"); + case MBIM_NW_ERROR_GPRS_AND_NON_GPRS_NOT_ALLOWED: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_NOT_ALLOWED, + "GPRS and non-GPRS not allowed"); + case MBIM_NW_ERROR_PLMN_NOT_ALLOWED: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_PLMN_NOT_ALLOWED, + "PLMN not allowed"); + case MBIM_NW_ERROR_LOCATION_AREA_NOT_ALLOWED: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_LOCATION_NOT_ALLOWED, + "Location area not allowed"); + case MBIM_NW_ERROR_ROAMING_NOT_ALLOWED_IN_LOCATION_AREA: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_ROAMING_NOT_ALLOWED, + "Roaming not allowed in location area"); + case MBIM_NW_ERROR_GPRS_NOT_ALLOWED_IN_PLMN: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_NOT_ALLOWED, + "GPRS not allowed in PLMN"); + case MBIM_NW_ERROR_NO_CELLS_IN_LOCATION_AREA: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_NO_CELLS_IN_LOCATION_AREA, + "No cells in location area"); + case MBIM_NW_ERROR_NETWORK_FAILURE: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_NETWORK_FAILURE, + "Network failure"); + case MBIM_NW_ERROR_CONGESTION: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_CONGESTION, + "Congestion"); + default: + return g_error_new (MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_UNKNOWN, + "Unknown error (%u)", + nw_error); + } +} diff --git a/src/mm-modem-helpers-mbim.h b/src/mm-modem-helpers-mbim.h index c01df6814..45a65c077 100644 --- a/src/mm-modem-helpers-mbim.h +++ b/src/mm-modem-helpers-mbim.h @@ -28,4 +28,6 @@ MMModemLock mm_modem_lock_from_mbim_pin_type (MbimPinType pin_type); MMModem3gppRegistrationState mm_modem_3gpp_registration_state_from_mbim_register_state (MbimRegisterState state); +GError *mm_mobile_equipment_error_from_mbim_nw_error (MbimNwError nw_error); + #endif /* MM_MODEM_HELPERS_MBIM_H */ |