From 52d08008b72c4738527716118b98feb826778ad6 Mon Sep 17 00:00:00 2001 From: Mary Strodl Date: Thu, 4 Sep 2025 14:04:24 -0400 Subject: [PATCH] wwan: retry after no operator code We've had a few rare instances where a modem stopped retrying to autoconnect because it briefly didn't have an operator code. This isn't a permanent failure, so we shouldn't abort completely for it. --- NEWS | 2 ++ src/core/devices/nm-device-utils.c | 4 +++- src/core/devices/wwan/nm-modem-broadband.c | 8 +++++--- src/libnm-core-public/nm-dbus-interface.h | 3 +++ src/libnmc-base/nm-client-utils.c | 2 ++ 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index ecfd4cf4ac..c2fe8c32d1 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,8 @@ USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! * Fix a bug that makes broadband connections auto-connect getting blocked if the connection tries to reconnect when modem status is "disconnecting" / "disconnected". +* Treat modem connection not having an operator code available + as a recoverable error. ============================================= NetworkManager-1.54 diff --git a/src/core/devices/nm-device-utils.c b/src/core/devices/nm-device-utils.c index a78499fb22..3b4c6b2b63 100644 --- a/src/core/devices/nm-device-utils.c +++ b/src/core/devices/nm-device-utils.c @@ -143,7 +143,9 @@ NM_UTILS_LOOKUP_STR_DEFINE( NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_STATE_REASON_UNMANAGED_USER_SETTINGS, "unmanaged-user-settings"), NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_STATE_REASON_UNMANAGED_USER_UDEV, "unmanaged-user-udev"), - NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_STATE_REASON_NETWORKING_OFF, "networking-off"), ); + NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_STATE_REASON_NETWORKING_OFF, "networking-off"), + NM_UTILS_LOOKUP_STR_ITEM(NM_DEVICE_STATE_REASON_MODEM_NO_OPERATOR_CODE, + "modem-no-operator-code"), ); NM_UTILS_LOOKUP_STR_DEFINE(nm_device_mtu_source_to_string, NMDeviceMtuSource, diff --git a/src/core/devices/wwan/nm-modem-broadband.c b/src/core/devices/wwan/nm-modem-broadband.c index 6fee5030b7..4bd0a45c51 100644 --- a/src/core/devices/wwan/nm-modem-broadband.c +++ b/src/core/devices/wwan/nm-modem-broadband.c @@ -508,8 +508,9 @@ find_gsm_apn_cb(const char *apn, static gboolean try_create_connect_properties(NMModemBroadband *self) { - NMModemBroadbandPrivate *priv = NM_MODEM_BROADBAND_GET_PRIVATE(self); - ConnectContext *ctx = priv->ctx; + NMModemBroadbandPrivate *priv = NM_MODEM_BROADBAND_GET_PRIVATE(self); + ConnectContext *ctx = priv->ctx; + NMDeviceStateReason fail_reason = NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED; if (MODEM_CAPS_3GPP(ctx->caps)) { NMSettingGsm *s_gsm = nm_connection_get_setting_gsm(ctx->connection); @@ -530,6 +531,7 @@ try_create_connect_properties(NMModemBroadband *self) if (!network_id) { _LOGW("failed to connect '%s': unable to determine the network id", nm_connection_get_id(ctx->connection)); + fail_reason = NM_DEVICE_STATE_REASON_MODEM_NO_OPERATOR_CODE; goto out; } @@ -558,7 +560,7 @@ try_create_connect_properties(NMModemBroadband *self) } out: - nm_modem_emit_prepare_result(NM_MODEM(self), FALSE, NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED); + nm_modem_emit_prepare_result(NM_MODEM(self), FALSE, fail_reason); connect_context_clear(self); return TRUE; } diff --git a/src/libnm-core-public/nm-dbus-interface.h b/src/libnm-core-public/nm-dbus-interface.h index e62d64e10f..8db76db1f4 100644 --- a/src/libnm-core-public/nm-dbus-interface.h +++ b/src/libnm-core-public/nm-dbus-interface.h @@ -648,6 +648,8 @@ typedef enum { * Since: 1.48 * @NM_DEVICE_STATE_REASON_UNMANAGED_USER_UDEV: The device is unmanaged via udev rule. Since: 1.48 * @NM_DEVICE_STATE_REASON_NETWORKING_OFF: NetworkManager was disabled (networking off). Since: 1.56 + * @NM_DEVICE_STATE_REASON_MODEM_NO_OPERATOR_CODE: The modem's operator code wasn't available, + * and auto-configuration was requested. Since: 1.56 * * Device state change reason codes */ @@ -732,6 +734,7 @@ typedef enum { NM_DEVICE_STATE_REASON_UNMANAGED_USER_SETTINGS = 76, NM_DEVICE_STATE_REASON_UNMANAGED_USER_UDEV = 77, NM_DEVICE_STATE_REASON_NETWORKING_OFF = 78, + NM_DEVICE_STATE_REASON_MODEM_NO_OPERATOR_CODE = 79, } NMDeviceStateReason; /** diff --git a/src/libnmc-base/nm-client-utils.c b/src/libnmc-base/nm-client-utils.c index a24a75b65c..10c2c295bf 100644 --- a/src/libnmc-base/nm-client-utils.c +++ b/src/libnmc-base/nm-client-utils.c @@ -493,6 +493,8 @@ NM_UTILS_LOOKUP_STR_DEFINE( N_("The device is unmanaged because it is an external device and is " "unconfigured (down or without addresses)")), NM_UTILS_LOOKUP_ITEM(NM_DEVICE_STATE_REASON_NETWORKING_OFF, N_("Networking was disabled")), + NM_UTILS_LOOKUP_ITEM(NM_DEVICE_STATE_REASON_MODEM_NO_OPERATOR_CODE, + N_("The modem didn't have an operator code")), );