diff --git a/recipes-connectivity/modemmanager/files/0001-Use-default-PDP-ctx-4-with-LTE-and-don-t-try-to-auth.patch b/recipes-connectivity/modemmanager/files/0001-Use-default-PDP-ctx-4-with-LTE-and-don-t-try-to-auth.patch deleted file mode 100644 index 8add698..0000000 --- a/recipes-connectivity/modemmanager/files/0001-Use-default-PDP-ctx-4-with-LTE-and-don-t-try-to-auth.patch +++ /dev/null @@ -1,68 +0,0 @@ -From 66d04a3003f5974dbf1acd5b03b4fa7e50a1ccb0 Mon Sep 17 00:00:00 2001 -From: Alexandre Bard -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 - diff --git a/recipes-connectivity/modemmanager/files/0001-ublox-Add-support-for-configuration-of-initial-EPS-b.patch b/recipes-connectivity/modemmanager/files/0001-ublox-Add-support-for-configuration-of-initial-EPS-b.patch new file mode 100644 index 0000000..0116c4e --- /dev/null +++ b/recipes-connectivity/modemmanager/files/0001-ublox-Add-support-for-configuration-of-initial-EPS-b.patch @@ -0,0 +1,115 @@ +From 12a4f1b2ebf65f8fc58d5707d940f5cabd3a76d4 Mon Sep 17 00:00:00 2001 +From: Alexandre Bard +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 + diff --git a/recipes-connectivity/modemmanager/files/0002-ublox-ignore-uauth-failure-on-default-PDP-context.patch b/recipes-connectivity/modemmanager/files/0002-ublox-ignore-uauth-failure-on-default-PDP-context.patch new file mode 100644 index 0000000..4f29abe --- /dev/null +++ b/recipes-connectivity/modemmanager/files/0002-ublox-ignore-uauth-failure-on-default-PDP-context.patch @@ -0,0 +1,43 @@ +From f30f4848562366204e539312f5fbdf133c55451c Mon Sep 17 00:00:00 2001 +From: Alexandre Bard +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 + diff --git a/recipes-connectivity/modemmanager/files/0003-broadband-modem-Choose-default-context-over-others-w.patch b/recipes-connectivity/modemmanager/files/0003-broadband-modem-Choose-default-context-over-others-w.patch new file mode 100644 index 0000000..9a53865 --- /dev/null +++ b/recipes-connectivity/modemmanager/files/0003-broadband-modem-Choose-default-context-over-others-w.patch @@ -0,0 +1,84 @@ +From 33b8d7208a266e83427c490fe4e605b741b98fc8 Mon Sep 17 00:00:00 2001 +From: Alexandre Bard +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 + diff --git a/recipes-connectivity/modemmanager/files/0004-broadband-modem-Handle-reconnect-requests.patch b/recipes-connectivity/modemmanager/files/0004-broadband-modem-Handle-reconnect-requests.patch new file mode 100644 index 0000000..4486a9c --- /dev/null +++ b/recipes-connectivity/modemmanager/files/0004-broadband-modem-Handle-reconnect-requests.patch @@ -0,0 +1,77 @@ +From ca52ad3f25a16ef9d52b1b5226309aca807067dd Mon Sep 17 00:00:00 2001 +From: Alexandre Bard +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 + diff --git a/recipes-connectivity/modemmanager/modemmanager_%.bbappend b/recipes-connectivity/modemmanager/modemmanager_%.bbappend index af774cf..b5937c9 100644 --- a/recipes-connectivity/modemmanager/modemmanager_%.bbappend +++ b/recipes-connectivity/modemmanager/modemmanager_%.bbappend @@ -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 \ "