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()
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()
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',
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"""