[LEDE-DEV] [PATCH 1/1 V3] netifd: track when wdev setup fails

Eduardo Abinader eduardoabinader at gmail.com
Thu Aug 11 05:02:20 PDT 2016


When netifd failed to load a valid configuration, after an invalid one,
it was not possible to setup the wireless device. This patch
aims to track this situation and behave acordingly, by keeping
track of failed setup without affecting autostart behavior. Also
block the restart of the wdev, when not applied.

Signed-off-by: Eduardo Abinader <eduardoabinader at gmail.com>
---
 wireless.c | 26 ++++++++++++++++++++------
 wireless.h |  1 +
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/wireless.c b/wireless.c
index 34dd328..1212a77 100644
--- a/wireless.c
+++ b/wireless.c
@@ -287,7 +287,7 @@ __wireless_device_set_up(struct wireless_device *wdev)
 	if (wdev->disabled)
 		return;
 
-	if (wdev->state != IFS_DOWN || config_init)
+	if ((wdev->config_state != IFC_RELOAD) && (wdev->state != IFS_DOWN || config_init))
 		return;
 
 	free(wdev->prev_config);
@@ -313,11 +313,15 @@ wdev_handle_config_change(struct wireless_device *wdev)
 
 	switch(state) {
 	case IFC_NORMAL:
-	case IFC_RELOAD:
-		wdev->config_state = IFC_NORMAL;
 		if (wdev->autostart)
 			__wireless_device_set_up(wdev);
 		break;
+	case IFC_RELOAD:
+		if (wdev->autostart || wdev->retry_setup_failed)
+			__wireless_device_set_up(wdev);
+
+		wdev->config_state = IFC_NORMAL;
+		break;
 	case IFC_REMOVE:
 		wireless_device_free(wdev);
 		break;
@@ -388,6 +392,13 @@ wireless_device_mark_up(struct wireless_device *wdev)
 
 	D(WIRELESS, "Wireless device '%s' is now up\n", wdev->name);
 	wdev->state = IFS_UP;
+
+	if (wdev->retry_setup_failed) {
+		wdev->retry_setup_failed = false;
+
+		/* a new chance is given, if a previous setup failed */
+		wdev->autostart = true;
+	}
 	vlist_for_each_element(&wdev->interfaces, vif, node)
 		wireless_interface_handle_link(vif, true);
 }
@@ -398,9 +409,10 @@ wireless_device_retry_setup(struct wireless_device *wdev)
 	if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || wdev->cancel)
 		return;
 
-	if (--wdev->retry < 0)
+	if (--wdev->retry < 0) {
 		wdev->autostart = false;
-
+		wdev->retry_setup_failed = true;
+	}
 	__wireless_device_set_down(wdev);
 }
 
@@ -681,6 +693,7 @@ wireless_device_create(struct wireless_driver *drv, const char *name, struct blo
 	wdev->config_state = IFC_NORMAL;
 	wdev->name = strcpy(name_buf, name);
 	wdev->config = data;
+	wdev->retry_setup_failed = false;
 	wdev->config_autostart = true;
 	wdev->autostart = wdev->config_autostart;
 	INIT_LIST_HEAD(&wdev->script_proc);
@@ -991,6 +1004,7 @@ wireless_start_pending(void)
 	struct wireless_device *wdev;
 
 	vlist_for_each_element(&wireless_devices, wdev, node)
-		if (wdev->autostart)
+		if (wdev->autostart && wdev->state == IFS_DOWN)
 			__wireless_device_set_up(wdev);
+
 }
diff --git a/wireless.h b/wireless.h
index 665cdb7..403cc86 100644
--- a/wireless.h
+++ b/wireless.h
@@ -56,6 +56,7 @@ struct wireless_device {
 	bool config_autostart;
 	bool autostart;
 	bool disabled;
+	bool retry_setup_failed;
 
 	enum interface_state state;
 	enum interface_config_state config_state;
-- 
2.5.0




More information about the Lede-dev mailing list