diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2018-12-06 08:04:13 +0100 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2018-12-07 16:20:53 +0000 |
commit | 4cb6751dafc20a55192b61eb8a6ab97d3c95c398 (patch) | |
tree | f33006acacf97683c87355c73d0edfcc08d3c532 /src | |
parent | 8281b5048bc002dd2b049fdad041a35b7175eca7 (diff) |
api,modem-3gpp: new 'SetInitialEpsBearerSettings' method
This method allows users to modify the settings used during the
initial LTE attach procedure.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-iface-modem-3gpp.c | 161 | ||||
-rw-r--r-- | src/mm-iface-modem-3gpp.h | 9 |
2 files changed, 170 insertions, 0 deletions
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c index 5966b4c1..e5b40a14 100644 --- a/src/mm-iface-modem-3gpp.c +++ b/src/mm-iface-modem-3gpp.c @@ -913,6 +913,163 @@ handle_set_eps_ue_mode_operation (MmGdbusModem3gpp *skeleton, /*****************************************************************************/ +typedef struct { + MmGdbusModem3gpp *skeleton; + GDBusMethodInvocation *invocation; + MMIfaceModem3gpp *self; + GVariant *dictionary; + MMBearerProperties *config; +} HandleSetInitialEpsBearerSettingsContext; + +static void +handle_set_initial_eps_bearer_settings_context_free (HandleSetInitialEpsBearerSettingsContext *ctx) +{ + g_clear_object (&ctx->config); + g_variant_unref (ctx->dictionary); + g_object_unref (ctx->skeleton); + g_object_unref (ctx->invocation); + g_object_unref (ctx->self); + g_slice_free (HandleSetInitialEpsBearerSettingsContext, ctx); +} + +static void +after_set_load_initial_eps_bearer_settings_ready (MMIfaceModem3gpp *self, + GAsyncResult *res, + HandleSetInitialEpsBearerSettingsContext *ctx) +{ + GError *error = NULL; + MMBearerProperties *new_config; + + new_config = MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_initial_eps_bearer_settings_finish (self, res, &error); + if (error) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_initial_eps_bearer_settings_context_free (ctx); + return; + } + + if (!mm_bearer_properties_cmp (new_config, ctx->config)) { + g_dbus_method_invocation_return_error_literal (ctx->invocation, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Initial EPS bearer settings were not updated"); + } else { + GVariant *dictionary; + + dictionary = mm_bearer_properties_get_dictionary (new_config); + mm_gdbus_modem3gpp_set_initial_eps_bearer_settings (ctx->skeleton, dictionary); + if (dictionary) + g_variant_unref (dictionary); + mm_gdbus_modem3gpp_complete_set_initial_eps_bearer_settings (ctx->skeleton, ctx->invocation); + } + + handle_set_initial_eps_bearer_settings_context_free (ctx); + g_object_unref (new_config); +} + +static void +set_initial_eps_bearer_settings_ready (MMIfaceModem3gpp *self, + GAsyncResult *res, + HandleSetInitialEpsBearerSettingsContext *ctx) +{ + GError *error = NULL; + + if (!MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->set_initial_eps_bearer_settings_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_initial_eps_bearer_settings_context_free (ctx); + return; + } + + if (MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_initial_eps_bearer_settings && + MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_initial_eps_bearer_settings_finish) { + MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_initial_eps_bearer_settings ( + self, + (GAsyncReadyCallback)after_set_load_initial_eps_bearer_settings_ready, + ctx); + return; + } + + /* Assume we're ok */ + mm_gdbus_modem3gpp_complete_set_initial_eps_bearer_settings (ctx->skeleton, ctx->invocation); + handle_set_initial_eps_bearer_settings_context_free (ctx); +} + +static void +set_initial_eps_bearer_settings_auth_ready (MMBaseModem *self, + GAsyncResult *res, + HandleSetInitialEpsBearerSettingsContext *ctx) +{ + GError *error = NULL; + MMBearerProperties *old_config = NULL; + GVariant *old_dictionary; + + if (!mm_base_modem_authorize_finish (self, res, &error)) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_initial_eps_bearer_settings_context_free (ctx); + return; + } + + /* If UE mode update is not implemented, report an error */ + if (!MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->set_initial_eps_bearer_settings || + !MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->set_initial_eps_bearer_settings_finish) { + g_dbus_method_invocation_return_error (ctx->invocation, + MM_CORE_ERROR, + MM_CORE_ERROR_UNSUPPORTED, + "Cannot set initial EPS bearer settings: operation not supported"); + handle_set_initial_eps_bearer_settings_context_free (ctx); + return; + } + + ctx->config = mm_bearer_properties_new_from_dictionary (ctx->dictionary, &error); + if (!ctx->config) { + g_dbus_method_invocation_take_error (ctx->invocation, error); + handle_set_initial_eps_bearer_settings_context_free (ctx); + return; + } + + /* If the user doesn't specify explicit auth settings, assume NONE as default */ + if (mm_bearer_properties_get_allowed_auth (ctx->config) == MM_BEARER_ALLOWED_AUTH_UNKNOWN) + mm_bearer_properties_set_allowed_auth (ctx->config, MM_BEARER_ALLOWED_AUTH_NONE); + + old_dictionary = mm_gdbus_modem3gpp_get_initial_eps_bearer_settings (ctx->skeleton); + if (old_dictionary) + old_config = mm_bearer_properties_new_from_dictionary (old_dictionary, NULL); + + if (old_config && mm_bearer_properties_cmp (ctx->config, old_config)) { + mm_gdbus_modem3gpp_complete_set_initial_eps_bearer_settings (ctx->skeleton, ctx->invocation); + handle_set_initial_eps_bearer_settings_context_free (ctx); + } else { + MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->set_initial_eps_bearer_settings ( + MM_IFACE_MODEM_3GPP (self), + ctx->config, + (GAsyncReadyCallback)set_initial_eps_bearer_settings_ready, + ctx); + } + + g_clear_object (&old_config); +} + +static gboolean +handle_set_initial_eps_bearer_settings (MmGdbusModem3gpp *skeleton, + GDBusMethodInvocation *invocation, + GVariant *dictionary, + MMIfaceModem3gpp *self) +{ + HandleSetInitialEpsBearerSettingsContext *ctx; + + ctx = g_slice_new0 (HandleSetInitialEpsBearerSettingsContext); + ctx->skeleton = g_object_ref (skeleton); + ctx->invocation = g_object_ref (invocation); + ctx->self = g_object_ref (self); + ctx->dictionary = g_variant_ref (dictionary); + + mm_base_modem_authorize (MM_BASE_MODEM (self), + invocation, + MM_AUTHORIZATION_DEVICE_CONTROL, + (GAsyncReadyCallback)set_initial_eps_bearer_settings_auth_ready, + ctx); + return TRUE; +} + +/*****************************************************************************/ + gboolean mm_iface_modem_3gpp_run_registration_checks_finish (MMIfaceModem3gpp *self, GAsyncResult *res, @@ -2288,6 +2445,10 @@ interface_initialization_step (GTask *task) "handle-set-eps-ue-mode-operation", G_CALLBACK (handle_set_eps_ue_mode_operation), self); + g_signal_connect (ctx->skeleton, + "handle-set-initial-eps-bearer-settings", + G_CALLBACK (handle_set_initial_eps_bearer_settings), + self); /* Finally, export the new interface */ mm_gdbus_object_skeleton_set_modem3gpp (MM_GDBUS_OBJECT_SKELETON (self), diff --git a/src/mm-iface-modem-3gpp.h b/src/mm-iface-modem-3gpp.h index 66bf4cdd..5e092877 100644 --- a/src/mm-iface-modem-3gpp.h +++ b/src/mm-iface-modem-3gpp.h @@ -222,6 +222,15 @@ struct _MMIfaceModem3gpp { gboolean (* set_eps_ue_mode_operation_finish) (MMIfaceModem3gpp *self, GAsyncResult *res, GError **error); + + /* Set initial EPS bearer settings */ + void (* set_initial_eps_bearer_settings) (MMIfaceModem3gpp *self, + MMBearerProperties *properties, + GAsyncReadyCallback callback, + gpointer user_data); + gboolean (* set_initial_eps_bearer_settings_finish) (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error); }; GType mm_iface_modem_3gpp_get_type (void); |