From cc0a04ac86f7bb123043acf14f22e4301522c4dc Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sat, 5 Jan 2019 00:21:41 +0200 Subject: [PATCH] tests: Split mbo_supp_oper_classes into multiple test cases 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 --- tests/hwsim/test_mbo.py | 138 ++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 41 deletions(-) diff --git a/tests/hwsim/test_mbo.py b/tests/hwsim/test_mbo.py index cd6311d9b..31e580c91 100644 --- a/tests/hwsim/test_mbo.py +++ b/tests/hwsim/test_mbo.py @@ -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") + 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) - za = "515354737475767778797a7b808182" - fi = "515354737475767778797a7b808182" - us = "515354737475767778797a7b7c7d7e7f808182" - jp = "51525354737475767778797a7b808182" - bd = "5153547c7d7e7f80" - sy = "515354" + # 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)) - 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)) +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"""