driver_wext: Add "HANGED" processing (b/2310372) (DO NOT MERGE)

Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
diff --git a/driver_wext.c b/driver_wext.c
index c75dd4a..3c50466 100644
--- a/driver_wext.c
+++ b/driver_wext.c
@@ -84,6 +84,7 @@
 	char mlmedev[IFNAMSIZ + 1];
 
 	int scan_complete_events;
+	int errors;
 };
 
 
@@ -1001,6 +1002,7 @@
 
 	drv->mlme_sock = -1;
 
+	drv->errors = 0;
 	wpa_driver_wext_finish_drv_init(drv);
 
 	return drv;
@@ -2542,11 +2544,15 @@
 	else if (os_strcasecmp(cmd, "STOP") == 0) {
 		if ((wpa_driver_wext_get_ifflags(drv, &flags) == 0) &&
 		    (flags & IFF_UP)) {
-			wpa_printf(MSG_ERROR, "WEXT: %s when iface is UP",
-				cmd);
+			wpa_printf(MSG_ERROR, "WEXT: %s when iface is UP", cmd);
 			wpa_driver_wext_set_ifflags(drv, flags & ~IFF_UP);
 		}
 	}
+	else if( os_strcasecmp(cmd, "RELOAD") == 0 ) {
+		wpa_printf(MSG_DEBUG,"Reload command");
+		wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+		return ret;
+	}
 
 	os_memset(&iwr, 0, sizeof(iwr));
 	os_strncpy(iwr.ifr_name, drv->ifname, IFNAMSIZ);
@@ -2558,9 +2564,16 @@
 		perror("ioctl[SIOCSIWPRIV]");
 	}
 
-	if (ret < 0)
+	if (ret < 0) {
 		wpa_printf(MSG_ERROR, "%s failed", __func__);
+		drv->errors++;
+		if (drv->errors > WEXT_NUMBER_SEQUENTIAL_ERRORS) {
+			drv->errors = 0;
+			wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED");
+		}
+	}
 	else {
+		drv->errors = 0;
 		ret = 0;
 		if ((os_strcasecmp(cmd, "RSSI") == 0) ||
 		    (os_strcasecmp(cmd, "LINKSPEED") == 0) ||
diff --git a/driver_wext.h b/driver_wext.h
index 4804ae5..cdd9246 100644
--- a/driver_wext.h
+++ b/driver_wext.h
@@ -52,6 +52,7 @@
 
 #define WPA_DRIVER_WEXT_WAIT_US		400000
 #define MAX_DRV_CMD_SIZE		248
+#define WEXT_NUMBER_SEQUENTIAL_ERRORS	4
 #endif
 
 #endif /* DRIVER_WEXT_H */