merge: branch 'main'

wwan: Improve support for oFono

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2339
This commit is contained in:
Muhammad 2026-02-19 15:21:58 +00:00
commit 77eb8e7de3
7 changed files with 717 additions and 163 deletions

View file

@ -29,7 +29,7 @@ global:
nm_modem_manager_name_owner_ref;
nm_modem_manager_name_owner_unref;
nm_modem_owns_port;
nm_modem_set_mm_enabled;
nm_modem_set_enabled;
nm_modem_stage3_ip_config_start;
nm_modem_state_to_string;
nm_modem_unclaim;

View file

@ -277,7 +277,7 @@ modem_state_cb(NMModem *modem, int new_state_i, int old_state_i, gpointer user_d
* to NetworkManager (eg something using MM's D-Bus API directly).
*/
if (!NM_MODEM_GET_CLASS(priv->modem)->set_mm_enabled) {
if (!NM_MODEM_GET_CLASS(priv->modem)->set_enabled) {
/* We cannot re-enable this modem, thus device becomes unavailable. */
nm_device_state_changed(device,
NM_DEVICE_STATE_UNAVAILABLE,
@ -307,7 +307,7 @@ modem_state_cb(NMModem *modem, int new_state_i, int old_state_i, gpointer user_d
/* If the modem is now unlocked, enable/disable it according to the
* device's enabled/disabled state.
*/
nm_modem_set_mm_enabled(priv->modem, priv->rf_enabled);
nm_modem_set_enabled(priv->modem, priv->rf_enabled);
if (dev_state == NM_DEVICE_STATE_NEED_AUTH) {
/* The modem was unlocked externally to NetworkManager,
@ -327,6 +327,23 @@ modem_state_cb(NMModem *modem, int new_state_i, int old_state_i, gpointer user_d
NM_DEVICE_STATE_REASON_MODEM_FAILED);
}
static void
caps_changed_cb(NMModem *modem, guint modem_caps, guint current_caps, gpointer user_data)
{
NMDeviceModem *self = NM_DEVICE_MODEM(user_data);
NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
if (priv->caps != modem_caps) {
priv->caps = modem_caps;
_notify(self, PROP_CAPABILITIES);
}
if (priv->current_caps != current_caps) {
priv->current_caps = current_caps;
_notify(self, PROP_CURRENT_CAPABILITIES);
}
}
static void
modem_removed_cb(NMModem *modem, gpointer user_data)
{
@ -450,7 +467,7 @@ check_connection_available(NMDevice *device,
return FALSE;
}
if (!NM_MODEM_GET_CLASS(priv->modem)->set_mm_enabled && state <= NM_MODEM_STATE_DISABLING) {
if (!NM_MODEM_GET_CLASS(priv->modem)->set_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");
@ -616,7 +633,7 @@ set_enabled(NMDevice *device, gboolean enabled)
if (priv->modem) {
/* Sync the ModemManager modem enabled/disabled with rfkill/user preference */
nm_modem_set_mm_enabled(priv->modem, enabled);
nm_modem_set_enabled(priv->modem, enabled);
}
if (enabled == FALSE) {
@ -644,7 +661,7 @@ 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)
if (!NM_MODEM_GET_CLASS(priv->modem)->set_enabled && modem_state <= NM_MODEM_STATE_DISABLING)
return FALSE;
return TRUE;
@ -677,6 +694,7 @@ set_modem(NMDeviceModem *self, NMModem *modem)
g_signal_connect(modem, NM_MODEM_AUTH_REQUESTED, G_CALLBACK(modem_auth_requested), self);
g_signal_connect(modem, NM_MODEM_AUTH_RESULT, G_CALLBACK(modem_auth_result), self);
g_signal_connect(modem, NM_MODEM_STATE_CHANGED, G_CALLBACK(modem_state_cb), self);
g_signal_connect(modem, NM_MODEM_CAPABILITIES_CHANGED, G_CALLBACK(caps_changed_cb), self);
g_signal_connect(modem, NM_MODEM_REMOVED, G_CALLBACK(modem_removed_cb), self);
g_signal_connect(modem,

View file

@ -1698,7 +1698,7 @@ nm_modem_broadband_class_init(NMModemBroadbandClass *klass)
modem_class->stage3_ip_config_start = stage3_ip_config_start;
modem_class->disconnect = disconnect;
modem_class->deactivate_cleanup = deactivate_cleanup;
modem_class->set_mm_enabled = set_mm_enabled;
modem_class->set_enabled = set_mm_enabled;
modem_class->get_user_pass = get_user_pass;
modem_class->check_connection_compatible_with_modem = check_connection_compatible_with_modem;
modem_class->complete_connection = complete_connection;

File diff suppressed because it is too large Load diff

View file

@ -25,6 +25,7 @@
#define OFONO_DBUS_INTERFACE_CONNECTION_MANAGER "org.ofono.ConnectionManager"
#define OFONO_DBUS_INTERFACE_CONNECTION_CONTEXT "org.ofono.ConnectionContext"
#define OFONO_DBUS_INTERFACE_SIM_MANAGER "org.ofono.SimManager"
#define OFONO_DBUS_INTERFACE_RADIO_SETTINGS "org.ofono.RadioSettings"
#define OFONO_ERROR_IN_PROGRESS "org.ofono.Error.InProgress"

View file

@ -51,6 +51,7 @@ enum {
AUTH_RESULT,
REMOVED,
STATE_CHANGED,
CAPABILITIES_CHANGED,
LAST_SIGNAL,
};
@ -338,6 +339,14 @@ nm_modem_set_state(NMModem *self, NMModemState new_state, const char *reason)
}
}
void
nm_modem_set_capabilities(NMModem *self,
NMDeviceModemCapabilities modem_caps,
NMDeviceModemCapabilities current_caps)
{
g_signal_emit(self, signals[CAPABILITIES_CHANGED], 0, (guint) modem_caps, (guint) current_caps);
}
void
nm_modem_set_prev_state(NMModem *self, const char *reason)
{
@ -349,13 +358,13 @@ nm_modem_set_prev_state(NMModem *self, const char *reason)
}
void
nm_modem_set_mm_enabled(NMModem *self, gboolean enabled)
nm_modem_set_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) {
/* Not all modem classes support set_enabled */
if (!NM_MODEM_GET_CLASS(self)->set_enabled) {
_LOGD("cannot enable modem: not implemented");
return;
}
@ -382,7 +391,7 @@ nm_modem_set_mm_enabled(NMModem *self, gboolean enabled)
return;
}
NM_MODEM_GET_CLASS(self)->set_mm_enabled(self, enabled);
NM_MODEM_GET_CLASS(self)->set_enabled(self, enabled);
/* Pre-empt the state change signal */
nm_modem_set_state(self,
@ -2004,4 +2013,16 @@ nm_modem_class_init(NMModemClass *klass)
2,
G_TYPE_INT,
G_TYPE_INT);
signals[CAPABILITIES_CHANGED] = g_signal_new(NM_MODEM_CAPABILITIES_CHANGED,
G_OBJECT_CLASS_TYPE(object_class),
G_SIGNAL_RUN_FIRST,
0,
NULL,
NULL,
NULL,
G_TYPE_NONE,
2,
G_TYPE_UINT,
G_TYPE_UINT);
}

View file

@ -33,14 +33,15 @@
#define NM_MODEM_DEVICE_UID "device-uid"
/* Signals */
#define NM_MODEM_PPP_STATS "ppp-stats"
#define NM_MODEM_PPP_FAILED "ppp-failed"
#define NM_MODEM_PREPARE_RESULT "prepare-result"
#define NM_MODEM_NEW_CONFIG "new-config"
#define NM_MODEM_AUTH_REQUESTED "auth-requested"
#define NM_MODEM_AUTH_RESULT "auth-result"
#define NM_MODEM_REMOVED "removed"
#define NM_MODEM_STATE_CHANGED "state-changed"
#define NM_MODEM_PPP_STATS "ppp-stats"
#define NM_MODEM_PPP_FAILED "ppp-failed"
#define NM_MODEM_PREPARE_RESULT "prepare-result"
#define NM_MODEM_NEW_CONFIG "new-config"
#define NM_MODEM_AUTH_REQUESTED "auth-requested"
#define NM_MODEM_AUTH_RESULT "auth-result"
#define NM_MODEM_REMOVED "removed"
#define NM_MODEM_STATE_CHANGED "state-changed"
#define NM_MODEM_CAPABILITIES_CHANGED "capabilities-changed"
typedef enum {
NM_MODEM_IP_METHOD_UNKNOWN = 0,
@ -126,7 +127,7 @@ typedef struct {
void (*stage3_ip_config_start)(NMModem *self, int addr_family, NMModemIPMethod method);
void (*set_mm_enabled)(NMModem *self, gboolean enabled);
void (*set_enabled)(NMModem *self, gboolean enabled);
void (*disconnect)(NMModem *self,
gboolean warn,
@ -208,13 +209,17 @@ void nm_modem_deactivate_async(NMModem *self,
void
nm_modem_device_state_changed(NMModem *modem, NMDeviceState new_state, NMDeviceState old_state);
void nm_modem_set_mm_enabled(NMModem *self, gboolean enabled);
void nm_modem_set_enabled(NMModem *self, gboolean enabled);
NMModemState nm_modem_get_state(NMModem *self);
void nm_modem_set_state(NMModem *self, NMModemState new_state, const char *reason);
void nm_modem_set_prev_state(NMModem *self, const char *reason);
const char *nm_modem_state_to_string(NMModemState state);
void nm_modem_set_capabilities(NMModem *self,
NMDeviceModemCapabilities modem_caps,
NMDeviceModemCapabilities current_caps);
NMModemIPType nm_modem_get_supported_ip_types(NMModem *self);
/* For the modem-manager only */