Thomas Haller 2022-11-10 07:55:02 +01:00
commit 7f22835328
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 594 additions and 145 deletions

View file

@ -273,6 +273,15 @@ modem_state_cb(NMModem *modem, int new_state_i, int old_state_i, gpointer user_d
/* Called when the ModemManager modem enabled state is changed externally
* to NetworkManager (eg something using MM's D-Bus API directly).
*/
if (!NM_MODEM_GET_CLASS(priv->modem)->set_mm_enabled) {
/* We cannot re-enable this modem, thus device becomes unavailable. */
nm_device_state_changed(device,
NM_DEVICE_STATE_UNAVAILABLE,
NM_DEVICE_STATE_REASON_USER_REQUESTED);
return;
}
if (nm_device_is_activating(device) || dev_state == NM_DEVICE_STATE_ACTIVATED) {
/* user-initiated action, hence DISCONNECTED not FAILED */
nm_device_state_changed(device,
@ -435,6 +444,13 @@ check_connection_available(NMDevice *device,
return FALSE;
}
if (!NM_MODEM_GET_CLASS(priv->modem)->set_mm_enabled && state <= NM_MODEM_STATE_DISABLING) {
nm_utils_error_set_literal(error,
NM_UTILS_ERROR_CONNECTION_AVAILABLE_TEMPORARY,
"modem is disabled and NM cannot enable it");
return FALSE;
}
if (state == NM_MODEM_STATE_LOCKED) {
if (!nm_connection_get_setting_gsm(connection)) {
nm_utils_error_set_literal(error,
@ -599,6 +615,11 @@ set_enabled(NMDevice *device, gboolean enabled)
if (enabled == FALSE) {
nm_device_state_changed(device, NM_DEVICE_STATE_UNAVAILABLE, NM_DEVICE_STATE_REASON_NONE);
} else {
/* It's possible that the modem is enabled outside of NM. Need to recheck. */
nm_device_queue_recheck_available(device,
NM_DEVICE_STATE_REASON_MODEM_AVAILABLE,
NM_DEVICE_STATE_REASON_MODEM_FAILED);
}
}
@ -617,6 +638,9 @@ is_available(NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
if (modem_state <= NM_MODEM_STATE_INITIALIZING)
return FALSE;
if (!NM_MODEM_GET_CLASS(priv->modem)->set_mm_enabled && modem_state <= NM_MODEM_STATE_DISABLING)
return FALSE;
return TRUE;
}

File diff suppressed because it is too large Load diff

View file

@ -353,6 +353,12 @@ nm_modem_set_mm_enabled(NMModem *self, gboolean enabled)
NMModemPrivate *priv = NM_MODEM_GET_PRIVATE(self);
NMModemState prev_state = priv->state;
/* Not all modem classes support set_mm_enabled */
if (!NM_MODEM_GET_CLASS(self)->set_mm_enabled) {
_LOGD("cannot enable modem: not implemented");
return;
}
if (enabled && priv->state >= NM_MODEM_STATE_ENABLING) {
_LOGD("cannot enable modem: already enabled");
return;
@ -375,9 +381,7 @@ nm_modem_set_mm_enabled(NMModem *self, gboolean enabled)
return;
}
/* Not all modem classes support set_mm_enabled */
if (NM_MODEM_GET_CLASS(self)->set_mm_enabled)
NM_MODEM_GET_CLASS(self)->set_mm_enabled(self, enabled);
NM_MODEM_GET_CLASS(self)->set_mm_enabled(self, enabled);
/* Pre-empt the state change signal */
nm_modem_set_state(self,