diff mbox

[v4,2/2] hwsim tests: add test to check disconnect in powersave

Message ID 1420829745-13761-2-git-send-email-johannes@sipsolutions.net
State Accepted
Headers show

Commit Message

Johannes Berg Jan. 9, 2015, 6:55 p.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

The kernel had two bugs (one in hwsim and one more important
one in mac80211) in this area, add a test to make sure we can
disconnect without any kernel issues while in powersave.

Also make sure that the TIM bit gets set and cleared again
(by checking with tshark.)

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 tests/hwsim/hwsim_utils.py  |  8 ++++++++
 tests/hwsim/test_ap_open.py | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

Comments

Jouni Malinen Feb. 21, 2015, 2:47 p.m. UTC | #1
On Fri, Jan 09, 2015 at 07:55:45PM +0100, Johannes Berg wrote:
> The kernel had two bugs (one in hwsim and one more important
> one in mac80211) in this area, add a test to make sure we can
> disconnect without any kernel issues while in powersave.
> 
> Also make sure that the TIM bit gets set and cleared again
> (by checking with tshark.)

Thanks, applied.
diff mbox

Patch

diff --git a/tests/hwsim/hwsim_utils.py b/tests/hwsim/hwsim_utils.py
index edf0a4242472..31432619811e 100644
--- a/tests/hwsim/hwsim_utils.py
+++ b/tests/hwsim/hwsim_utils.py
@@ -149,3 +149,11 @@  def test_connectivity_p2p_sta(dev1, dev2, dscp=None, tos=None):
 
 def test_connectivity_sta(dev1, dev2, dscp=None, tos=None):
     test_connectivity(dev1, dev2, dscp, tos)
+
+(PS_DISABLED, PS_ENABLED, PS_AUTO_POLL, PS_MANUAL_POLL) = range(4)
+
+def set_powersave(dev, val):
+    phy = dev.get_driver_status_field("phyname")
+    psf = open('/sys/kernel/debug/ieee80211/%s/hwsim/ps' % phy, 'w')
+    psf.write('%d\n' % val)
+    psf.close()
diff --git a/tests/hwsim/test_ap_open.py b/tests/hwsim/test_ap_open.py
index 7a646b8ab407..e8e10f6cc7ff 100644
--- a/tests/hwsim/test_ap_open.py
+++ b/tests/hwsim/test_ap_open.py
@@ -9,10 +9,12 @@  logger = logging.getLogger()
 import struct
 import subprocess
 import time
+import os
 
 import hostapd
 import hwsim_utils
 from utils import alloc_fail
+from tshark import run_tshark
 
 def test_ap_open(dev, apdev):
     """AP with open mode (no security) configuration"""
@@ -201,3 +203,41 @@  def test_ap_open_out_of_memory(dev, apdev):
     # verify that a new interface can still be added when memory allocation does
     # not fail
     hostapd.add_ap(apdev[1]['ifname'], { "ssid": "open" })
+
+def test_ap_open_disconnect_in_ps(dev, apdev, params):
+    """disconnect with the client in PS to regression-test a kernel bug"""
+    hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
+    dev[0].connect("open", key_mgmt="NONE", scan_freq="2412",
+                   bg_scan_period="0")
+    ev = hapd.wait_event([ "AP-STA-CONNECTED" ], timeout=5)
+    if ev is None:
+        raise Exception("No connection event received from hostapd")
+
+    hwsim_utils.set_powersave(dev[0], hwsim_utils.PS_MANUAL_POLL)
+    try:
+        # inject some traffic
+        sa = hapd.own_addr()
+        da = dev[0].own_addr()
+        hapd.request('DATA_TEST_TX {} {} 0'.format(da, sa))
+
+        # let the AP send two beacons
+        time.sleep(0.2)
+
+        # disconnect - with traffic pending - shouldn't cause kernel warnings
+        dev[0].request("DISCONNECT")
+    finally:
+        hwsim_utils.set_powersave(dev[0], hwsim_utils.PS_DISABLED)
+
+    out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
+                     "wlan_mgt.tim.partial_virtual_bitmap",
+                     ["wlan_mgt.tim.partial_virtual_bitmap"])
+    if out is not None:
+        state = 0
+        for l in out.splitlines():
+            pvb = int(l, 16)
+            if pvb > 0 and state == 0:
+                state = 1
+            elif pvb == 0 and state == 1:
+                state = 2
+        if state != 2:
+            raise Exception("didn't observe TIM bit getting set and unset")