]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Split mbo_supp_oper_classes into multiple test cases
authorJouni Malinen <j@w1.fi>
Fri, 4 Jan 2019 22:21:41 +0000 (00:21 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 4 Jan 2019 22:21:41 +0000 (00:21 +0200)
In addition, add even more workarounds for cfg80211 regulatory state
clearing since this test case seems to be the most likely one to fail
due to country=98 issues.

Signed-off-by: Jouni Malinen <j@w1.fi>
tests/hwsim/test_mbo.py

index cd6311d9be7460370f690206f93a5e59a9b8986c..31e580c910a822003e36f2d5f2793e5c2f0809fd 100644 (file)
@@ -54,7 +54,9 @@ def run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, country):
         sta = hapd.get_sta(addr)
         res5 = sta['supp_op_classes'][2:]
         dev[0].wait_regdom(country_ie=True)
+        time.sleep(0.1)
         hapd.disable()
+        time.sleep(0.1)
         dev[0].request("REMOVE_NETWORK all")
         dev[0].request("ABORT_SCAN")
         dev[0].wait_disconnected()
@@ -67,7 +69,9 @@ def run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, country):
     sta = hapd2.get_sta(addr)
     res2 = sta['supp_op_classes'][2:]
     dev[0].wait_regdom(country_ie=True)
+    time.sleep(0.1)
     hapd2.disable()
+    time.sleep(0.1)
     dev[0].request("REMOVE_NETWORK all")
     dev[0].request("ABORT_SCAN")
     dev[0].wait_disconnected()
@@ -75,16 +79,44 @@ def run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, country):
 
     return res2, res5
 
-def test_mbo_supp_oper_classes(dev, apdev):
-    """MBO and supported operating classes"""
-    params = { 'ssid': "test-wnm-mbo",
-               'mbo': '1',
-               "country_code": "US",
-               'ieee80211d': '1',
-               "ieee80211n": "1",
-               "hw_mode": "a",
-               "channel": "36" }
-    hapd = hostapd.add_ap(apdev[0], params, no_enable=True)
+def clear_country(dev):
+    logger.info("Try to clear country")
+    id = dev[1].add_network()
+    dev[1].set_network(id, "mode", "2")
+    dev[1].set_network_quoted(id, "ssid", "country-clear")
+    dev[1].set_network(id, "key_mgmt", "NONE")
+    dev[1].set_network(id, "frequency", "2412")
+    dev[1].set_network(id, "scan_freq", "2412")
+    dev[1].select_network(id)
+    ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"])
+    if ev:
+        dev[0].connect("country-clear", key_mgmt="NONE", scan_freq="2412")
+        dev[1].request("DISCONNECT")
+        dev[0].wait_disconnected()
+        dev[0].request("DISCONNECT")
+        dev[0].request("ABORT_SCAN")
+        time.sleep(1)
+        dev[0].dump_monitor()
+        dev[1].dump_monitor()
+
+def wait_regdom_changes(dev):
+    for i in range(10):
+        ev = dev.wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=0.1)
+        if ev is None:
+            break
+
+def run_mbo_supp_oper_class(dev, apdev, country, expected, inc5):
+    if inc5:
+        params = { 'ssid': "test-wnm-mbo",
+                   'mbo': '1',
+                   "country_code": "US",
+                   'ieee80211d': '1',
+                   "ieee80211n": "1",
+                   "hw_mode": "a",
+                   "channel": "36" }
+        hapd = hostapd.add_ap(apdev[0], params, no_enable=True)
+    else:
+        hapd = None
 
     params = { 'ssid': "test-wnm-mbo-2",
                'mbo': '1',
@@ -97,42 +129,66 @@ def test_mbo_supp_oper_classes(dev, apdev):
 
     try:
         dev[0].request("STA_AUTOCONNECT 0")
-        za2, za5 = run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, "ZA")
-        fi2, fi5 = run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, "FI")
-        us2, us5 = run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, "US")
-        jp2, jp5 = run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, "JP")
-        bd2, bd5 = run_mbo_supp_oper_classes(dev, apdev, None, hapd2, "BD")
-        sy2, sy5 = run_mbo_supp_oper_classes(dev, apdev, None, hapd2, "SY")
+        res2, res5 = run_mbo_supp_oper_classes(dev, apdev, hapd, hapd2, country)
     finally:
         dev[0].dump_monitor()
-        set_reg("00", apdev[0], apdev[1], dev[0])
-        ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=1)
         dev[0].request("STA_AUTOCONNECT 1")
