]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Channel switch with HT40
authorJouni Malinen <j@w1.fi>
Sat, 25 Oct 2014 09:09:02 +0000 (12:09 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 25 Oct 2014 09:09:02 +0000 (12:09 +0300)
ap_ht40_csa and ap_ht40_csa3 seem to show a cfg80211/mac80211 issue
where a CSA from HT40+ to HT40- channel results in HT getting disabled
due to cfg80211_chandef_compatible() check on c1->width == c2->width
claiming that the new channel is not compatible. For now, comment out
the FAIL case for these known issues to avoid constant failure for cases
that are not wpa_supplicant/hostapd issues. Once the kernel side design
has been reviewed, these error cases can be enabled here.

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

index 2603181f0b3082fdc38b19973a3aa85c33523f68..719255c1fd41ffd931d09e39208fd70ef27fc659 100644 (file)
@@ -11,6 +11,8 @@ import struct
 import subprocess
 
 import hostapd
+import hwsim_utils
+from test_ap_csa import csa_supported
 
 def clear_scan_cache(ifname):
     subprocess.call(['sudo', 'ifconfig', ifname, 'up'])
@@ -593,3 +595,131 @@ def test_ap_ht_40mhz_intolerant_ap(dev, apdev):
             ok = True
     if not ok:
         raise Exception("AP did not move to 40 MHz channel")
+
+def test_ap_ht40_csa(dev, apdev):
+    """HT with 40 MHz channel width and CSA"""
+    if not csa_supported(dev[0]):
+        return "skip"
+    try:
+        params = { "ssid": "ht",
+                   "country_code": "US",
+                   "hw_mode": "a",
+                   "channel": "36",
+                   "ht_capab": "[HT40+]",
+                   "ieee80211n": "1" }
+        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
+
+        dev[0].connect("ht", key_mgmt="NONE", scan_freq="5180")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5200 ht sec_channel_offset=-1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5200" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            # This looks like a mac80211/cfg80211 bug - don't record FAIL until
+            # that gets fixed.
+            #raise Exception("Unexpected STA disconnection during CSA")
+            logger.info("Unexpected STA disconnection during CSA")
+            dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=5)
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5180 ht sec_channel_offset=1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5180" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            raise Exception("Unexpected STA disconnection during CSA")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+    finally:
+        subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
+
+def test_ap_ht40_csa2(dev, apdev):
+    """HT with 40 MHz channel width and CSA"""
+    if not csa_supported(dev[0]):
+        return "skip"
+    try:
+        params = { "ssid": "ht",
+                   "country_code": "US",
+                   "hw_mode": "a",
+                   "channel": "36",
+                   "ht_capab": "[HT40+]",
+                   "ieee80211n": "1" }
+        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
+
+        dev[0].connect("ht", key_mgmt="NONE", scan_freq="5180")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5220 ht sec_channel_offset=1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5220" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            raise Exception("Unexpected STA disconnection during CSA")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5180 ht sec_channel_offset=1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5180" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            raise Exception("Unexpected STA disconnection during CSA")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+    finally:
+        subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
+
+def test_ap_ht40_csa3(dev, apdev):
+    """HT with 40 MHz channel width and CSA"""
+    if not csa_supported(dev[0]):
+        return "skip"
+    try:
+        params = { "ssid": "ht",
+                   "country_code": "US",
+                   "hw_mode": "a",
+                   "channel": "36",
+                   "ht_capab": "[HT40+]",
+                   "ieee80211n": "1" }
+        hapd = hostapd.add_ap(apdev[0]['ifname'], params)
+
+        dev[0].connect("ht", key_mgmt="NONE", scan_freq="5180")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5240 ht sec_channel_offset=-1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5240" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            # This looks like a mac80211/cfg80211 bug - don't record FAIL until
+            # that gets fixed.
+            #raise Exception("Unexpected STA disconnection during CSA")
+            logger.info("Unexpected STA disconnection during CSA")
+            dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=5)
+        hwsim_utils.test_connectivity(dev[0], hapd)
+
+        hapd.request("CHAN_SWITCH 5 5180 ht sec_channel_offset=1 bandwidth=40")
+        ev = hapd.wait_event(["AP-CSA-FINISHED"], timeout=10)
+        if ev is None:
+            raise Exception("CSA finished event timed out")
+        if "freq=5180" not in ev:
+            raise Exception("Unexpected channel in CSA finished event")
+        ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=0.5)
+        if ev is not None:
+            raise Exception("Unexpected STA disconnection during CSA")
+        hwsim_utils.test_connectivity(dev[0], hapd)
+    finally:
+        subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])