From a8f7a45e3ffefb40cf810306763c26326d4a85c8 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 24 Oct 2012 19:27:04 +0200 Subject: [PATCH] modem-manager: rework interface related properties in `NMModem' The logic behind the `iface' property (which actually is removed) gets split into three new properties, as follows:: * `uid': Just defines a new string property which must contain a unique ID of the modem, mainly for logging. * `control-port': a string property defining which is the control port the modem uses. This property is actually optional and may be specified as NULL. The main purpose of this property is to allow the easy integration of the new ModemManager into the `NMDeviceBt' object. The bluetooth device needs to know the port used by the modem; and we cannot use the Data port information as that is only available until the bearer is created. Instead, for the new ModemManager we will use the control port information exposed. * `data-port': a string property defining which is the data port to use in the connection. This property is always defined in the `NMModemGsm' and `NMModemCdma' objects. --- src/modem-manager/nm-modem-cdma.c | 4 +- src/modem-manager/nm-modem-generic.c | 2 +- src/modem-manager/nm-modem-gsm.c | 4 +- src/modem-manager/nm-modem.c | 84 ++++++++++++++++++++++------ src/modem-manager/nm-modem.h | 20 ++++--- src/nm-device-bt.c | 14 +++-- src/nm-device-modem.c | 14 +++-- src/nm-manager.c | 3 +- 8 files changed, 108 insertions(+), 37 deletions(-) diff --git a/src/modem-manager/nm-modem-cdma.c b/src/modem-manager/nm-modem-cdma.c index 00e506ac79..3002e790bc 100644 --- a/src/modem-manager/nm-modem-cdma.c +++ b/src/modem-manager/nm-modem-cdma.c @@ -71,7 +71,9 @@ nm_modem_cdma_new (const char *path, return (NMModem *) g_object_new (NM_TYPE_MODEM_CDMA, NM_MODEM_PATH, path, - NM_MODEM_IFACE, data_device, + NM_MODEM_UID, data_device, + NM_MODEM_CONTROL_PORT, NULL, + NM_MODEM_DATA_PORT, data_device, NM_MODEM_IP_METHOD, ip_method, NM_MODEM_CONNECTED, (state == NM_MODEM_STATE_CONNECTED), NULL); diff --git a/src/modem-manager/nm-modem-generic.c b/src/modem-manager/nm-modem-generic.c index 3d1b700e79..0214f1c0c2 100644 --- a/src/modem-manager/nm-modem-generic.c +++ b/src/modem-manager/nm-modem-generic.c @@ -201,7 +201,7 @@ static_stage3_done (DBusGProxy *proxy, DBusGProxyCall *call, gpointer user_data) addr = nm_ip4_address_new (); nm_log_info (LOGD_MB, "(%s): IPv4 static configuration:", - nm_modem_get_iface (NM_MODEM (self))); + nm_modem_get_uid (NM_MODEM (self))); /* IP address */ nm_ip4_address_set_address (addr, g_value_get_uint (g_value_array_get_nth (ret_array, 0))); diff --git a/src/modem-manager/nm-modem-gsm.c b/src/modem-manager/nm-modem-gsm.c index b6854cae59..340ee987e0 100644 --- a/src/modem-manager/nm-modem-gsm.c +++ b/src/modem-manager/nm-modem-gsm.c @@ -113,7 +113,9 @@ nm_modem_gsm_new (const char *path, return (NMModem *) g_object_new (NM_TYPE_MODEM_GSM, NM_MODEM_PATH, path, - NM_MODEM_IFACE, data_device, + NM_MODEM_UID, data_device, + NM_MODEM_CONTROL_PORT, NULL, + NM_MODEM_DATA_PORT, data_device, NM_MODEM_IP_METHOD, ip_method, NM_MODEM_CONNECTED, (state == NM_MODEM_STATE_CONNECTED), NULL); diff --git a/src/modem-manager/nm-modem.c b/src/modem-manager/nm-modem.c index 26c35368f7..5ce7ff79ab 100644 --- a/src/modem-manager/nm-modem.c +++ b/src/modem-manager/nm-modem.c @@ -38,8 +38,10 @@ G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT) enum { PROP_0, - PROP_IFACE, + PROP_CONTROL_PORT, + PROP_DATA_PORT, PROP_PATH, + PROP_UID, PROP_IP_METHOD, PROP_IP_TIMEOUT, PROP_ENABLED, @@ -49,8 +51,10 @@ enum { }; typedef struct { + char *uid; char *path; - char *iface; + char *control_port; + char *data_port; guint32 ip_method; NMPPPManager *ppp_manager; @@ -229,7 +233,7 @@ ppp_stage3_ip4_config_start (NMModem *self, ip_timeout = priv->mm_ip_timeout; } - priv->ppp_manager = nm_ppp_manager_new (priv->iface); + priv->ppp_manager = nm_ppp_manager_new (priv->data_port); if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, ip_timeout, &error)) { g_signal_connect (priv->ppp_manager, "state-changed", G_CALLBACK (ppp_state_changed), @@ -592,12 +596,12 @@ nm_modem_device_state_changed (NMModem *self, /*****************************************************************************/ const char * -nm_modem_get_iface (NMModem *self) +nm_modem_get_uid (NMModem *self) { g_return_val_if_fail (self != NULL, NULL); g_return_val_if_fail (NM_IS_MODEM (self), NULL); - return NM_MODEM_GET_PRIVATE (self)->iface; + return NM_MODEM_GET_PRIVATE (self)->uid; } const char * @@ -609,6 +613,24 @@ nm_modem_get_path (NMModem *self) return NM_MODEM_GET_PRIVATE (self)->path; } +const char * +nm_modem_get_control_port (NMModem *self) +{ + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (NM_IS_MODEM (self), NULL); + + return NM_MODEM_GET_PRIVATE (self)->control_port; +} + +const char * +nm_modem_get_data_port (NMModem *self) +{ + g_return_val_if_fail (self != NULL, NULL); + g_return_val_if_fail (NM_IS_MODEM (self), NULL); + + return NM_MODEM_GET_PRIVATE (self)->data_port; +} + /*****************************************************************************/ static void @@ -632,8 +654,8 @@ constructor (GType type, priv = NM_MODEM_GET_PRIVATE (object); - if (!priv->iface) { - nm_log_err (LOGD_HW, "modem command interface not provided"); + if (!priv->data_port && !priv->control_port) { + nm_log_err (LOGD_HW, "neither modem command nor data interface provided"); goto err; } @@ -659,8 +681,14 @@ get_property (GObject *object, guint prop_id, case PROP_PATH: g_value_set_string (value, priv->path); break; - case PROP_IFACE: - g_value_set_string (value, priv->iface); + case PROP_CONTROL_PORT: + g_value_set_string (value, priv->control_port); + break; + case PROP_DATA_PORT: + g_value_set_string (value, priv->data_port); + break; + case PROP_UID: + g_value_set_string (value, priv->uid); break; case PROP_IP_METHOD: g_value_set_uint (value, priv->ip_method); @@ -691,9 +719,15 @@ set_property (GObject *object, guint prop_id, /* Construct only */ priv->path = g_value_dup_string (value); break; - case PROP_IFACE: + case PROP_CONTROL_PORT: + priv->control_port = g_value_dup_string (value); + break; + case PROP_DATA_PORT: + priv->data_port = g_value_dup_string (value); + break; + case PROP_UID: /* Construct only */ - priv->iface = g_value_dup_string (value); + priv->uid = g_value_dup_string (value); break; case PROP_IP_METHOD: priv->ip_method = g_value_get_uint (value); @@ -731,8 +765,10 @@ finalize (GObject *object) { NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (object); - g_free (priv->iface); + g_free (priv->uid); g_free (priv->path); + g_free (priv->control_port); + g_free (priv->data_port); G_OBJECT_CLASS (nm_modem_parent_class)->finalize (object); } @@ -756,6 +792,14 @@ nm_modem_class_init (NMModemClass *klass) /* Properties */ + g_object_class_install_property + (object_class, PROP_UID, + g_param_spec_string (NM_MODEM_UID, + "UID", + "Modem unique ID", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property (object_class, PROP_PATH, g_param_spec_string (NM_MODEM_PATH, @@ -765,13 +809,21 @@ nm_modem_class_init (NMModemClass *klass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property - (object_class, PROP_IFACE, - g_param_spec_string (NM_MODEM_IFACE, - "Interface", - "Modem command interface", + (object_class, PROP_CONTROL_PORT, + g_param_spec_string (NM_MODEM_CONTROL_PORT, + "Control port", + "The port controlling the modem", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + g_object_class_install_property + (object_class, PROP_DATA_PORT, + g_param_spec_string (NM_MODEM_DATA_PORT, + "Data port", + "The port to connect to", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + g_object_class_install_property (object_class, PROP_IP_METHOD, g_param_spec_uint (NM_MODEM_IP_METHOD, diff --git a/src/modem-manager/nm-modem.h b/src/modem-manager/nm-modem.h index d86b1d01a8..fb07a8e092 100644 --- a/src/modem-manager/nm-modem.h +++ b/src/modem-manager/nm-modem.h @@ -36,12 +36,14 @@ G_BEGIN_DECLS #define NM_IS_MODEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_MODEM)) #define NM_MODEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_MODEM, NMModemClass)) -#define NM_MODEM_PATH "path" -#define NM_MODEM_IFACE "iface" -#define NM_MODEM_IP_METHOD "ip-method" -#define NM_MODEM_IP_TIMEOUT "ip-timeout" -#define NM_MODEM_ENABLED "enabled" -#define NM_MODEM_CONNECTED "connected" +#define NM_MODEM_UID "uid" +#define NM_MODEM_PATH "path" +#define NM_MODEM_CONTROL_PORT "control-port" +#define NM_MODEM_DATA_PORT "data-port" +#define NM_MODEM_IP_METHOD "ip-method" +#define NM_MODEM_IP_TIMEOUT "ip-timeout" +#define NM_MODEM_ENABLED "enabled" +#define NM_MODEM_CONNECTED "connected" #define NM_MODEM_PPP_STATS "ppp-stats" #define NM_MODEM_PPP_FAILED "ppp-failed" @@ -110,8 +112,10 @@ typedef struct { GType nm_modem_get_type (void); -const char * nm_modem_get_iface (NMModem *modem); -const char * nm_modem_get_path (NMModem *modem); +const char *nm_modem_get_path (NMModem *modem); +const char *nm_modem_get_uid (NMModem *modem); +const char *nm_modem_get_control_port (NMModem *modem); +const char *nm_modem_get_data_port (NMModem *modem); NMConnection *nm_modem_get_best_auto_connection (NMModem *self, GSList *connections, diff --git a/src/nm-device-bt.c b/src/nm-device-bt.c index 28a2fe1d2b..9d0d634147 100644 --- a/src/nm-device-bt.c +++ b/src/nm-device-bt.c @@ -611,7 +611,8 @@ nm_device_bt_modem_added (NMDeviceBt *self, const char *driver) { NMDeviceBtPrivate *priv; - const char *modem_iface; + const gchar *modem_data_port; + const gchar *modem_control_port; char *base; NMDeviceState state; NMDeviceStateReason reason = NM_DEVICE_STATE_REASON_NONE; @@ -622,14 +623,15 @@ nm_device_bt_modem_added (NMDeviceBt *self, g_return_val_if_fail (NM_IS_MODEM (modem), FALSE); priv = NM_DEVICE_BT_GET_PRIVATE (self); - modem_iface = nm_modem_get_iface (modem); - g_return_val_if_fail (modem_iface != NULL, FALSE); + modem_data_port = nm_modem_get_data_port (modem); + modem_control_port = nm_modem_get_control_port (modem); + g_return_val_if_fail (modem_data_port != NULL || modem_control_port != NULL, FALSE); if (!priv->rfcomm_iface) return FALSE; base = g_path_get_basename (priv->rfcomm_iface); - if (strcmp (base, modem_iface)) { + if (g_strcmp0 (base, modem_data_port) && g_strcmp0 (base, modem_control_port)) { g_free (base); return FALSE; } @@ -670,6 +672,8 @@ nm_device_bt_modem_added (NMDeviceBt *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); + nm_device_set_ip_iface (NM_DEVICE (self), modem_data_port); + /* Kick off the modem connection */ if (!modem_stage1 (self, modem, &reason)) nm_device_state_changed (NM_DEVICE (self), NM_DEVICE_STATE_FAILED, reason); @@ -1341,7 +1345,7 @@ nm_device_bt_class_init (NMDeviceBtClass *klass) G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); - signals[PROPERTIES_CHANGED] = + signals[PROPERTIES_CHANGED] = nm_properties_changed_signal_new (object_class, G_STRUCT_OFFSET (NMDeviceBtClass, properties_changed)); diff --git a/src/nm-device-modem.c b/src/nm-device-modem.c index 3e95863b93..8f94491b9c 100644 --- a/src/nm-device-modem.c +++ b/src/nm-device-modem.c @@ -345,7 +345,9 @@ NMDevice * nm_device_modem_new (NMModem *modem, const char *driver) { NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE; - const char *type_desc = NULL; + NMDeviceModemCapabilities current_caps = NM_DEVICE_MODEM_CAPABILITY_NONE; + const gchar *type_desc = NULL; + const gchar *ip_iface = NULL; g_return_val_if_fail (modem != NULL, NULL); g_return_val_if_fail (NM_IS_MODEM (modem), NULL); @@ -353,10 +355,14 @@ nm_device_modem_new (NMModem *modem, const char *driver) if (NM_IS_MODEM_CDMA (modem)) { caps = NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO; + current_caps = caps; type_desc = "CDMA/EVDO"; + ip_iface = nm_modem_get_data_port (modem); } else if (NM_IS_MODEM_GSM (modem)) { caps = NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS; + current_caps = caps; type_desc = "GSM/UMTS"; + ip_iface = nm_modem_get_data_port (modem); } else { nm_log_warn (LOGD_MB, "unhandled modem type %s", G_OBJECT_TYPE_NAME (modem)); return NULL; @@ -364,7 +370,8 @@ nm_device_modem_new (NMModem *modem, const char *driver) return (NMDevice *) g_object_new (NM_TYPE_DEVICE_MODEM, NM_DEVICE_UDI, nm_modem_get_path (modem), - NM_DEVICE_IFACE, nm_modem_get_iface (modem), + NM_DEVICE_IFACE, nm_modem_get_uid (modem), + NM_DEVICE_IP_IFACE, ip_iface, NM_DEVICE_DRIVER, driver, NM_DEVICE_TYPE_DESC, type_desc, NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_MODEM, @@ -507,7 +514,7 @@ nm_device_modem_class_init (NMDeviceModemClass *mclass) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); /* Signals */ - signals[PROPERTIES_CHANGED] = + signals[PROPERTIES_CHANGED] = nm_properties_changed_signal_new (object_class, G_STRUCT_OFFSET (NMDeviceModemClass, properties_changed)); @@ -522,4 +529,3 @@ nm_device_modem_class_init (NMDeviceModemClass *mclass) dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (mclass), &dbus_glib_nm_device_modem_object_info); } - diff --git a/src/nm-manager.c b/src/nm-manager.c index c8ce1157e8..9be0a0d10e 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -387,7 +387,8 @@ modem_added (NMModemManager *modem_manager, const char *ip_iface; GSList *iter; - ip_iface = nm_modem_get_iface (modem); + ip_iface = nm_modem_get_data_port (modem); + g_assert (ip_iface); replace_device = find_device_by_ip_iface (NM_MANAGER (user_data), ip_iface); if (replace_device) {