aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-iface-modem-3gpp.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c
index 2dde1efb..58694e35 100644
--- a/src/mm-iface-modem-3gpp.c
+++ b/src/mm-iface-modem-3gpp.c
@@ -18,6 +18,8 @@
#include "mm-iface-modem.h"
#include "mm-iface-modem-3gpp.h"
+#include "mm-bearer-3gpp.h"
+#include "mm-bearer-list.h"
#include "mm-base-modem.h"
#include "mm-modem-helpers.h"
#include "mm-log.h"
@@ -407,6 +409,56 @@ mm_iface_modem_3gpp_run_all_registration_checks (MMIfaceModem3gpp *self,
STR_REPLY_READY_FN (operator_code, "Operator Code")
STR_REPLY_READY_FN (operator_name, "Operator Name")
+static void
+set_bearer_3gpp_connection_allowed (MMBearer *bearer)
+{
+ if (MM_IS_BEARER_3GPP (bearer))
+ mm_bearer_set_connection_allowed (bearer);
+}
+
+static void
+bearer_3gpp_connection_allowed (MMIfaceModem3gpp *self)
+{
+ MMBearerList *bearer_list = NULL;
+
+ g_object_get (self,
+ MM_IFACE_MODEM_BEARER_LIST, &bearer_list,
+ NULL);
+ if (!bearer_list)
+ return;
+
+ /* Once registered, allow 3GPP bearers to get connected */
+ mm_bearer_list_foreach (bearer_list,
+ (MMBearerListForeachFunc)set_bearer_3gpp_connection_allowed,
+ NULL);
+ g_object_unref (bearer_list);
+}
+
+static void
+set_bearer_3gpp_connection_forbidden (MMBearer *bearer)
+{
+ if (MM_IS_BEARER_3GPP (bearer))
+ mm_bearer_set_connection_forbidden (bearer);
+}
+
+static void
+bearer_3gpp_connection_forbidden (MMIfaceModem3gpp *self)
+{
+ MMBearerList *bearer_list = NULL;
+
+ g_object_get (self,
+ MM_IFACE_MODEM_BEARER_LIST, &bearer_list,
+ NULL);
+ if (!bearer_list)
+ return;
+
+ /* Ensure all 3GPP bearers get disconnected and set connection forbidden */
+ mm_bearer_list_foreach (bearer_list,
+ (MMBearerListForeachFunc)set_bearer_3gpp_connection_forbidden,
+ NULL);
+ g_object_unref (bearer_list);
+}
+
void
mm_iface_modem_3gpp_update_registration_state (MMIfaceModem3gpp *self,
MMModem3gppRegistrationState new_state)
@@ -447,6 +499,9 @@ mm_iface_modem_3gpp_update_registration_state (MMIfaceModem3gpp *self,
switch (new_state) {
case MM_MODEM_3GPP_REGISTRATION_STATE_HOME:
case MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING:
+ /* Allow connection in 3GPP bearers */
+ bearer_3gpp_connection_allowed (self);
+
/* Launch operator code update */
if (MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_operator_code &&
MM_IFACE_MODEM_3GPP_GET_INTERFACE (self)->load_operator_code_finish)
@@ -470,6 +525,7 @@ mm_iface_modem_3gpp_update_registration_state (MMIfaceModem3gpp *self,
MM_MODEM_STATE_REASON_NONE);
break;
case MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING:
+ bearer_3gpp_connection_forbidden (self);
mm_iface_modem_update_state (MM_IFACE_MODEM (self),
MM_MODEM_STATE_SEARCHING,
MM_MODEM_STATE_REASON_NONE);
@@ -477,6 +533,7 @@ mm_iface_modem_3gpp_update_registration_state (MMIfaceModem3gpp *self,
case MM_MODEM_3GPP_REGISTRATION_STATE_IDLE:
case MM_MODEM_3GPP_REGISTRATION_STATE_DENIED:
case MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN:
+ bearer_3gpp_connection_forbidden (self);
mm_iface_modem_update_state (MM_IFACE_MODEM (self),
MM_MODEM_STATE_ENABLED,
MM_MODEM_STATE_REASON_NONE);