-
-    za = "515354737475767778797a7b808182"
-    fi = "515354737475767778797a7b808182"
-    us = "515354737475767778797a7b7c7d7e7f808182"
-    jp = "51525354737475767778797a7b808182"
-    bd = "5153547c7d7e7f80"
-    sy = "515354"
-
-    tests = [ ("ZA", za, za2, za5, True),
-              ("FI", fi, fi2, fi5, True),
-              ("US", us, us2, us5, True),
-              ("JP", jp, jp2, jp5, True),
-              ("BD", bd, bd2, bd5, False),
-              ("SY", sy, sy2, sy5, False) ]
-    for country, expected, res2, res5, inc5 in tests:
-        # For now, allow operating class 129 to be missing since not all
-        # installed regdb files include the 160 MHz channels.
-        expected2 = expected.replace('808182', '8082')
-        # For now, allow operating classes 121-123 to be missing since not all
-        # installed regdb files include the related US DFS channels.
-        expected2 = expected2.replace('78797a7b7c', '787c')
-        if res2 != expected and res2 != expected2:
-            raise Exception("Unexpected supp_op_class string (country=%s, 2.4 GHz): %s (expected: %s)" % (country, res2, expected))
-        if inc5 and res5 != expected and res5 != expected2:
-            raise Exception("Unexpected supp_op_class string (country=%s, 5 GHz): %s (expected: %s)" % (country, res5, expected))
+        wait_regdom_changes(dev[0])
+        country1 = dev[0].get_driver_status_field("country")
+        logger.info("Country code at the end (1): " + country1)
+        set_reg("00", apdev[0], apdev[1], dev[0])
+        country2 = dev[0].get_driver_status_field("country")
+        logger.info("Country code at the end (2): " + country2)
+        for i in range(5):
+            ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=1)
+            if ev is None or "init=USER type=WORLD" in ev:
+                break
+        wait_regdom_changes(dev[0])
+        country3 = dev[0].get_driver_status_field("country")
+        logger.info("Country code at the end (3): " + country3)
+        if country3 != "00":
+            clear_country(dev)
+
+    # For now, allow operating class 129 to be missing since not all
+    # installed regdb files include the 160 MHz channels.
+    expected2 = expected.replace('808182', '8082')
+    # For now, allow operating classes 121-123 to be missing since not all
+    # installed regdb files include the related US DFS channels.
+    expected2 = expected2.replace('78797a7b7c', '787c')
+    if res2 != expected and res2 != expected2:
+        raise Exception("Unexpected supp_op_class string (country=%s, 2.4 GHz): %s (expected: %s)" % (country, res2, expected))
+    if inc5 and res5 != expected and res5 != expected2:
+        raise Exception("Unexpected supp_op_class string (country=%s, 5 GHz): %s (expected: %s)" % (country, res5, expected))
+
+def test_mbo_supp_oper_classes_za(dev, apdev):
+    """MBO and supported operating classes (ZA)"""
+    run_mbo_supp_oper_class(dev, apdev, "ZA",
+                            "515354737475767778797a7b808182", True)
+
+def test_mbo_supp_oper_classes_fi(dev, apdev):
+    """MBO and supported operating classes (FI)"""
+    run_mbo_supp_oper_class(dev, apdev, "FI",
+                            "515354737475767778797a7b808182", True)
+
+def test_mbo_supp_oper_classes_us(dev, apdev):
+    """MBO and supported operating classes (US)"""
+    run_mbo_supp_oper_class(dev, apdev, "US",
+                            "515354737475767778797a7b7c7d7e7f808182", True)
+
+def test_mbo_supp_oper_classes_jp(dev, apdev):
+    """MBO and supported operating classes (JP)"""
+    run_mbo_supp_oper_class(dev, apdev, "JP",
+                            "51525354737475767778797a7b808182", True)
+
+def test_mbo_supp_oper_classes_bd(dev, apdev):
+    """MBO and supported operating classes (BD)"""
+    run_mbo_supp_oper_class(dev, apdev, "BD",
+                            "5153547c7d7e7f80", False)
+
+def test_mbo_supp_oper_classes_sy(dev, apdev):
+    """MBO and supported operating classes (SY)"""
+    run_mbo_supp_oper_class(dev, apdev, "SY",
+                            "515354", False)
 
 def test_mbo_assoc_disallow(dev, apdev, params):
     """MBO and association disallowed"""