summaryrefslogtreecommitdiff
path: root/src/devices/wwan
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/wwan')
-rw-r--r--src/devices/wwan/libnm-wwan.ver6
-rw-r--r--src/devices/wwan/nm-device-modem.c11
-rw-r--r--src/devices/wwan/nm-modem-manager.c14
-rw-r--r--src/devices/wwan/nm-modem-manager.h3
-rw-r--r--src/devices/wwan/nm-modem.c64
-rw-r--r--src/devices/wwan/nm-modem.h8
-rw-r--r--src/devices/wwan/nm-wwan-factory.c14
7 files changed, 94 insertions, 26 deletions
diff --git a/src/devices/wwan/libnm-wwan.ver b/src/devices/wwan/libnm-wwan.ver
index 7ccebcb5ee..c368a5907d 100644
--- a/src/devices/wwan/libnm-wwan.ver
+++ b/src/devices/wwan/libnm-wwan.ver
@@ -3,6 +3,7 @@ global:
nm_modem_act_stage1_prepare;
nm_modem_act_stage2_config;
nm_modem_check_connection_compatible;
+ nm_modem_claim;
nm_modem_complete_connection;
nm_modem_deactivate;
nm_modem_deactivate_async;
@@ -14,15 +15,17 @@ global:
nm_modem_get_device_id;
nm_modem_get_driver;
nm_modem_get_iid;
- nm_modem_get_path;
nm_modem_get_ip_ifindex;
nm_modem_get_operator_code;
+ nm_modem_get_path;
nm_modem_get_secrets;
nm_modem_get_state;
nm_modem_get_type;
nm_modem_get_uid;
nm_modem_ip4_pre_commit;
+ nm_modem_is_claimed;
nm_modem_manager_get;
+ nm_modem_manager_get_modems;
nm_modem_manager_get_type;
nm_modem_manager_name_owner_get;
nm_modem_manager_name_owner_ref;
@@ -32,6 +35,7 @@ global:
nm_modem_stage3_ip4_config_start;
nm_modem_stage3_ip6_config_start;
nm_modem_state_to_string;
+ nm_modem_unclaim;
local:
*;
};
diff --git a/src/devices/wwan/nm-device-modem.c b/src/devices/wwan/nm-device-modem.c
index 9a8faeff23..e81115ca3d 100644
--- a/src/devices/wwan/nm-device-modem.c
+++ b/src/devices/wwan/nm-device-modem.c
@@ -605,12 +605,9 @@ act_stage1_prepare (NMDevice *device, NMDeviceStateReason *out_failure_reason)
static NMActStageReturn
act_stage2_config (NMDevice *device, NMDeviceStateReason *out_failure_reason)
{
- NMActRequest *req;
+ nm_modem_act_stage2_config (NM_DEVICE_MODEM_GET_PRIVATE (device)->modem);
- req = nm_device_get_act_request (device);
- g_return_val_if_fail (req, NM_ACT_STAGE_RETURN_FAILURE);
-
- return nm_modem_act_stage2_config (NM_DEVICE_MODEM_GET_PRIVATE (device)->modem, req, out_failure_reason);
+ return NM_ACT_STAGE_RETURN_SUCCESS;
}
static NMActStageReturn
@@ -716,7 +713,7 @@ set_modem (NMDeviceModem *self, NMModem *modem)
g_return_if_fail (modem != NULL);
- priv->modem = g_object_ref (modem);
+ priv->modem = nm_modem_claim (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);
@@ -844,7 +841,7 @@ dispose (GObject *object)
if (priv->modem) {
g_signal_handlers_disconnect_by_data (priv->modem, NM_DEVICE_MODEM (object));
- g_clear_object (&priv->modem);
+ nm_clear_pointer (&priv->modem, nm_modem_unclaim);
}
g_clear_pointer (&priv->device_id, g_free);
diff --git a/src/devices/wwan/nm-modem-manager.c b/src/devices/wwan/nm-modem-manager.c
index 463e042ff9..63470148d4 100644
--- a/src/devices/wwan/nm-modem-manager.c
+++ b/src/devices/wwan/nm-modem-manager.c
@@ -136,6 +136,20 @@ remove_one_modem (gpointer key, gpointer value, gpointer user_data)
/*****************************************************************************/
+NMModem **
+nm_modem_manager_get_modems (NMModemManager *self,
+ guint *out_len)
+{
+ g_return_val_if_fail (NM_IS_MODEM_MANAGER (self), NULL);
+
+ return (NMModem **) nm_utils_hash_values_to_array (NM_MODEM_MANAGER_GET_PRIVATE (self)->modems,
+ NULL,
+ NULL,
+ out_len);
+}
+
+/*****************************************************************************/
+
static void
modm_clear_manager (NMModemManager *self)
{
diff --git a/src/devices/wwan/nm-modem-manager.h b/src/devices/wwan/nm-modem-manager.h
index 503afc8edb..3dd3024e11 100644
--- a/src/devices/wwan/nm-modem-manager.h
+++ b/src/devices/wwan/nm-modem-manager.h
@@ -38,4 +38,7 @@ void nm_modem_manager_name_owner_unref (NMModemManager *self);
const char *nm_modem_manager_name_owner_get (NMModemManager *self);
+NMModem **nm_modem_manager_get_modems (NMModemManager *self,
+ guint *out_len);
+
#endif /* __NETWORKMANAGER_MODEM_MANAGER_H__ */
diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c
index a21cebc350..e6174ccc49 100644
--- a/src/devices/wwan/nm-modem.c
+++ b/src/devices/wwan/nm-modem.c
@@ -97,6 +97,8 @@ typedef struct _NMModemPrivate {
/* PPP stats */
guint32 in_bytes;
guint32 out_bytes;
+
+ bool claimed:1;
} NMModemPrivate;
G_DEFINE_TYPE (NMModem, nm_modem, G_TYPE_OBJECT)
@@ -174,6 +176,53 @@ nm_modem_state_to_string (NMModemState state)
return NULL;
}
+/*****************************************************************************/
+
+gboolean
+nm_modem_is_claimed (NMModem *self)
+{
+ g_return_val_if_fail (NM_IS_MODEM (self), FALSE);
+
+ return NM_MODEM_GET_PRIVATE (self)->claimed;
+}
+
+NMModem *
+nm_modem_claim (NMModem *self)
+{
+ NMModemPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_MODEM (self), NULL);
+
+ priv = NM_MODEM_GET_PRIVATE (self);
+
+ g_return_val_if_fail (!priv->claimed, NULL);
+
+ priv->claimed = TRUE;
+ return g_object_ref (self);
+}
+
+void
+nm_modem_unclaim (NMModem *self)
+{
+ NMModemPrivate *priv;
+
+ g_return_if_fail (NM_IS_MODEM (self));
+
+ priv = NM_MODEM_GET_PRIVATE (self);
+
+ g_return_if_fail (priv->claimed);
+
+ /* we don't actually unclaim the instance. This instance should not be re-used
+ * by another owner, that is because we only claim modems as we receive them.
+ * There is no mechanism that somebody else would later re-use them again.
+ *
+ * // priv->claimed = FALSE; */
+
+ g_object_unref (self);
+}
+
+/*****************************************************************************/
+
NMModemState
nm_modem_get_state (NMModem *self)
{
@@ -980,6 +1029,8 @@ nm_modem_act_stage1_prepare (NMModem *self,
NMSecretAgentGetSecretsFlags flags = NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION;
NMConnection *connection;
+ g_return_val_if_fail (NM_IS_ACT_REQUEST (req), NM_ACT_STAGE_RETURN_FAILURE);
+
if (priv->act_request)
g_object_unref (priv->act_request);
priv->act_request = g_object_ref (req);
@@ -1014,19 +1065,18 @@ nm_modem_act_stage1_prepare (NMModem *self,
/*****************************************************************************/
-NMActStageReturn
-nm_modem_act_stage2_config (NMModem *self,
- NMActRequest *req,
- NMDeviceStateReason *out_failure_reason)
+void
+nm_modem_act_stage2_config (NMModem *self)
{
- NMModemPrivate *priv = NM_MODEM_GET_PRIVATE (self);
+ NMModemPrivate *priv;
+
+ g_return_if_fail (NM_IS_MODEM (self));
+ priv = NM_MODEM_GET_PRIVATE (self);
/* Clear secrets tries counter since secrets were successfully used
* already if we get here.
*/
priv->secrets_tries = 0;
-
- return NM_ACT_STAGE_RETURN_SUCCESS;
}
/*****************************************************************************/
diff --git a/src/devices/wwan/nm-modem.h b/src/devices/wwan/nm-modem.h
index c29630c025..37f8b42fe9 100644
--- a/src/devices/wwan/nm-modem.h
+++ b/src/devices/wwan/nm-modem.h
@@ -154,6 +154,10 @@ typedef struct {
GType nm_modem_get_type (void);
+gboolean nm_modem_is_claimed (NMModem *modem);
+NMModem *nm_modem_claim (NMModem *modem);
+void nm_modem_unclaim (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);
@@ -209,9 +213,7 @@ NMActStageReturn nm_modem_act_stage1_prepare (NMModem *modem,
NMActRequest *req,
NMDeviceStateReason *out_failure_reason);
-NMActStageReturn nm_modem_act_stage2_config (NMModem *modem,
- NMActRequest *req,
- NMDeviceStateReason *out_failure_reason);
+void nm_modem_act_stage2_config (NMModem *modem);
NMActStageReturn nm_modem_stage3_ip4_config_start (NMModem *modem,
NMDevice *device,
diff --git a/src/devices/wwan/nm-wwan-factory.c b/src/devices/wwan/nm-wwan-factory.c
index 59512cf38e..c81a8175bd 100644
--- a/src/devices/wwan/nm-wwan-factory.c
+++ b/src/devices/wwan/nm-wwan-factory.c
@@ -64,11 +64,10 @@ modem_added_cb (NMModemManager *manager,
gpointer user_data)
{
NMWwanFactory *self = NM_WWAN_FACTORY (user_data);
- NMDevice *device;
+ gs_unref_object NMDevice *device = NULL;
const char *driver;
- /* Do nothing if the modem was consumed by some other plugin */
- if (nm_device_factory_emit_component_added (NM_DEVICE_FACTORY (self), G_OBJECT (modem)))
+ if (nm_modem_is_claimed (modem))
return;
driver = nm_modem_get_driver (modem);
@@ -77,17 +76,16 @@ modem_added_cb (NMModemManager *manager,
* it. The rfcomm port (and thus the modem) gets created automatically
* by the Bluetooth code during the connection process.
*/
- if (driver && strstr (driver, "bluetooth")) {
- nm_log_info (LOGD_MB, "ignoring modem '%s' (no associated Bluetooth device)",
- nm_modem_get_control_port (modem));
+ if ( driver
+ && strstr (driver, "bluetooth")) {
+ nm_log_dbg (LOGD_MB, "WWAN factory ignores bluetooth modem '%s' which should be handled by bluetooth plugin",
+ nm_modem_get_control_port (modem));
return;
}
/* Make the new modem device */
device = nm_device_modem_new (modem);
- g_assert (device);
g_signal_emit_by_name (self, NM_DEVICE_FACTORY_DEVICE_ADDED, device);
- g_object_unref (device);
}
static NMDevice *