From a063e2a15cb5846ca09b2ce84ccb1ba86c0ac435 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 8 May 2024 13:07:15 +0000 Subject: fibocom: remove custom initial EPS bearer management The implementation in the generic MMBroadbandModem object should fit well instead of the custom implementation. There is also no need to specify via udev tags which is the initial EPS bearer context id, we try to automatically guess it in runtime. --- src/plugins/fibocom/77-mm-fibocom-port-types.rules | 2 - src/plugins/fibocom/mm-broadband-modem-fibocom.c | 306 +-------------------- 2 files changed, 4 insertions(+), 304 deletions(-) (limited to 'src') diff --git a/src/plugins/fibocom/77-mm-fibocom-port-types.rules b/src/plugins/fibocom/77-mm-fibocom-port-types.rules index 63d37031..ab49a924 100644 --- a/src/plugins/fibocom/77-mm-fibocom-port-types.rules +++ b/src/plugins/fibocom/77-mm-fibocom-port-types.rules @@ -75,14 +75,12 @@ ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0115", ENV{.MM_USBIFNUM}=="05", ENV{ ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0106", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1" ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0106", ENV{.MM_USBIFNUM}=="01", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0106", ENV{.MM_USBIFNUM}=="02", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1" -ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="0106", ENV{ID_MM_FIBOCOM_INITIAL_EPS_CID}="1" # Fibocom MA510-GL (GTUSBMODE=32) # ttyUSB1 (if #0): AT port # ttyUSB2 (if #1): AT port ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="010a", ENV{.MM_USBIFNUM}=="00", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1" ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="010a", ENV{.MM_USBIFNUM}=="01", SUBSYSTEM=="tty", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1" -ATTRS{idVendor}=="2cb7", ATTRS{idProduct}=="010a", ENV{ID_MM_FIBOCOM_INITIAL_EPS_CID}="1" # Fibocom L610 (GTUSBMODE=31) # ttyUSB0 (if #0): AT port diff --git a/src/plugins/fibocom/mm-broadband-modem-fibocom.c b/src/plugins/fibocom/mm-broadband-modem-fibocom.c index fdbcb197..2bc27f16 100644 --- a/src/plugins/fibocom/mm-broadband-modem-fibocom.c +++ b/src/plugins/fibocom/mm-broadband-modem-fibocom.c @@ -20,24 +20,16 @@ #include "mm-broadband-modem.h" #include "mm-base-modem-at.h" #include "mm-iface-modem.h" -#include "mm-iface-modem-3gpp.h" -#include "mm-iface-modem-3gpp-profile-manager.h" #include "mm-log.h" #include "mm-shared-fibocom.h" -static void iface_modem_init (MMIfaceModemInterface *iface); -static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); -static void iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface *iface); -static void iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface); -static void shared_fibocom_init (MMSharedFibocomInterface *iface); - -static MMIfaceModem3gppProfileManagerInterface *iface_modem_3gpp_profile_manager_parent; +static void iface_modem_init (MMIfaceModemInterface *iface); +static void iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface); +static void shared_fibocom_init (MMSharedFibocomInterface *iface); G_DEFINE_TYPE_EXTENDED (MMBroadbandModemFibocom, mm_broadband_modem_fibocom, MM_TYPE_BROADBAND_MODEM, 0, G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM, iface_modem_init) - G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP, iface_modem_3gpp_init) G_IMPLEMENT_INTERFACE (MM_TYPE_SHARED_FIBOCOM, shared_fibocom_init) - G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_3GPP_PROFILE_MANAGER, iface_modem_3gpp_profile_manager_init) G_IMPLEMENT_INTERFACE (MM_TYPE_IFACE_MODEM_FIRMWARE, iface_modem_firmware_init)) typedef enum { @@ -47,9 +39,7 @@ typedef enum { } FeatureSupport; struct _MMBroadbandModemFibocomPrivate { - FeatureSupport gtrndis_support; - FeatureSupport initial_eps_bearer_support; - gint initial_eps_bearer_cid; + FeatureSupport gtrndis_support; }; /*****************************************************************************/ @@ -227,273 +217,6 @@ modem_power_off (MMIfaceModem *self, user_data); } -/*****************************************************************************/ -/* Load initial EPS bearer properties (as agreed with network) */ - -static MMBearerProperties * -modem_3gpp_load_initial_eps_bearer_finish (MMIfaceModem3gpp *self, - GAsyncResult *res, - GError **error) -{ - return MM_BEARER_PROPERTIES (g_task_propagate_pointer (G_TASK (res), error)); -} - -static void -load_initial_eps_cgcontrdp_ready (MMBaseModem *self, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - const gchar *response; - g_autofree gchar *apn = NULL; - MMBearerProperties *properties; - - response = mm_base_modem_at_command_finish (self, res, &error); - if (!response || !mm_3gpp_parse_cgcontrdp_response (response, NULL, NULL, &apn, NULL, NULL, NULL, NULL, NULL, &error)) - g_task_return_error (task, error); - else { - properties = mm_bearer_properties_new (); - mm_bearer_properties_set_apn (properties, apn); - g_task_return_pointer (task, properties, g_object_unref); - } - - g_object_unref (task); -} - -static void -modem_3gpp_load_initial_eps_bearer (MMIfaceModem3gpp *_self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); - GTask *task; - g_autofree gchar *cmd = NULL; - - task = g_task_new (self, NULL, callback, user_data); - - if (self->priv->initial_eps_bearer_support != FEATURE_SUPPORTED) { - g_task_return_new_error (task, - MM_CORE_ERROR, - MM_CORE_ERROR_UNSUPPORTED, - "Initial EPS bearer context ID unknown"); - g_object_unref (task); - return; - } - - g_assert (self->priv->initial_eps_bearer_cid >= 0); - cmd = g_strdup_printf ("+CGCONTRDP=%d", self->priv->initial_eps_bearer_cid); - - mm_base_modem_at_command (MM_BASE_MODEM (self), - cmd, - 3, - FALSE, - (GAsyncReadyCallback) load_initial_eps_cgcontrdp_ready, - task); -} - -/*****************************************************************************/ -/* Load initial EPS bearer settings (currently configured in modem) */ - -static MMBearerProperties * -modem_3gpp_load_initial_eps_bearer_settings_finish (MMIfaceModem3gpp *self, - GAsyncResult *res, - GError **error) -{ - return MM_BEARER_PROPERTIES (g_task_propagate_pointer (G_TASK (res), error)); -} - -static void -load_initial_eps_bearer_get_profile_ready (MMIfaceModem3gppProfileManager *self, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - g_autoptr(MM3gppProfile) profile = NULL; - MMBearerProperties *properties; - - profile = mm_iface_modem_3gpp_profile_manager_get_profile_finish (self, res, &error); - if (!profile) { - g_task_return_error (task, error); - g_object_unref (task); - return; - } - - properties = mm_bearer_properties_new_from_profile (profile, &error); - if (!properties) - g_task_return_error (task, error); - else - g_task_return_pointer (task, properties, g_object_unref); - g_object_unref (task); -} - -static void -modem_3gpp_load_initial_eps_bearer_settings (MMIfaceModem3gpp *_self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); - GTask *task; - - task = g_task_new (self, NULL, callback, user_data); - - /* Initial EPS bearer CID initialization run once only */ - if (G_UNLIKELY (self->priv->initial_eps_bearer_support == FEATURE_SUPPORT_UNKNOWN)) { - MMPortSerialAt *port; - MMKernelDevice *device; - - /* There doesn't seem to be a programmatic way to find the initial EPS - * bearer's CID, so we'll use a udev variable. */ - port = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)); - if (!port) { - g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't check initial EPS cid support: primary port missing"); - g_object_unref (task); - return; - } - - device = mm_port_peek_kernel_device (MM_PORT (port)); - if (mm_kernel_device_has_global_property (device, "ID_MM_FIBOCOM_INITIAL_EPS_CID")) { - self->priv->initial_eps_bearer_support = FEATURE_SUPPORTED; - self->priv->initial_eps_bearer_cid = mm_kernel_device_get_global_property_as_int ( - device, "ID_MM_FIBOCOM_INITIAL_EPS_CID"); - } else - self->priv->initial_eps_bearer_support = FEATURE_NOT_SUPPORTED; - - } - - if (self->priv->initial_eps_bearer_support != FEATURE_SUPPORTED) { - g_task_return_new_error (task, - MM_CORE_ERROR, - MM_CORE_ERROR_UNSUPPORTED, - "Initial EPS bearer context ID unknown"); - g_object_unref (task); - return; - } - - g_assert (self->priv->initial_eps_bearer_cid >= 0); - mm_iface_modem_3gpp_profile_manager_get_profile ( - MM_IFACE_MODEM_3GPP_PROFILE_MANAGER (self), - self->priv->initial_eps_bearer_cid, - (GAsyncReadyCallback) load_initial_eps_bearer_get_profile_ready, - task); -} - -/*****************************************************************************/ -/* Set initial EPS bearer settings */ - -static gboolean -modem_3gpp_set_initial_eps_bearer_settings_finish (MMIfaceModem3gpp *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -set_initial_eps_bearer_modify_profile_ready (MMIfaceModem3gppProfileManager *self, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - g_autoptr(MM3gppProfile) stored = NULL; - - stored = mm_iface_modem_3gpp_profile_manager_set_profile_finish (self, res, &error); - if (!stored) - g_task_return_error (task, error); - else - g_task_return_boolean (task, TRUE); - g_object_unref (task); -} - -static void -modem_3gpp_set_initial_eps_bearer_settings (MMIfaceModem3gpp *_self, - MMBearerProperties *properties, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); - GTask *task; - MMBearerIpFamily ip_family; - MM3gppProfile *profile; - - task = g_task_new (self, NULL, callback, user_data); - - if (self->priv->initial_eps_bearer_support != FEATURE_SUPPORTED) { - g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, - "Initial EPS bearer context ID unknown"); - g_object_unref (task); - return; - } - - profile = mm_bearer_properties_peek_3gpp_profile (properties); - g_assert (self->priv->initial_eps_bearer_cid >= 0); - mm_3gpp_profile_set_profile_id (profile, self->priv->initial_eps_bearer_cid); - ip_family = mm_3gpp_profile_get_ip_type (profile); - if (ip_family == MM_BEARER_IP_FAMILY_NONE || ip_family == MM_BEARER_IP_FAMILY_ANY) - mm_3gpp_profile_set_ip_type (profile, MM_BEARER_IP_FAMILY_IPV4); - - mm_iface_modem_3gpp_profile_manager_set_profile (MM_IFACE_MODEM_3GPP_PROFILE_MANAGER (self), - profile, - "profile-id", - TRUE, - (GAsyncReadyCallback) set_initial_eps_bearer_modify_profile_ready, - task); -} - -/*****************************************************************************/ -/* Deactivate profile (3GPP profile management interface) */ - -static gboolean -modem_3gpp_profile_manager_deactivate_profile_finish (MMIfaceModem3gppProfileManager *self, - GAsyncResult *res, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (res), error); -} - -static void -profile_manager_parent_deactivate_profile_ready (MMIfaceModem3gppProfileManager *self, - GAsyncResult *res, - GTask *task) -{ - GError *error = NULL; - if (iface_modem_3gpp_profile_manager_parent->deactivate_profile_finish(self, res, &error)) - g_task_return_boolean (task, TRUE); - else - g_task_return_error (task, error); - g_object_unref (task); -} - -static void -modem_3gpp_profile_manager_deactivate_profile (MMIfaceModem3gppProfileManager *_self, - MM3gppProfile *profile, - GAsyncReadyCallback callback, - gpointer user_data) -{ - MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (_self); - GTask *task; - gint profile_id; - - task = g_task_new (self, NULL, callback, user_data); - profile_id = mm_3gpp_profile_get_profile_id (profile); - - if (self->priv->initial_eps_bearer_support == FEATURE_SUPPORTED) { - g_assert (self->priv->initial_eps_bearer_cid >= 0); - if (self->priv->initial_eps_bearer_cid == profile_id) { - mm_obj_dbg (self, "skipping profile deactivation (initial EPS bearer)"); - g_task_return_boolean (task, TRUE); - g_object_unref (task); - return; - } - } - - iface_modem_3gpp_profile_manager_parent->deactivate_profile ( - _self, - profile, - (GAsyncReadyCallback) profile_manager_parent_deactivate_profile_ready, - task); -} - /*****************************************************************************/ MMBroadbandModemFibocom * @@ -524,7 +247,6 @@ mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self) MMBroadbandModemFibocomPrivate); self->priv->gtrndis_support = FEATURE_SUPPORT_UNKNOWN; - self->priv->initial_eps_bearer_support = FEATURE_SUPPORT_UNKNOWN; } static void @@ -540,26 +262,6 @@ iface_modem_init (MMIfaceModemInterface *iface) iface->modem_power_off_finish = modem_common_power_finish; } -static void -iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface) -{ - iface->load_initial_eps_bearer = modem_3gpp_load_initial_eps_bearer; - iface->load_initial_eps_bearer_finish = modem_3gpp_load_initial_eps_bearer_finish; - iface->load_initial_eps_bearer_settings = modem_3gpp_load_initial_eps_bearer_settings; - iface->load_initial_eps_bearer_settings_finish = modem_3gpp_load_initial_eps_bearer_settings_finish; - iface->set_initial_eps_bearer_settings = modem_3gpp_set_initial_eps_bearer_settings; - iface->set_initial_eps_bearer_settings_finish = modem_3gpp_set_initial_eps_bearer_settings_finish; -} - -static void -iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface *iface) -{ - iface_modem_3gpp_profile_manager_parent = g_type_interface_peek_parent (iface); - - iface->deactivate_profile = modem_3gpp_profile_manager_deactivate_profile; - iface->deactivate_profile_finish = modem_3gpp_profile_manager_deactivate_profile_finish; -} - static void iface_modem_firmware_init (MMIfaceModemFirmwareInterface *iface) { -- cgit v1.2.3-70-g09d2