summary refs log tree commit diff
path: root/src/devices/adsl
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/adsl')
-rw-r--r--src/devices/adsl/meson.build2
-rw-r--r--src/devices/adsl/nm-atm-manager.c2
-rw-r--r--src/devices/adsl/nm-device-adsl.c117
3 files changed, 62 insertions, 59 deletions
diff --git a/src/devices/adsl/meson.build b/src/devices/adsl/meson.build
index a5d1c4b4..79834d7f 100644
--- a/src/devices/adsl/meson.build
+++ b/src/devices/adsl/meson.build
@@ -1,3 +1,5 @@
+# SPDX-License-Identifier: LGPL-2.1+
+
 sources = files(
   'nm-atm-manager.c',
   'nm-device-adsl.c',
diff --git a/src/devices/adsl/nm-atm-manager.c b/src/devices/adsl/nm-atm-manager.c
index 487011ff..46d74a07 100644
--- a/src/devices/adsl/nm-atm-manager.c
+++ b/src/devices/adsl/nm-atm-manager.c
@@ -248,7 +248,7 @@ dispose (GObject *object)
 
 	for (iter = priv->devices; iter; iter = iter->next)
 		g_object_weak_unref (G_OBJECT (iter->data), device_destroyed, self);
-	g_clear_pointer (&priv->devices, g_slist_free);
+	nm_clear_pointer (&priv->devices, g_slist_free);
 
 	priv->udev_client = nm_udev_client_unref (priv->udev_client);
 
diff --git a/src/devices/adsl/nm-device-adsl.c b/src/devices/adsl/nm-device-adsl.c
index 7c2b3e20..8f7cba22 100644
--- a/src/devices/adsl/nm-device-adsl.c
+++ b/src/devices/adsl/nm-device-adsl.c
@@ -58,7 +58,7 @@ struct _NMDeviceAdslClass {
 
 G_DEFINE_TYPE (NMDeviceAdsl, nm_device_adsl, NM_TYPE_DEVICE)
 
-#define NM_DEVICE_ADSL_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMDeviceAdsl, NM_IS_DEVICE_ADSL)
+#define NM_DEVICE_ADSL_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMDeviceAdsl, NM_IS_DEVICE_ADSL, NMDevice)
 
 /*****************************************************************************/
 
@@ -228,7 +228,8 @@ link_changed_cb (NMPlatform *platform,
 
 		/* This only gets called for PPPoE connections and "nas" interfaces */
 
-		if (priv->nas_ifindex > 0 && ifindex == priv->nas_ifindex) {
+		if (   priv->nas_ifindex > 0
+		    && ifindex == priv->nas_ifindex) {
 			/* NAS device went away for some reason; kill the connection */
 			_LOGD (LOGD_ADSL, "br2684 interface disappeared");
 			nm_device_state_changed (device,
@@ -273,11 +274,17 @@ nas_update_cb (gpointer user_data)
 	NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (self);
 	NMDevice *device = NM_DEVICE (self);
 
-	g_assert (priv->nas_ifname);
+	nm_assert (priv->nas_ifname);
 
 	priv->nas_update_count++;
 
-	if (priv->nas_update_count > 10) {
+	nm_assert (priv->nas_ifindex <= 0);
+	priv->nas_ifindex = nm_platform_link_get_ifindex (nm_device_get_platform (device), priv->nas_ifname);
+	if (priv->nas_ifindex <= 0) {
+		if (priv->nas_update_count <= 10) {
+			/* Keep waiting for it to appear */
+			return G_SOURCE_CONTINUE;
+		}
 		priv->nas_update_id = 0;
 		_LOGW (LOGD_ADSL, "failed to find br2684 interface %s ifindex after timeout", priv->nas_ifname);
 		nm_device_state_changed (device,
@@ -286,31 +293,22 @@ nas_update_cb (gpointer user_data)
 		return G_SOURCE_REMOVE;
 	}
 
-	g_warn_if_fail (priv->nas_ifindex < 0);
-	priv->nas_ifindex = nm_platform_link_get_ifindex (nm_device_get_platform (device), priv->nas_ifname);
-	if (priv->nas_ifindex < 0) {
-		/* Keep waiting for it to appear */
-		return G_SOURCE_CONTINUE;
-	}
-
 	priv->nas_update_id = 0;
 	_LOGD (LOGD_ADSL, "using br2684 iface '%s' index %d", priv->nas_ifname, priv->nas_ifindex);
 
-	if (pppoe_vcc_config (self)) {
-		nm_device_activate_schedule_stage3_ip_config_start (device);
-	} else {
+	if (!pppoe_vcc_config (self)) {
 		nm_device_state_changed (device,
 		                         NM_DEVICE_STATE_FAILED,
 		                         NM_DEVICE_STATE_REASON_BR2684_FAILED);
+		return G_SOURCE_REMOVE;
 	}
 
+	nm_device_activate_schedule_stage2_device_config (device, TRUE);
 	return G_SOURCE_REMOVE;
 }
 
-static NMActStageReturn
-br2684_create_iface (NMDeviceAdsl *self,
-                     NMSettingAdsl *s_adsl,
-                     NMDeviceStateReason *out_failure_reason)
+static gboolean
+br2684_create_iface (NMDeviceAdsl *self)
 {
 	NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (self);
 	struct atm_newif_br2684 ni;
@@ -318,19 +316,14 @@ br2684_create_iface (NMDeviceAdsl *self,
 	int err, errsv;
 	guint num = 0;
 
-	g_return_val_if_fail (s_adsl != NULL, FALSE);
-
-	if (priv->nas_update_id) {
-		g_warn_if_fail (priv->nas_update_id == 0);
-		nm_clear_g_source (&priv->nas_update_id);
-	}
+	if (nm_clear_g_source (&priv->nas_update_id))
+		nm_assert_not_reached ();
 
 	fd = socket (PF_ATMPVC, SOCK_DGRAM | SOCK_CLOEXEC, ATM_AAL5);
 	if (fd < 0) {
 		errsv = errno;
 		_LOGE (LOGD_ADSL, "failed to open ATM control socket (%d)", errsv);
-		NM_SET_OUT (out_failure_reason, NM_DEVICE_STATE_REASON_BR2684_FAILED);
-		return NM_ACT_STAGE_RETURN_FAILURE;
+		return FALSE;
 	}
 
 	memset (&ni, 0, sizeof (ni));
@@ -343,36 +336,33 @@ br2684_create_iface (NMDeviceAdsl *self,
 	 * cannot return that name to us.  Since we want to know the name right
 	 * away, just brute-force it.
 	 */
-	while (num < 10000) {
+	while (TRUE) {
 		memset (&ni.ifname, 0, sizeof (ni.ifname));
-		g_snprintf (ni.ifname, sizeof (ni.ifname), "nas%d", num++);
+		g_snprintf (ni.ifname, sizeof (ni.ifname), "nas%u", num++);
 
 		err = ioctl (fd, ATM_NEWBACKENDIF, &ni);
-		if (err == 0) {
-			g_free (priv->nas_ifname);
-			priv->nas_ifname = g_strdup (ni.ifname);
-			_LOGD (LOGD_ADSL, "waiting for br2684 iface '%s' to appear", priv->nas_ifname);
+		if (err != 0) {
+			errsv = errno;
+			if (errsv == EEXIST)
+				continue;
 
-			priv->nas_update_count = 0;
-			priv->nas_update_id = g_timeout_add (100, nas_update_cb, self);
-			return NM_ACT_STAGE_RETURN_POSTPONE;
-		}
-		errsv = errno;
-		if (errsv != EEXIST) {
 			_LOGW (LOGD_ADSL, "failed to create br2684 interface (%d)", errsv);
-			break;
+			return FALSE;
 		}
-	}
 
-	NM_SET_OUT (out_failure_reason, NM_DEVICE_STATE_REASON_BR2684_FAILED);
-	return NM_ACT_STAGE_RETURN_FAILURE;
+		nm_utils_strdup_reset (&priv->nas_ifname, ni.ifname);
+		_LOGD (LOGD_ADSL, "waiting for br2684 iface '%s' to appear", priv->nas_ifname);
+		priv->nas_update_count = 0;
+		priv->nas_update_id = g_timeout_add (100, nas_update_cb, self);
+		return TRUE;
+	}
 }
 
 static NMActStageReturn
 act_stage2_config (NMDevice *device, NMDeviceStateReason *out_failure_reason)
 {
 	NMDeviceAdsl *self = NM_DEVICE_ADSL (device);
-	NMActStageReturn ret = NM_ACT_STAGE_RETURN_FAILURE;
+	NMDeviceAdslPrivate *priv = NM_DEVICE_ADSL_GET_PRIVATE (self);
 	NMSettingAdsl *s_adsl;
 	const char *protocol;
 
@@ -383,16 +373,27 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *out_failure_reason)
 	protocol = nm_setting_adsl_get_protocol (s_adsl);
 	_LOGD (LOGD_ADSL, "using ADSL protocol '%s'", protocol);
 
-	if (g_strcmp0 (protocol, NM_SETTING_ADSL_PROTOCOL_PPPOE) == 0) {
-		/* PPPoE needs RFC2684 bridging before we can do PPP over it */
-		ret = br2684_create_iface (self, s_adsl, out_failure_reason);
-	} else if (g_strcmp0 (protocol, NM_SETTING_ADSL_PROTOCOL_PPPOA) == 0) {
+	if (nm_streq0 (protocol, NM_SETTING_ADSL_PROTOCOL_PPPOA)) {
 		/* PPPoA doesn't need anything special */
-		ret = NM_ACT_STAGE_RETURN_SUCCESS;
-	} else
-		_LOGW (LOGD_ADSL, "unhandled ADSL protocol '%s'", protocol);
+		return NM_ACT_STAGE_RETURN_SUCCESS;
+	}
+
+	if (nm_streq0 (protocol, NM_SETTING_ADSL_PROTOCOL_PPPOE)) {
+		/* PPPoE needs RFC2684 bridging before we can do PPP over it */
+		if (priv->nas_ifindex <= 0) {
+			if (priv->nas_update_id == 0) {
+				if (!br2684_create_iface (self)) {
+					NM_SET_OUT (out_failure_reason, NM_DEVICE_STATE_REASON_BR2684_FAILED);
+					return NM_ACT_STAGE_RETURN_FAILURE;
+				}
+			}
+			return NM_ACT_STAGE_RETURN_POSTPONE;
+		}
+		return NM_ACT_STAGE_RETURN_SUCCESS;
+	}
 
-	return ret;
+	_LOGW (LOGD_ADSL, "unhandled ADSL protocol '%s'", protocol);
+	return NM_ACT_STAGE_RETURN_SUCCESS;
 }
 
 static void
@@ -460,8 +461,8 @@ act_stage3_ip4_config_start (NMDevice *device,
 	g_return_val_if_fail (s_adsl, NM_ACT_STAGE_RETURN_FAILURE);
 
 	/* PPPoE uses the NAS interface, not the ATM interface */
-	if (g_strcmp0 (nm_setting_adsl_get_protocol (s_adsl), NM_SETTING_ADSL_PROTOCOL_PPPOE) == 0) {
-		g_assert (priv->nas_ifname);
+	if (nm_streq0 (nm_setting_adsl_get_protocol (s_adsl), NM_SETTING_ADSL_PROTOCOL_PPPOE)) {
+		nm_assert (priv->nas_ifname);
 		ppp_iface = priv->nas_ifname;
 
 		_LOGD (LOGD_ADSL, "starting PPPoE on br2684 interface %s", priv->nas_ifname);
@@ -540,8 +541,8 @@ adsl_cleanup (NMDeviceAdsl *self)
 	 * so it gets leaked.  It does get destroyed when it's no longer in use,
 	 * but we have no control over that.
 	 */
-	priv->nas_ifindex = -1;
-	g_clear_pointer (&priv->nas_ifname, g_free);
+	priv->nas_ifindex = 0;
+	nm_clear_g_free (&priv->nas_ifname);
 }
 
 static void
@@ -577,7 +578,7 @@ get_property (GObject *object, guint prop_id,
 {
 	switch (prop_id) {
 	case PROP_ATM_INDEX:
-		g_value_set_int (value, NM_DEVICE_ADSL_GET_PRIVATE ((NMDeviceAdsl *) object)->atm_index);
+		g_value_set_int (value, NM_DEVICE_ADSL_GET_PRIVATE (object)->atm_index);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -592,7 +593,7 @@ set_property (GObject *object, guint prop_id,
 	switch (prop_id) {
 	case PROP_ATM_INDEX:
 		/* construct-only */
-		NM_DEVICE_ADSL_GET_PRIVATE ((NMDeviceAdsl *) object)->atm_index = g_value_get_int (value);
+		NM_DEVICE_ADSL_GET_PRIVATE (object)->atm_index = g_value_get_int (value);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -646,7 +647,7 @@ dispose (GObject *object)
 {
 	adsl_cleanup (NM_DEVICE_ADSL (object));
 
-	nm_clear_g_source (&NM_DEVICE_ADSL_GET_PRIVATE ((NMDeviceAdsl *) object)->carrier_poll_id);
+	nm_clear_g_source (&NM_DEVICE_ADSL_GET_PRIVATE (object)->carrier_poll_id);
 
 	G_OBJECT_CLASS (nm_device_adsl_parent_class)->dispose (object);
 }