summary refs log tree commit diff
path: root/src/devices/wwan/nm-modem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/wwan/nm-modem.c')
-rw-r--r--src/devices/wwan/nm-modem.c478
1 files changed, 233 insertions, 245 deletions
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index 459d212a..04c95a2b 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -28,19 +28,20 @@
 #include <termios.h>
 
 #include "nm-core-internal.h"
-#include "nm-platform.h"
+#include "platform/nm-platform.h"
 #include "nm-setting-connection.h"
 #include "NetworkManagerUtils.h"
-#include "nm-device-private.h"
-#include "nm-modem-enum-types.h"
+#include "devices/nm-device-private.h"
 #include "nm-route-manager.h"
+#include "nm-act-request.h"
+#include "nm-ip4-config.h"
+#include "nm-ip6-config.h"
+#include "ppp/nm-ppp-manager-call.h"
+#include "ppp/nm-ppp-status.h"
 
-G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
-
-#define NM_MODEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MODEM, NMModemPrivate))
+/*****************************************************************************/
 
-enum {
-	PROP_0,
+NM_GOBJECT_PROPERTIES_DEFINE (NMModem,
 	PROP_CONTROL_PORT,
 	PROP_DATA_PORT,
 	PROP_PATH,
@@ -54,11 +55,24 @@ enum {
 	PROP_SIM_ID,
 	PROP_IP_TYPES,
 	PROP_SIM_OPERATOR_ID,
+);
 
-	LAST_PROP
+enum {
+	PPP_STATS,
+	PPP_FAILED,
+	PREPARE_RESULT,
+	IP4_CONFIG_RESULT,
+	IP6_CONFIG_RESULT,
+	AUTH_REQUESTED,
+	AUTH_RESULT,
+	REMOVED,
+	STATE_CHANGED,
+	LAST_SIGNAL,
 };
 
-typedef struct {
+static guint signals[LAST_SIGNAL] = { 0 };
+
+typedef struct _NMModemPrivate {
 	char *uid;
 	char *path;
 	char *driver;
@@ -88,22 +102,9 @@ typedef struct {
 	guint32 out_bytes;
 } NMModemPrivate;
 
-enum {
-	PPP_STATS,
-	PPP_FAILED,
-	PREPARE_RESULT,
-	IP4_CONFIG_RESULT,
-	IP6_CONFIG_RESULT,
-	AUTH_REQUESTED,
-	AUTH_RESULT,
-	REMOVED,
-	STATE_CHANGED,
-
-	LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
+G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
 
+#define NM_MODEM_GET_PRIVATE(self) _NM_GET_PRIVATE_PTR (self, NMModem, NM_IS_MODEM)
 
 /*****************************************************************************/
 /* State/enabled/connected */
@@ -156,8 +157,8 @@ nm_modem_set_state (NMModem *self,
 		             reason ? reason : "none");
 
 		priv->state = new_state;
-		g_object_notify (G_OBJECT (self), NM_MODEM_STATE);
-		g_signal_emit (self, signals[STATE_CHANGED], 0, new_state, old_state, reason);
+		_notify (self, PROP_STATE);
+		g_signal_emit (self, signals[STATE_CHANGED], 0, (int) new_state, (int) old_state, reason);
 	}
 }
 
@@ -399,7 +400,7 @@ set_data_port (NMModem *self, const char *new_data_port)
 	if (g_strcmp0 (priv->data_port, new_data_port) != 0) {
 		g_free (priv->data_port);
 		priv->data_port = g_strdup (new_data_port);
-		g_object_notify (G_OBJECT (self), NM_MODEM_DATA_PORT);
+		_notify (self, PROP_DATA_PORT);
 	}
 }
 
@@ -558,18 +559,20 @@ ppp_stage3_ip_config_start (NMModem *self,
 	if (port_speed_is_zero (priv->data_port))
 		baud_override = 57600;
 
-	priv->ppp_manager = nm_ppp_manager_new (priv->data_port);
-	if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, ip_timeout, baud_override, &error)) {
-		g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED,
+	priv->ppp_manager = nm_ppp_manager_create (priv->data_port, &error);
+	if (   priv->ppp_manager
+	    && nm_ppp_manager_start (priv->ppp_manager, req, ppp_name,
+	                             ip_timeout, baud_override, &error)) {
+		g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_SIGNAL_STATE_CHANGED,
 		                  G_CALLBACK (ppp_state_changed),
 		                  self);
-		g_signal_connect (priv->ppp_manager, "ip4-config",
+		g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_SIGNAL_IP4_CONFIG,
 		                  G_CALLBACK (ppp_ip4_config),
 		                  self);
-		g_signal_connect (priv->ppp_manager, "ip6-config",
+		g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_SIGNAL_IP6_CONFIG,
 		                  G_CALLBACK (ppp_ip6_config),
 		                  self);
-		g_signal_connect (priv->ppp_manager, "stats",
+		g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_SIGNAL_STATS,
 		                  G_CALLBACK (ppp_stats),
 		                  self);
 
@@ -580,7 +583,7 @@ ppp_stage3_ip_config_start (NMModem *self,
 		            error->message);
 		g_error_free (error);
 
-		nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+		g_clear_object (&priv->ppp_manager);
 
 		*reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED;
 		ret = NM_ACT_STAGE_RETURN_FAILURE;
@@ -618,7 +621,7 @@ nm_modem_stage3_ip4_config_start (NMModem *self,
 
 	/* Only Disabled and Auto methods make sense for WWAN */
 	if (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_DISABLED) == 0)
-		return NM_ACT_STAGE_RETURN_STOP;
+		return NM_ACT_STAGE_RETURN_SUCCESS;
 
 	if (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) != 0) {
 		nm_log_warn (LOGD_MB | LOGD_IP4,
@@ -643,7 +646,7 @@ nm_modem_stage3_ip4_config_start (NMModem *self,
 		break;
 	default:
 		nm_log_info (LOGD_MB, "(%s): IPv4 configuration disabled", nm_modem_get_uid (self));
-		ret = NM_ACT_STAGE_RETURN_STOP;
+		ret = NM_ACT_STAGE_RETURN_IP_FAIL;
 		break;
 	}
 
@@ -737,7 +740,7 @@ nm_modem_stage3_ip6_config_start (NMModem *self,
 
 	/* Only Ignore and Auto methods make sense for WWAN */
 	if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_IGNORE) == 0)
-		return NM_ACT_STAGE_RETURN_STOP;
+		return NM_ACT_STAGE_RETURN_IP_DONE;
 
 	if (strcmp (method, NM_SETTING_IP6_CONFIG_METHOD_AUTO) != 0) {
 		nm_log_warn (LOGD_MB | LOGD_IP6,
@@ -762,7 +765,7 @@ nm_modem_stage3_ip6_config_start (NMModem *self,
 		break;
 	default:
 		nm_log_info (LOGD_MB, "(%s): IPv6 configuration disabled", nm_modem_get_uid (self));
-		ret = NM_ACT_STAGE_RETURN_STOP;
+		ret = NM_ACT_STAGE_RETURN_IP_FAIL;
 		break;
 	}
 
@@ -817,6 +820,7 @@ nm_modem_get_secrets (NMModem *self,
 	if (request_new)
 		flags |= NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW;
 	priv->secrets_id = nm_act_request_get_secrets (priv->act_request,
+	                                               FALSE,
 	                                               setting_name,
 	                                               flags,
 	                                               hint,
@@ -867,6 +871,7 @@ nm_modem_act_stage1_prepare (NMModem *self,
 		flags |= NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW;
 
 	priv->secrets_id = nm_act_request_get_secrets (req,
+	                                               FALSE,
 	                                               setting_name,
 	                                               flags,
 	                                               hints ? g_ptr_array_index (hints, 0) : NULL,
@@ -1000,7 +1005,7 @@ deactivate_cleanup (NMModem *self, NMDevice *device)
 
 	priv->in_bytes = priv->out_bytes = 0;
 
-	nm_exported_object_clear_and_unexport (&priv->ppp_manager);
+	g_clear_object (&priv->ppp_manager);
 
 	if (device) {
 		g_return_if_fail (NM_IS_DEVICE (device));
@@ -1136,10 +1141,10 @@ deactivate_step (DeactivateContext *ctx)
 	case DEACTIVATE_CONTEXT_STEP_PPP_MANAGER_STOP:
 		/* If we have a PPP manager, stop it */
 		if (ctx->ppp_manager) {
-			nm_ppp_manager_stop (ctx->ppp_manager,
-			                     ctx->cancellable,
-			                     (GAsyncReadyCallback) ppp_manager_stop_ready,
-			                     ctx);
+			nm_ppp_manager_stop_async (ctx->ppp_manager,
+			                           ctx->cancellable,
+			                           (GAsyncReadyCallback) ppp_manager_stop_ready,
+			                           ctx);
 			return;
 		}
 		ctx->step++;
@@ -1334,48 +1339,10 @@ nm_modem_get_capabilities (NMModem *self,
 /*****************************************************************************/
 
 static void
-nm_modem_init (NMModem *self)
-{
-}
-
-static GObject*
-constructor (GType type,
-             guint n_construct_params,
-             GObjectConstructParam *construct_params)
-{
-	GObject *object;
-	NMModemPrivate *priv;
-
-	object = G_OBJECT_CLASS (nm_modem_parent_class)->constructor (type,
-	                                                              n_construct_params,
-	                                                              construct_params);
-	if (!object)
-		return NULL;
-
-	priv = NM_MODEM_GET_PRIVATE (object);
-
-	if (!priv->data_port && !priv->control_port) {
-		nm_log_err (LOGD_PLATFORM, "neither modem command nor data interface provided");
-		goto err;
-	}
-
-	if (!priv->path) {
-		nm_log_err (LOGD_PLATFORM, "D-Bus path not provided");
-		goto err;
-	}
-
-	return object;
-
-err:
-	g_object_unref (object);
-	return NULL;
-}
-
-static void
 get_property (GObject *object, guint prop_id,
               GValue *value, GParamSpec *pspec)
 {
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE ((NMModem *) object);
 
 	switch (prop_id) {
 	case PROP_PATH:
@@ -1403,7 +1370,7 @@ get_property (GObject *object, guint prop_id,
 		g_value_set_uint (value, priv->mm_ip_timeout);
 		break;
 	case PROP_STATE:
-		g_value_set_enum (value, priv->state);
+		g_value_set_int (value, priv->state);
 		break;
 	case PROP_DEVICE_ID:
 		g_value_set_string (value, priv->device_id);
@@ -1427,7 +1394,7 @@ static void
 set_property (GObject *object, guint prop_id,
               const GValue *value, GParamSpec *pspec)
 {
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE ((NMModem *) object);
 	const char *s;
 
 	switch (prop_id) {
@@ -1440,9 +1407,11 @@ set_property (GObject *object, guint prop_id,
 		priv->driver = g_value_dup_string (value);
 		break;
 	case PROP_CONTROL_PORT:
+		/* Construct only */
 		priv->control_port = g_value_dup_string (value);
 		break;
 	case PROP_DATA_PORT:
+		g_free (priv->data_port);
 		priv->data_port = g_value_dup_string (value);
 		break;
 	case PROP_UID:
@@ -1459,10 +1428,11 @@ set_property (GObject *object, guint prop_id,
 		priv->mm_ip_timeout = g_value_get_uint (value);
 		break;
 	case PROP_STATE:
-		priv->state = g_value_get_enum (value);
+		/* construct-only */
+		priv->state = g_value_get_int (value);
 		break;
 	case PROP_DEVICE_ID:
-		/* construct only */
+		/* construct-only */
 		priv->device_id = g_value_dup_string (value);
 		break;
 	case PROP_SIM_ID:
@@ -1484,10 +1454,53 @@ set_property (GObject *object, guint prop_id,
 	}
 }
 
+/*****************************************************************************/
+
+static void
+nm_modem_init (NMModem *self)
+{
+	self->_priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NM_TYPE_MODEM, NMModemPrivate);
+}
+
+static GObject*
+constructor (GType type,
+             guint n_construct_params,
+             GObjectConstructParam *construct_params)
+{
+	GObject *object;
+	NMModemPrivate *priv;
+
+	object = G_OBJECT_CLASS (nm_modem_parent_class)->constructor (type,
+	                                                              n_construct_params,
+	                                                              construct_params);
+	if (!object)
+		return NULL;
+
+	priv = NM_MODEM_GET_PRIVATE ((NMModem *) object);
+
+	if (!priv->data_port && !priv->control_port) {
+		nm_log_err (LOGD_PLATFORM, "neither modem command nor data interface provided");
+		goto err;
+	}
+
+	if (!priv->path) {
+		nm_log_err (LOGD_PLATFORM, "D-Bus path not provided");
+		goto err;
+	}
+
+	return object;
+
+err:
+	g_object_unref (object);
+	return NULL;
+}
+
+/*****************************************************************************/
+
 static void
 dispose (GObject *object)
 {
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE ((NMModem *) object);
 
 	if (priv->act_request) {
 		g_object_unref (priv->act_request);
@@ -1500,7 +1513,7 @@ dispose (GObject *object)
 static void
 finalize (GObject *object)
 {
-	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object);
+	NMModemPrivate *priv = NM_MODEM_GET_PRIVATE ((NMModem *) object);
 
 	g_free (priv->uid);
 	g_free (priv->path);
@@ -1521,7 +1534,6 @@ nm_modem_class_init (NMModemClass *klass)
 
 	g_type_class_add_private (object_class, sizeof (NMModemPrivate));
 
-	/* Virtual methods */
 	object_class->constructor = constructor;
 	object_class->set_property = set_property;
 	object_class->get_property = get_property;
@@ -1532,131 +1544,113 @@ nm_modem_class_init (NMModemClass *klass)
 	klass->stage3_ip6_config_request = stage3_ip6_config_request;
 	klass->deactivate_cleanup = deactivate_cleanup;
 
-	/* Properties */
-
-	g_object_class_install_property
-		(object_class, PROP_UID,
-		 g_param_spec_string (NM_MODEM_UID, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_PATH,
-		 g_param_spec_string (NM_MODEM_PATH, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_DRIVER,
-		 g_param_spec_string (NM_MODEM_DRIVER, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_CONTROL_PORT,
-		 g_param_spec_string (NM_MODEM_CONTROL_PORT, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_DATA_PORT,
-		 g_param_spec_string (NM_MODEM_DATA_PORT, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_IP4_METHOD,
-		 g_param_spec_uint (NM_MODEM_IP4_METHOD, "", "",
-		                    NM_MODEM_IP_METHOD_UNKNOWN,
-		                    NM_MODEM_IP_METHOD_AUTO,
-		                    NM_MODEM_IP_METHOD_UNKNOWN,
-		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_IP6_METHOD,
-		 g_param_spec_uint (NM_MODEM_IP6_METHOD, "", "",
-		                    NM_MODEM_IP_METHOD_UNKNOWN,
-		                    NM_MODEM_IP_METHOD_AUTO,
-		                    NM_MODEM_IP_METHOD_UNKNOWN,
-		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_IP_TIMEOUT,
-		 g_param_spec_uint (NM_MODEM_IP_TIMEOUT, "", "",
-		                    0, 360, 20,
-		                    G_PARAM_READWRITE |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_STATE,
-		 g_param_spec_enum (NM_MODEM_STATE, "", "",
-		                    NM_TYPE_MODEM_STATE,
-		                    NM_MODEM_STATE_UNKNOWN,
-		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                    G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_DEVICE_ID,
-		 g_param_spec_string (NM_MODEM_DEVICE_ID, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_SIM_ID,
-		 g_param_spec_string (NM_MODEM_SIM_ID, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
-		                      G_PARAM_STATIC_STRINGS));
-
-	g_object_class_install_property
-		(object_class, PROP_IP_TYPES,
-		 g_param_spec_uint (NM_MODEM_IP_TYPES,
-		                    "IP Types",
-		                    "Supported IP types",
-		                    0, G_MAXUINT32, NM_MODEM_IP_TYPE_IPV4,
-		                    G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
-
-	g_object_class_install_property
-		(object_class, PROP_SIM_OPERATOR_ID,
-		 g_param_spec_string (NM_MODEM_SIM_OPERATOR_ID, "", "",
-		                      NULL,
-		                      G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
-		                      G_PARAM_STATIC_STRINGS));
-
-	/* Signals */
+	obj_properties[PROP_UID] =
+	     g_param_spec_string (NM_MODEM_UID, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_PATH] =
+	     g_param_spec_string (NM_MODEM_PATH, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_DRIVER] =
+	     g_param_spec_string (NM_MODEM_DRIVER, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_CONTROL_PORT] =
+	     g_param_spec_string (NM_MODEM_CONTROL_PORT, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_DATA_PORT] =
+	     g_param_spec_string (NM_MODEM_DATA_PORT, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_IP4_METHOD] =
+	     g_param_spec_uint (NM_MODEM_IP4_METHOD, "", "",
+	                        NM_MODEM_IP_METHOD_UNKNOWN,
+	                        NM_MODEM_IP_METHOD_AUTO,
+	                        NM_MODEM_IP_METHOD_UNKNOWN,
+	                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_IP6_METHOD] =
+	     g_param_spec_uint (NM_MODEM_IP6_METHOD, "", "",
+	                        NM_MODEM_IP_METHOD_UNKNOWN,
+	                        NM_MODEM_IP_METHOD_AUTO,
+	                        NM_MODEM_IP_METHOD_UNKNOWN,
+	                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_IP_TIMEOUT] =
+	     g_param_spec_uint (NM_MODEM_IP_TIMEOUT, "", "",
+	                        0, 360, 20,
+	                        G_PARAM_READWRITE |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_STATE] =
+	     g_param_spec_int (NM_MODEM_STATE, "", "",
+	                       NM_MODEM_STATE_UNKNOWN, _NM_MODEM_STATE_LAST, NM_MODEM_STATE_UNKNOWN,
+	                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                       G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_DEVICE_ID] =
+	     g_param_spec_string (NM_MODEM_DEVICE_ID, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_SIM_ID] =
+	     g_param_spec_string (NM_MODEM_SIM_ID, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                          G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_IP_TYPES] =
+	     g_param_spec_uint (NM_MODEM_IP_TYPES,
+	                        "IP Types",
+	                        "Supported IP types",
+	                        0, G_MAXUINT32, NM_MODEM_IP_TYPE_IPV4,
+	                        G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                        G_PARAM_STATIC_STRINGS);
+
+	obj_properties[PROP_SIM_OPERATOR_ID] =
+	     g_param_spec_string (NM_MODEM_SIM_OPERATOR_ID, "", "",
+	                          NULL,
+	                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT |
+	                          G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
 
 	signals[PPP_STATS] =
-		g_signal_new ("ppp-stats",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, ppp_stats),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 2,
-		              G_TYPE_UINT, G_TYPE_UINT);
+	    g_signal_new ("ppp-stats",
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 2,
+	                  G_TYPE_UINT, G_TYPE_UINT);
 
 	signals[PPP_FAILED] =
-		g_signal_new ("ppp-failed",
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, ppp_failed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, G_TYPE_UINT);
+	    g_signal_new ("ppp-failed",
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, G_TYPE_UINT);
 
 	signals[IP4_CONFIG_RESULT] =
-		g_signal_new (NM_MODEM_IP4_CONFIG_RESULT,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, ip4_config_result),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_POINTER);
+	    g_signal_new (NM_MODEM_IP4_CONFIG_RESULT,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_POINTER);
 
 	/**
 	 * NMModem::ip6-config-result:
@@ -1672,50 +1666,44 @@ nm_modem_class_init (NMModemClass *klass)
 	 * should be started after applying @config to the data port.
 	 */
 	signals[IP6_CONFIG_RESULT] =
-		g_signal_new (NM_MODEM_IP6_CONFIG_RESULT,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, ip6_config_result),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 3, G_TYPE_OBJECT, G_TYPE_BOOLEAN, G_TYPE_POINTER);
+	    g_signal_new (NM_MODEM_IP6_CONFIG_RESULT,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 3, G_TYPE_OBJECT, G_TYPE_BOOLEAN, G_TYPE_POINTER);
 
 	signals[PREPARE_RESULT] =
-		g_signal_new (NM_MODEM_PREPARE_RESULT,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, prepare_result),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_UINT);
+	    g_signal_new (NM_MODEM_PREPARE_RESULT,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_UINT);
 
 	signals[AUTH_REQUESTED] =
-		g_signal_new (NM_MODEM_AUTH_REQUESTED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, auth_requested),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
+	    g_signal_new (NM_MODEM_AUTH_REQUESTED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 
 	signals[AUTH_RESULT] =
-		g_signal_new (NM_MODEM_AUTH_RESULT,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, auth_result),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 1, G_TYPE_POINTER);
+	    g_signal_new (NM_MODEM_AUTH_RESULT,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 1, G_TYPE_POINTER);
 
 	signals[REMOVED] =
-		g_signal_new (NM_MODEM_REMOVED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, removed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 0);
+	    g_signal_new (NM_MODEM_REMOVED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 0);
 
 	signals[STATE_CHANGED] =
-		g_signal_new (NM_MODEM_STATE_CHANGED,
-		              G_OBJECT_CLASS_TYPE (object_class),
-		              G_SIGNAL_RUN_FIRST,
-		              G_STRUCT_OFFSET (NMModemClass, state_changed),
-		              NULL, NULL, NULL,
-		              G_TYPE_NONE, 2, NM_TYPE_MODEM_STATE, NM_TYPE_MODEM_STATE);
+	    g_signal_new (NM_MODEM_STATE_CHANGED,
+	                  G_OBJECT_CLASS_TYPE (object_class),
+	                  G_SIGNAL_RUN_FIRST,
+	                  0, NULL, NULL, NULL,
+	                  G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
 }