summary refs log tree commit diff
path: root/src/core/devices/wwan/nm-device-modem.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2022-02-14 19:23:28 +0100
committerMichael Biebl <biebl@debian.org>2022-02-14 19:23:28 +0100
commit2f94dba7385fd0e0ef19a06eb4a2fcf6c43d7946 (patch)
treee2222f5577115985dd52044d2991253403cdd952 /src/core/devices/wwan/nm-device-modem.c
parent88c227d90a6b7b388c5c85d72802a0ca8f05ed5c (diff)
New upstream version 1.35.91 upstream/1.35.91
Diffstat (limited to 'src/core/devices/wwan/nm-device-modem.c')
-rw-r--r--src/core/devices/wwan/nm-device-modem.c296
1 files changed, 110 insertions, 186 deletions
diff --git a/src/core/devices/wwan/nm-device-modem.c b/src/core/devices/wwan/nm-device-modem.c
index 1b285469..ef802a44 100644
--- a/src/core/devices/wwan/nm-device-modem.c
+++ b/src/core/devices/wwan/nm-device-modem.c
@@ -8,7 +8,7 @@
 #include "nm-device-modem.h"
 
 #include "nm-modem.h"
-#include "nm-ip4-config.h"
+#include "nm-l3-config-data.h"
 #include "devices/nm-device-private.h"
 #include "nm-rfkill-manager.h"
 #include "settings/nm-settings-connection.h"
