Browse Source

tests: Wait for driver scan state to clear between tests

cfg80211/mac80211 seems to getting stuck with scans every now and then.
Check for this special state and delay return from reset() until the
driver has stopped the scan operation. This reduces likelihood of
failing multiple test cases in a row because of a single error.

Signed-hostap: Jouni Malinen <j@w1.fi>
Jouni Malinen 11 years ago
parent
commit
6ca3a98bc2
1 changed files with 42 additions and 0 deletions
  1. 42 0
      tests/hwsim/wpasupplicant.py

+ 42 - 0
tests/hwsim/wpasupplicant.py

@@ -10,6 +10,7 @@ import os
 import time
 import logging
 import re
+import subprocess
 import wpaspy
 
 logger = logging.getLogger(__name__)
@@ -58,6 +59,32 @@ class WpaSupplicant:
         self.request("P2P_SET per_sta_psk 0")
         self.group_ifname = None
         self.dump_monitor()
+
+        iter = 0
+        while iter < 60:
+            state = self.get_driver_status_field("scan_state")
+            if "SCAN_STARTED" in state or "SCAN_REQUESTED" in state:
+                logger.info(self.ifname + ": Waiting for scan operation to complete before continuing")
+                time.sleep(1)
+            else:
+                break
+            iter = iter + 1
+        if iter == 60:
+            logger.error(self.ifname + ": Driver scan state did not clear")
+            print "Trying to clear cfg80211/mac80211 scan state"
+            try:
+                cmd = ["sudo", "ifconfig", self.ifname, "down"]
+                subprocess.call(cmd)
+            except subprocess.CalledProcessError, e:
+                logger.info("ifconfig failed: " + str(e.returncode))
+                logger.info(e.output)
+            try:
+                cmd = ["sudo", "ifconfig", self.ifname, "up"]
+                subprocess.call(cmd)
+            except subprocess.CalledProcessError, e:
+                logger.info("ifconfig failed: " + str(e.returncode))
+                logger.info(e.output)
+
         if not self.ping():
             logger.info("No PING response from " + self.ifname + " after reset")
 
@@ -153,6 +180,21 @@ class WpaSupplicant:
             return vals[field]
         return None
 
+    def get_driver_status(self):
+        res = self.request("STATUS-DRIVER")
+        lines = res.splitlines()
+        vals = dict()
+        for l in lines:
+            [name,value] = l.split('=', 1)
+            vals[name] = value
+        return vals
+
+    def get_driver_status_field(self, field):
+        vals = self.get_driver_status()
+        if field in vals:
+            return vals[field]
+        return None
+
     def p2p_dev_addr(self):
         return self.get_status_field("p2p_device_address")