modemmanager: Update patches

Allowing configuration of default bearer through modemamanger (0001)

Replacing the old dirty hack for default context by a better handling
specific to ublox devices. (0002 and 0003).

Handling reconnect requests from the modem (0004).

BugzID: 59580
This commit is contained in:
Alexandre Bard 2019-10-21 12:44:24 +02:00
parent a015e1d748
commit b43b5ad630
6 changed files with 323 additions and 69 deletions

View File

@ -1,68 +0,0 @@
From 66d04a3003f5974dbf1acd5b03b4fa7e50a1ccb0 Mon Sep 17 00:00:00 2001
From: Alexandre Bard <alexandre.bard@netmodule.com>
Date: Wed, 12 Dec 2018 15:25:11 +0100
Subject: [PATCH] Use default PDP ctx(4) with LTE and don't try to authenticate
on it
---
plugins/ublox/mm-broadband-bearer-ublox.c | 2 +-
src/mm-broadband-bearer.c | 14 +++++++++++++-
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/plugins/ublox/mm-broadband-bearer-ublox.c b/plugins/ublox/mm-broadband-bearer-ublox.c
index 1adcaa2..37338de 100644
--- a/plugins/ublox/mm-broadband-bearer-ublox.c
+++ b/plugins/ublox/mm-broadband-bearer-ublox.c
@@ -530,7 +530,7 @@ check_supported_authentication_methods (GTask *task)
/* Flag whether authentication is required. If it isn't, we won't fail
* connection attempt if the +UAUTHREQ command fails */
- ctx->auth_required = (user && password && allowed_auth != MM_BEARER_ALLOWED_AUTH_NONE);
+ ctx->auth_required = (ctx->cid != 4 && user && password && allowed_auth != MM_BEARER_ALLOWED_AUTH_NONE);
/* If we already cached the support, not do it again */
if (self->priv->allowed_auths != MM_UBLOX_BEARER_ALLOWED_AUTH_UNKNOWN) {
diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c
index 779cd9a..db570bd 100644
--- a/src/mm-broadband-bearer.c
+++ b/src/mm-broadband-bearer.c
@@ -773,6 +773,7 @@ parse_cid_range (MMBaseModem *modem,
gchar *ip_family_str;
ip_family_str = mm_bearer_ip_family_build_string_from_mask (format->pdp_type);
+ if (ctx->max_cid == 3) ctx->max_cid = 4;
if (ctx->max_cid < format->max_cid) {
cid = ctx->max_cid + 1;
mm_dbg ("Using empty CID %u with PDP type '%s'", cid, ip_family_str);
@@ -810,6 +811,7 @@ parse_pdp_list (MMBaseModem *modem,
GList *pdp_list;
GList *l;
guint cid;
+ gboolean lte_dflt_cid_detected = FALSE;
/* If cancelled, set result error */
if (g_cancellable_is_cancelled (ctx->cancellable)) {
@@ -862,9 +864,19 @@ parse_pdp_list (MMBaseModem *modem,
g_free (ip_family_str);
}
- /* Look for the exact PDP context we want */
+ /* Check if PDP context 4 is present */
for (l = pdp_list; l; l = g_list_next (l)) {
MM3gppPdpContext *pdp = l->data;
+ if(pdp->cid == 4){
+ lte_dflt_cid_detected = TRUE;
+ ctx->use_existing_cid = TRUE;
+ cid = 4;
+ break;
+ }
+ }
+ /* Look for the exact PDP context we want */
+ for (l = pdp_list; l && !lte_dflt_cid_detected; l = g_list_next (l)) {
+ MM3gppPdpContext *pdp = l->data;
if (pdp->pdp_type == ctx->ip_family) {
const gchar *apn;
--
2.1.4

View File

@ -0,0 +1,115 @@
From 12a4f1b2ebf65f8fc58d5707d940f5cabd3a76d4 Mon Sep 17 00:00:00 2001
From: Alexandre Bard <alexandre.bard@sunrise.ch>
Date: Thu, 5 Sep 2019 16:14:15 +0200
Subject: [PATCH 1/4] ublox: Add support for configuration of initial EPS
bearer
BugzID: 59579
---
plugins/ublox/mm-broadband-modem-ublox.c | 68 ++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/plugins/ublox/mm-broadband-modem-ublox.c b/plugins/ublox/mm-broadband-modem-ublox.c
index 83352fa8..475f2d5c 100644
--- a/plugins/ublox/mm-broadband-modem-ublox.c
+++ b/plugins/ublox/mm-broadband-modem-ublox.c
@@ -34,14 +34,17 @@
#include "mm-modem-helpers-ublox.h"
#include "mm-ublox-enums-types.h"
#include "mm-call-ublox.h"
+#include "mm-bearer-properties.h"
static void iface_modem_init (MMIfaceModem *iface);
+static void iface_modem_3gpp_init (MMIfaceModem3gpp *iface);
static void iface_modem_voice_init (MMIfaceModemVoice *iface);
static MMIfaceModemVoice *iface_modem_voice_parent;
G_DEFINE_TYPE_EXTENDED (MMBroadbandModemUblox, mm_broadband_modem_ublox, 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_IFACE_MODEM_VOICE, iface_modem_voice_init))
typedef enum {
@@ -674,6 +677,64 @@ common_modem_power_operation (MMBroadbandModemUblox *self,
task);
}
+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
+modem_3gpp_set_initial_eps_bearer_settings_ready (MMBaseModem *_self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ //MMBroadbandModemUblox *self = MM_BROADBAND_MODEM_UBLOX (_self);
+ GError *error = NULL;
+
+ if (!mm_base_modem_at_command_full_finish (_self, res, &error))
+ 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 *config,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ gchar *command;
+ const gchar *ucgdflt_cmd = "+UCGDFLT=0,\"%s\",\"%s\",0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,%s,%s,%s,\"\"";
+ const gchar *apn = mm_bearer_properties_get_apn (config);
+ MMBearerIpFamily ipfamily = mm_bearer_properties_get_ip_type(config);
+ const gchar *ip_family_str = ipfamily ? mm_bearer_ip_family_build_string_from_mask (ipfamily) : "IP";
+ const gchar *user = mm_bearer_properties_get_user (config);
+ const gchar *password = mm_bearer_properties_get_password (config);
+ const gchar *auth = user ? "1" : "0";
+
+ user = user ? user : "";
+ password = password ? password : "";
+ user = apn ? apn : "";
+
+ task = g_task_new (self, NULL, callback, user_data);
+ g_task_set_task_data (task, g_object_ref (config), g_object_unref);
+
+ command = g_strdup_printf (ucgdflt_cmd, ip_family_str, apn, auth, user, password);
+ mm_base_modem_at_command (
+ MM_BASE_MODEM (self),
+ command,
+ 120,
+ FALSE,
+ (GAsyncReadyCallback) modem_3gpp_set_initial_eps_bearer_settings_ready,
+ task);
+ g_free (command);
+}
+
static void
modem_reset (MMIfaceModem *self,
GAsyncReadyCallback callback,
@@ -1256,6 +1317,13 @@ iface_modem_init (MMIfaceModem *iface)
iface->set_current_bands_finish = common_set_current_modes_bands_finish;
}
+static void
+iface_modem_3gpp_init (MMIfaceModem3gpp *iface)
+{
+ 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_voice_init (MMIfaceModemVoice *iface)
{
--
2.20.1

View File

@ -0,0 +1,43 @@
From f30f4848562366204e539312f5fbdf133c55451c Mon Sep 17 00:00:00 2001
From: Alexandre Bard <alexandre.bard@netmodule.com>
Date: Mon, 14 Oct 2019 17:33:38 +0200
Subject: [PATCH 2/4] ublox: ignore uauth failure on default PDP context
Default PDP context has to be configured using UCGDFLT and therefor
trying to use UAUTHREQ on this context lead to an unknown error,
which is used to identify this case (since no other option seems available).
In case there is really another problem leading to this error or
the default context has not been configured properly, an error will
be thrown later, when trying to connect.
BugzID: 59579
---
plugins/ublox/mm-broadband-bearer-ublox.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/plugins/ublox/mm-broadband-bearer-ublox.c b/plugins/ublox/mm-broadband-bearer-ublox.c
index 10d29818..808c23d8 100644
--- a/plugins/ublox/mm-broadband-bearer-ublox.c
+++ b/plugins/ublox/mm-broadband-bearer-ublox.c
@@ -463,8 +463,16 @@ uauthreq_ready (MMBaseModem *modem,
CommonConnectContext *ctx;
ctx = (CommonConnectContext *) g_task_get_task_data (task);
+
+ // ignore unkown error thrown when trying to authenticate on default ctx
+ if (error && g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_UNKNOWN)) {
+ mm_dbg ("u-blox: uauthreq failed with unkown error: \n"
+ " likely to be because of trying to authenticate on default context: ignore");
+ }
/* If authentication required and the +UAUTHREQ failed, abort */
- if (ctx->auth_required) {
+ else if (ctx->auth_required) {
g_task_return_error (task, error);
g_object_unref (task);
return;
--
2.20.1

View File

@ -0,0 +1,84 @@
From 33b8d7208a266e83427c490fe4e605b741b98fc8 Mon Sep 17 00:00:00 2001
From: Alexandre Bard <alexandre.bard@netmodule.com>
Date: Wed, 16 Oct 2019 17:30:34 +0200
Subject: [PATCH 3/4] broadband-modem: Choose default context over others when
possible
With ublox modems, the default context can be active and already
having an address. In this case trying to activate another context
will likely fail.
To avoid this failure, the default context is identified during
contexts lookup by checking if an IP address has been assigned.
BugzID: 59579
---
src/mm-broadband-bearer.c | 7 ++++---
src/mm-modem-helpers.c | 10 ++++++++++
src/mm-modem-helpers.h | 1 +
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c
index 16acb2b1..94f636b6 100644
--- a/src/mm-broadband-bearer.c
+++ b/src/mm-broadband-bearer.c
@@ -869,12 +869,13 @@ parse_pdp_list (MMBaseModem *modem,
cid = pdp->cid;
ctx->use_existing_cid = TRUE;
g_free (ip_family_str);
- /* In this case, stop searching */
- break;
+ /* In case the context has no address, try to find a better one */
+ if (pdp->has_address)
+ break;
}
/* PDP with no APN set? we may use that one if not exact match found */
- if (!pdp->apn || !pdp->apn[0]) {
+ if (cid == 0 && (!pdp->apn || !pdp->apn[0])) {
mm_dbg ("Found PDP context with CID %u and no APN",
pdp->cid);
cid = pdp->cid;
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index cf008d73..a3b5727a 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -1535,6 +1535,7 @@ mm_3gpp_parse_cgdcont_read_response (const gchar *reply,
mm_dbg ("Ignoring PDP context type: '%s'", str);
else {
MM3gppPdpContext *pdp;
+ gchar * ip_str;
pdp = g_slice_new0 (MM3gppPdpContext);
if (!mm_get_uint_from_match_info (match_info, 1, &pdp->cid)) {
@@ -1547,6 +1548,15 @@ mm_3gpp_parse_cgdcont_read_response (const gchar *reply,
pdp->pdp_type = ip_family;
pdp->apn = mm_get_string_unquoted_from_match_info (match_info, 3);
+ ip_str = mm_get_string_unquoted_from_match_info (match_info, 4);
+ if (ip_str) {
+ pdp->has_address = strlen(ip_str) > 0;
+ g_free(ip_str);
+ }
+ else {
+ pdp->has_address = FALSE;
+ }
+
list = g_list_prepend (list, pdp);
}
diff --git a/src/mm-modem-helpers.h b/src/mm-modem-helpers.h
index 237046ad..a0c7a3a2 100644
--- a/src/mm-modem-helpers.h
+++ b/src/mm-modem-helpers.h
@@ -173,6 +173,7 @@ typedef struct {
guint cid;
MMBearerIpFamily pdp_type;
gchar *apn;
+ gboolean has_address;
} MM3gppPdpContext;
void mm_3gpp_pdp_context_list_free (GList *pdp_list);
GList *mm_3gpp_parse_cgdcont_read_response (const gchar *reply,
--
2.20.1

View File

@ -0,0 +1,77 @@
From ca52ad3f25a16ef9d52b1b5226309aca807067dd Mon Sep 17 00:00:00 2001
From: Alexandre Bard <alexandre.bard@netmodule.com>
Date: Wed, 9 Oct 2019 14:47:11 +0200
Subject: [PATCH 4/4] broadband-modem: Handle reconnect requests
BugzID: 59455
---
src/mm-broadband-modem.c | 43 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index c1535596..a48f2e7c 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -2709,6 +2709,47 @@ bearer_list_report_disconnections (MMBroadbandModem *self,
g_object_unref (list);
}
+static void
+bearer_connect (MMBaseBearer *bearer,
+ gpointer user_data)
+{
+ guint cid;
+
+ cid = GPOINTER_TO_UINT (user_data);
+
+ /* If we're told to connect a single context and this is not the
+ * bearer associated to that context, ignore operation */
+ if (cid > 0 &&
+ MM_IS_BROADBAND_BEARER (bearer) &&
+ mm_broadband_bearer_get_3gpp_cid (MM_BROADBAND_BEARER (bearer)) != cid)
+ return;
+
+ /* If already connected, ignore operation */
+ if (mm_base_bearer_get_status (bearer) == MM_BEARER_STATUS_CONNECTED)
+ return;
+
+ /* Try to connct */
+ mm_base_bearer_connect (bearer, NULL, NULL);
+}
+
+static void
+bearer_list_connect (MMBroadbandModem *self,
+ guint cid)
+{
+ MMBearerList *list = NULL;
+
+ g_object_get (self,
+ MM_IFACE_MODEM_BEARER_LIST, &list,
+ NULL);
+
+ /* If empty bearer list, nothing else to do */
+ if (!list)
+ return;
+
+ mm_bearer_list_foreach (list, (MMBearerListForeachFunc)bearer_connect, GUINT_TO_POINTER (cid));
+ g_object_unref (list);
+}
+
static void
cgev_process_detach (MMBroadbandModem *self,
MM3gppCgev type)
@@ -2744,9 +2785,11 @@ cgev_process_primary (MMBroadbandModem *self,
switch (type) {
case MM_3GPP_CGEV_NW_ACT_PRIMARY:
mm_info ("network request to activate context (cid %u)", cid);
+ bearer_list_connect(self, cid);
break;
case MM_3GPP_CGEV_ME_ACT_PRIMARY:
mm_info ("mobile equipment request to activate context (cid %u)", cid);
+ bearer_list_connect(self, cid);
break;
case MM_3GPP_CGEV_NW_DEACT_PRIMARY:
mm_info ("network request to deactivate context (cid %u)", cid);
--
2.20.1

View File

@ -1,5 +1,8 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI_append = " \
${@bb.utils.contains('MACHINE_FEATURES', 'toby-l2', 'file://0001-Use-default-PDP-ctx-4-with-LTE-and-don-t-try-to-auth.patch', '', d)} \
file://0001-ublox-Add-support-for-configuration-of-initial-EPS-b.patch \
file://0002-ublox-ignore-uauth-failure-on-default-PDP-context.patch \
file://0003-broadband-modem-Choose-default-context-over-others-w.patch \
file://0004-broadband-modem-Handle-reconnect-requests.patch \
"