@@ -30,14 +30,16 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMDeviceModem,
                              PROP_APN, );
 
 typedef struct {
-    NMModem *                 modem;
+    NMModem                  *modem;
     NMDeviceModemCapabilities caps;
     NMDeviceModemCapabilities current_caps;
-    char *                    device_id;
-    char *                    operator_code;
-    char *                    apn;
+    NMUtilsIPv6IfaceId        iid;
+    char                     *device_id;
+    char                     *operator_code;
+    char                     *apn;
     bool                      rf_enabled : 1;
     NMDeviceStageState        stage1_state : 3;
+    NMDeviceStageState        stage2_state : 3;
 } NMDeviceModemPrivate;
 
 struct _NMDeviceModem {
@@ -59,52 +61,18 @@ G_DEFINE_TYPE(NMDeviceModem, nm_device_modem, NM_TYPE_DEVICE)
 static void
 ppp_failed(NMModem *modem, guint i_reason, gpointer user_data)
 {
-    NMDevice *          device = NM_DEVICE(user_data);
-    NMDeviceModem *     self   = NM_DEVICE_MODEM(user_data);
+    NMDevice           *device = NM_DEVICE(user_data);
     NMDeviceStateReason reason = i_reason;
 
-    switch (nm_device_get_state(device)) {
-    case NM_DEVICE_STATE_PREPARE:
-    case NM_DEVICE_STATE_CONFIG:
-    case NM_DEVICE_STATE_NEED_AUTH:
-        nm_device_state_changed(device, NM_DEVICE_STATE_FAILED, reason);
-        break;
-    case NM_DEVICE_STATE_IP_CONFIG:
-    case NM_DEVICE_STATE_IP_CHECK:
-    case NM_DEVICE_STATE_SECONDARIES:
-    case NM_DEVICE_STATE_ACTIVATED:
-        if (nm_device_activate_ip4_state_in_conf(device))
-            nm_device_activate_schedule_ip_config_timeout(device, AF_INET);
-        else if (nm_device_activate_ip6_state_in_conf(device))
-            nm_device_activate_schedule_ip_config_timeout(device, AF_INET6);
-        else if (nm_device_activate_ip4_state_done(device)) {
-            nm_device_ip_method_failed(device,
-                                       AF_INET,
-                                       NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        } else if (nm_device_activate_ip6_state_done(device)) {
-            nm_device_ip_method_failed(device,
-                                       AF_INET6,
-                                       NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        } else {
-            _LOGW(LOGD_MB,
-                  "PPP failure in unexpected state %u",
-                  (guint) nm_device_get_state(device));
-            nm_device_state_changed(device,
-                                    NM_DEVICE_STATE_FAILED,
-                                    NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        }
-        break;
-    default:
-        break;
-    }
+    nm_device_state_changed(device, NM_DEVICE_STATE_FAILED, reason);
 }
 
 static void
 modem_prepare_result(NMModem *modem, gboolean success, guint i_reason, gpointer user_data)
 {
-    NMDeviceModem *       self   = NM_DEVICE_MODEM(user_data);
+    NMDeviceModem        *self   = NM_DEVICE_MODEM(user_data);
     NMDeviceModemPrivate *priv   = NM_DEVICE_MODEM_GET_PRIVATE(self);
-    NMDevice *            device = NM_DEVICE(self);
+    NMDevice             *device = NM_DEVICE(self);
     NMDeviceStateReason   reason = i_reason;
 
     if (nm_device_get_state(device) != NM_DEVICE_STATE_PREPARE
@@ -173,7 +141,7 @@ modem_auth_requested(NMModem *modem, gpointer user_data)
 static void
 modem_auth_result(NMModem *modem, GError *error, gpointer user_data)
 {
-    NMDevice *            device = NM_DEVICE(user_data);
+    NMDevice             *device = NM_DEVICE(user_data);
     NMDeviceModemPrivate *priv   = NM_DEVICE_MODEM_GET_PRIVATE(device);
 
     g_return_if_fail(nm_device_get_state(device) == NM_DEVICE_STATE_NEED_AUTH);
@@ -188,102 +156,50 @@ modem_auth_result(NMModem *modem, GError *error, gpointer user_data)
 }
 
 static void
-modem_ip4_config_result(NMModem *modem, NMIP4Config *config, GError *error, gpointer user_data)
-{
-    NMDeviceModem *self   = NM_DEVICE_MODEM(user_data);
-    NMDevice *     device = NM_DEVICE(self);
-
-    if (!nm_device_activate_ip4_state_in_conf(device)) {
-        _LOGD(LOGD_MB | LOGD_IP4,
-              "retrieving IPv4 configuration while no longer in state IPv4 conf");
+modem_new_config(NMModem                  *modem,
+                 int                       addr_family,
+                 const NML3ConfigData     *l3cd,
+                 gboolean                  do_auto,
+                 const NMUtilsIPv6IfaceId *iid,
+                 int                       failure_reason_i,
+                 GError                   *error,
+                 gpointer                  user_data)
+{
+    const int             IS_IPv4 = NM_IS_IPv4(addr_family);
+    NMDeviceModem        *self    = NM_DEVICE_MODEM(user_data);
+    NMDeviceModemPrivate *priv    = NM_DEVICE_MODEM_GET_PRIVATE(self);
+    NMDevice             *device  = NM_DEVICE(self);
+
+    if (nm_device_devip_get_state(device, addr_family) != NM_DEVICE_IP_STATE_PENDING) {
+        _LOGD(LOGD_MB, "retrieving IP configuration while no longer in pending state");
         return;
     }
 
     if (error) {
-        _LOGW(LOGD_MB | LOGD_IP4, "retrieving IPv4 configuration failed: %s", error->message);
-        nm_device_ip_method_failed(device, AF_INET, NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        return;
-    }
-
-    nm_device_set_dev2_ip_config(device, AF_INET, NM_IP_CONFIG_CAST(config));
-    nm_device_activate_schedule_ip_config_result(device, AF_INET, NULL);
-}
-
-static void
-modem_ip6_config_result(NMModem *    modem,
-                        NMIP6Config *config,
-                        gboolean     do_slaac,
-                        GError *     error,
-                        gpointer     user_data)
-{
-    NMDeviceModem *     self   = NM_DEVICE_MODEM(user_data);
-    NMDevice *          device = NM_DEVICE(self);
-    NMActStageReturn    ret;
-    NMDeviceStateReason failure_reason      = NM_DEVICE_STATE_REASON_NONE;
-    gs_unref_object NMIP6Config *ignored    = NULL;
-    gboolean                     got_config = !!config;
-
-    if (!nm_device_activate_ip6_state_in_conf(device)) {
-        _LOGD(LOGD_MB | LOGD_IP6,
-              "retrieving IPv6 configuration while no longer in state IPv6 conf");
+        _LOGW(LOGD_MB, "retrieving IP configuration failed: %s", error->message);
+        nm_device_devip_set_failed(device, addr_family, failure_reason_i);
         return;
     }
 
-    if (error) {
-        _LOGW(LOGD_MB | LOGD_IP6, "retrieving IPv6 configuration failed: %s", error->message);
-        nm_device_ip_method_failed(device, AF_INET6, NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        return;
-    }
+    if (!IS_IPv4)
+        priv->iid = iid ? *iid : ((NMUtilsIPv6IfaceId) NM_UTILS_IPV6_IFACE_ID_INIT);
 
-    /* Re-enable IPv6 on the interface */
-    nm_device_sysctl_ip_conf_set(device, AF_INET6, "disable_ipv6", "0");
-
-    if (config)
-        nm_device_set_dev2_ip_config(device, AF_INET6, NM_IP_CONFIG_CAST(config));
-
-    if (do_slaac == FALSE) {
-        if (got_config)
-            nm_device_activate_schedule_ip_config_result(device, AF_INET6, NULL);
-        else {
-            _LOGW(LOGD_MB | LOGD_IP6,
-                  "retrieving IPv6 configuration failed: SLAAC not requested and no addresses");
-            nm_device_ip_method_failed(device,
-                                       AF_INET6,
-                                       NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE);
-        }
-        return;
+    if (do_auto) {
+        if (IS_IPv4)
+            nm_device_ip_method_dhcp4_start(device);
+        else
+            nm_device_ip_method_autoconf6_start(device);
     }
 
-    /* Start SLAAC now that we have a link-local address from the modem */
-    ret =
-        NM_DEVICE_CLASS(nm_device_modem_parent_class)
-            ->act_stage3_ip_config_start(device, AF_INET6, (gpointer *) &ignored, &failure_reason);
-
-    nm_assert(ignored == NULL);
-
-    switch (ret) {
-    case NM_ACT_STAGE_RETURN_FAILURE:
-        nm_device_ip_method_failed(device, AF_INET6, failure_reason);
-        break;
-    case NM_ACT_STAGE_RETURN_IP_FAIL:
-        /* all done */
-        nm_device_activate_schedule_ip_config_result(device, AF_INET6, NULL);
-        break;
-    case NM_ACT_STAGE_RETURN_POSTPONE:
-        /* let SLAAC run */
-        break;
-    default:
-        /* Should never get here since we've assured that the IPv6 method
-         * will either be "auto" or "ignored" when starting IPv6 configuration.
-         */
-        nm_assert_not_reached();
-    }
+    nm_device_devip_set_state(device, addr_family, NM_DEVICE_IP_STATE_READY, l3cd);
 }
 
 static void
 ip_ifindex_changed_cb(NMModem *modem, GParamSpec *pspec, gpointer user_data)
 {
-    NMDevice *device = NM_DEVICE(user_data);
+    NMDevice             *device = NM_DEVICE(user_data);
+    NMDeviceModem        *self   = NM_DEVICE_MODEM(device);
+    NMDeviceModemPrivate *priv   = NM_DEVICE_MODEM_GET_PRIVATE(self);
 
     if (!nm_device_is_activating(device))
         return;
@@ -300,14 +216,19 @@ ip_ifindex_changed_cb(NMModem *modem, GParamSpec *pspec, gpointer user_data)
      * RA handling code to run before NM is ready.
      */
     nm_device_sysctl_ip_conf_set(device, AF_INET6, "disable_ipv6", "1");
+
+    if (priv->stage2_state == NM_DEVICE_STAGE_STATE_PENDING) {
+        priv->stage2_state = NM_DEVICE_STAGE_STATE_COMPLETED;
+        nm_device_activate_schedule_stage2_device_config(device, FALSE);
+    }
 }
 
 static void
 operator_code_changed_cb(NMModem *modem, GParamSpec *pspec, gpointer user_data)
 {
-    NMDeviceModem *       self          = NM_DEVICE_MODEM(user_data);
+    NMDeviceModem        *self          = NM_DEVICE_MODEM(user_data);
     NMDeviceModemPrivate *priv          = NM_DEVICE_MODEM_GET_PRIVATE(self);
-    const char *          operator_code = nm_modem_get_operator_code(modem);
+    const char           *operator_code = nm_modem_get_operator_code(modem);
 
     if (g_strcmp0(priv->operator_code, operator_code) != 0) {
         g_free(priv->operator_code);
@@ -319,9 +240,9 @@ operator_code_changed_cb(NMModem *modem, GParamSpec *pspec, gpointer user_data)
 static void
 apn_changed_cb(NMModem *modem, GParamSpec *pspec, gpointer user_data)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(user_data);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(user_data);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
-    const char *          apn  = nm_modem_get_apn(modem);
+    const char           *apn  = nm_modem_get_apn(modem);
 
     if (g_strcmp0(priv->apn, apn) != 0) {
         g_free(priv->apn);
@@ -341,7 +262,7 @@ modem_state_cb(NMModem *modem, int new_state_i, int old_state_i, gpointer user_d
 {
     NMModemState          new_state = new_state_i;
     NMModemState          old_state = old_state_i;
-    NMDevice *            device    = NM_DEVICE(user_data);
+    NMDevice             *device    = NM_DEVICE(user_data);
     NMDeviceModemPrivate *priv      = NM_DEVICE_MODEM_GET_PRIVATE(device);
     NMDeviceState         dev_state = nm_device_get_state(device);
 
@@ -413,12 +334,12 @@ owns_iface(NMDevice *device, const char *iface)
 /*****************************************************************************/
 
 static void
-device_state_changed(NMDevice *          device,
+device_state_changed(NMDevice           *device,
                      NMDeviceState       new_state,
                      NMDeviceState       old_state,
                      NMDeviceStateReason reason)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(device);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(device);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
 
     g_return_if_fail(priv->modem);
@@ -480,13 +401,13 @@ check_connection_compatible(NMDevice *device, NMConnection *connection, GError *
 }
 
 static gboolean
-check_connection_available(NMDevice *                     device,
-                           NMConnection *                 connection,
+check_connection_available(NMDevice                      *device,
+                           NMConnection                  *connection,
                            NMDeviceCheckConAvailableFlags flags,
-                           const char *                   specific_object,
-                           GError **                      error)
+                           const char                    *specific_object,
+                           GError                       **error)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(device);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(device);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
     NMModemState          state;
 
@@ -525,11 +446,11 @@ check_connection_available(NMDevice *                     device,
 }
 
 static gboolean
-complete_connection(NMDevice *           device,
-                    NMConnection *       connection,
-                    const char *         specific_object,
+complete_connection(NMDevice            *device,
+                    NMConnection        *connection,
+                    const char          *specific_object,
                     NMConnection *const *existing_connections,
-                    GError **            error)
+                    GError             **error)
 {
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
 
@@ -547,6 +468,7 @@ deactivate(NMDevice *device)
 
     nm_modem_deactivate(priv->modem, device);
     priv->stage1_state = NM_DEVICE_STAGE_STATE_INIT;
+    priv->stage2_state = NM_DEVICE_STAGE_STATE_INIT;
 }
 
 /*****************************************************************************/
@@ -554,7 +476,7 @@ deactivate(NMDevice *device)
 static void
 modem_deactivate_async_cb(NMModem *modem, GError *error, gpointer user_data)
 {
-    gs_unref_object NMDevice * self = NULL;
+    gs_unref_object NMDevice  *self = NULL;
     NMDeviceDeactivateCallback callback;
     gpointer                   callback_user_data;
 
@@ -563,8 +485,8 @@ modem_deactivate_async_cb(NMModem *modem, GError *error, gpointer user_data)
 }
 
 static void
-deactivate_async(NMDevice *                 self,
-                 GCancellable *             cancellable,
+deactivate_async(NMDevice                  *self,
+                 GCancellable              *cancellable,
                  NMDeviceDeactivateCallback callback,
                  gpointer                   user_data)
 {
@@ -584,7 +506,7 @@ static NMActStageReturn
 act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
 {
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
-    NMActRequest *        req;
+    NMActRequest         *req;
 
     req = nm_device_get_act_request(device);
     g_return_val_if_fail(req, NM_ACT_STAGE_RETURN_FAILURE);
@@ -606,51 +528,44 @@ act_stage1_prepare(NMDevice *device, NMDeviceStateReason *out_failure_reason)
 static NMActStageReturn
 act_stage2_config(NMDevice *device, NMDeviceStateReason *out_failure_reason)
 {
-    nm_modem_act_stage2_config(NM_DEVICE_MODEM_GET_PRIVATE(device)->modem);
-    return NM_ACT_STAGE_RETURN_SUCCESS;
-}
-
-static NMActStageReturn
-act_stage3_ip_config_start(NMDevice *           device,
-                           int                  addr_family,
-                           gpointer *           out_config,
-                           NMDeviceStateReason *out_failure_reason)
-{
-    NMDeviceModemPrivate *priv    = NM_DEVICE_MODEM_GET_PRIVATE(device);
-    gboolean              autoip4 = FALSE;
-    NMActStageReturn      ret;
-
-    if (!NM_IS_IPv4(addr_family))
-        return nm_modem_stage3_ip6_config_start(priv->modem, device, out_failure_reason);
-
-    ret = nm_modem_stage3_ip4_config_start(priv->modem, device, &autoip4, out_failure_reason);
+    NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
 
-    if (ret != NM_ACT_STAGE_RETURN_SUCCESS || !autoip4)
-        return ret;
+    if (priv->stage2_state == NM_DEVICE_STAGE_STATE_INIT) {
+        priv->stage2_state = NM_DEVICE_STAGE_STATE_PENDING;
+        return nm_modem_act_stage2_config(NM_DEVICE_MODEM_GET_PRIVATE(device)->modem,
+                                          device,
+                                          out_failure_reason);
+    }
+    if (priv->stage2_state == NM_DEVICE_STAGE_STATE_PENDING)
+        return NM_ACT_STAGE_RETURN_POSTPONE;
 
-    return NM_DEVICE_CLASS(nm_device_modem_parent_class)
-        ->act_stage3_ip_config_start(device, addr_family, out_config, out_failure_reason);
+    nm_assert(priv->stage2_state == NM_DEVICE_STAGE_STATE_COMPLETED);
+    return NM_ACT_STAGE_RETURN_SUCCESS;
 }
 
 static void
-ip4_config_pre_commit(NMDevice *device, NMIP4Config *config)
+act_stage3_ip_config(NMDevice *device, int addr_family)
 {
-    nm_modem_ip4_pre_commit(NM_DEVICE_MODEM_GET_PRIVATE(device)->modem, device, config);
+    NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(device);
+
+    if (nm_modem_stage3_ip_config_start(priv->modem, addr_family, device))
+        nm_device_devip_set_state(device, addr_family, NM_DEVICE_IP_STATE_PENDING, NULL);
 }
 
 static gboolean
 get_ip_iface_identifier(NMDevice *device, NMUtilsIPv6IfaceId *out_iid)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(device);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(device);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
-    gboolean              success;
 
     g_return_val_if_fail(priv->modem, FALSE);
-    success = nm_modem_get_iid(priv->modem, out_iid);
-    if (!success)
-        success =
-            NM_DEVICE_CLASS(nm_device_modem_parent_class)->get_ip_iface_identifier(device, out_iid);
-    return success;
+
+    if (priv->iid.id != 0) {
+        *out_iid = priv->iid;
+        return TRUE;
+    }
+
+    return NM_DEVICE_CLASS(nm_device_modem_parent_class)->get_ip_iface_identifier(device, out_iid);
 }
 
 /*****************************************************************************/
@@ -667,7 +582,7 @@ get_enabled(NMDevice *device)
 static void
 set_enabled(NMDevice *device, gboolean enabled)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(device);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(device);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
 
     /* Called only by the Manager in response to rfkill switch changes or
@@ -688,7 +603,7 @@ set_enabled(NMDevice *device, gboolean enabled)
 static gboolean
 is_available(NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
 {
-    NMDeviceModem *       self = NM_DEVICE_MODEM(device);
+    NMDeviceModem        *self = NM_DEVICE_MODEM(device);
     NMDeviceModemPrivate *priv = NM_DEVICE_MODEM_GET_PRIVATE(self);
     NMModemState          modem_state;
 
@@ -703,6 +618,16 @@ is_available(NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
     return TRUE;
 }
 
+static gboolean
+ready_for_ip_config(NMDevice *device)
+{
+    /* Tell NMDevice to only run device-specific IP
+     * configuration (devip) and skip other methods
+     * (manual, dhcp, etc).
+     */
+    return FALSE;
+}
+
 /*****************************************************************************/
 
 static void
@@ -716,8 +641,7 @@ set_modem(NMDeviceModem *self, NMModem *modem)
 
     g_signal_connect(modem, NM_MODEM_PPP_FAILED, G_CALLBACK(ppp_failed), self);
     g_signal_connect(modem, NM_MODEM_PREPARE_RESULT, G_CALLBACK(modem_prepare_result), self);
-    g_signal_connect(modem, NM_MODEM_IP4_CONFIG_RESULT, G_CALLBACK(modem_ip4_config_result), self);
-    g_signal_connect(modem, NM_MODEM_IP6_CONFIG_RESULT, G_CALLBACK(modem_ip6_config_result), self);
+    g_signal_connect(modem, NM_MODEM_NEW_CONFIG, G_CALLBACK(modem_new_config), self);
     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);
@@ -838,9 +762,9 @@ nm_device_modem_new(NMModem *modem)
                         NM_DEVICE_MODEM_MODEM,
                         modem,
                         NM_DEVICE_MODEM_CAPABILITIES,
-                        caps,
+                        (guint) ((guint32) caps),
                         NM_DEVICE_MODEM_CURRENT_CAPABILITIES,
-                        current_caps,
+                        (guint) ((guint32) current_caps),
                         NM_DEVICE_MODEM_DEVICE_ID,
                         nm_modem_get_device_id(modem),
                         NULL);
@@ -885,9 +809,9 @@ static const NMDBusInterfaceInfoExtended interface_info_device_modem = {
 static void
 nm_device_modem_class_init(NMDeviceModemClass *klass)
 {
-    GObjectClass *     object_class      = G_OBJECT_CLASS(klass);
+    GObjectClass      *object_class      = G_OBJECT_CLASS(klass);
     NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS(klass);
-    NMDeviceClass *    device_class      = NM_DEVICE_CLASS(klass);
+    NMDeviceClass     *device_class      = NM_DEVICE_CLASS(klass);
 
     object_class->dispose      = dispose;
     object_class->get_property = get_property;
@@ -904,8 +828,7 @@ nm_device_modem_class_init(NMDeviceModemClass *klass)
     device_class->deactivate                  = deactivate;
     device_class->act_stage1_prepare          = act_stage1_prepare;
     device_class->act_stage2_config           = act_stage2_config;
-    device_class->act_stage3_ip_config_start  = act_stage3_ip_config_start;
-    device_class->ip4_config_pre_commit       = ip4_config_pre_commit;
+    device_class->act_stage3_ip_config        = act_stage3_ip_config;
     device_class->get_enabled                 = get_enabled;
     device_class->set_enabled                 = set_enabled;
     device_class->owns_iface                  = owns_iface;
@@ -913,6 +836,7 @@ nm_device_modem_class_init(NMDeviceModemClass *klass)
     device_class->get_ip_iface_identifier     = get_ip_iface_identifier;
     device_class->get_configured_mtu          = nm_modem_get_configured_mtu;
     device_class->get_dhcp_timeout_for_device = get_dhcp_timeout_for_device;
+    device_class->ready_for_ip_config         = ready_for_ip_config;
 
     device_class->state_changed = device_state_changed;