diff --git a/tests/hwsim/test_ap_open.py b/tests/hwsim/test_ap_open.py index 0d83438c4..fd9919bb1 100644 --- a/tests/hwsim/test_ap_open.py +++ b/tests/hwsim/test_ap_open.py @@ -491,6 +491,80 @@ def test_ap_open_disconnect_in_ps(dev, apdev, params): if state != 2: raise Exception("Didn't observe TIM bit getting set and unset (state=%d)" % state) +def test_ap_open_sta_ps(dev, apdev): + """Station power save operation""" + hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) + dev[0].connect("open", key_mgmt="NONE", scan_freq="2412", + bg_scan_period="0") + hapd.wait_sta() + + time.sleep(0.2) + try: + dev[0].cmd_execute(['iw', 'dev', dev[0].ifname, + 'set', 'power_save', 'on']) + run_ap_open_sta_ps(dev, hapd) + finally: + dev[0].cmd_execute(['iw', 'dev', dev[0].ifname, + 'set', 'power_save', 'on']) + +def run_ap_open_sta_ps(dev, hapd): + hwsim_utils.test_connectivity(dev[0], hapd) + # Give time to enter PS + time.sleep(0.2) + + phyname = dev[0].get_driver_status_field("phyname") + hw_conf = '/sys/kernel/debug/ieee80211/' + phyname + '/hw_conf' + + try: + ok = False + for i in range(10): + with open(hw_conf, 'r') as f: + val = int(f.read()) + if val & 2: + ok = True + break + time.sleep(0.2) + + if not ok: + raise Exception("STA did not enter power save") + except FileNotFoundError: + raise HwsimSkip("Kernel does not support inspecting HW PS state") + +def test_ap_open_ps_mc_buf(dev, apdev, params): + """Multicast buffering with a station in power save""" + hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) + dev[0].connect("open", key_mgmt="NONE", scan_freq="2412", + bg_scan_period="0") + hapd.wait_sta() + + buffered_mcast = 0 + try: + dev[0].cmd_execute(['iw', 'dev', dev[0].ifname, + 'set', 'power_save', 'on']) + # Give time to enter PS + time.sleep(0.3) + + for i in range(10): + # Verify that multicast frames are released + hwsim_utils.run_multicast_connectivity_test(hapd, dev[0]) + + # Check frames were buffered until DTIM + out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"), + "wlan.fc.type_subtype == 0x0008", + ["wlan.tim.bmapctl.multicast"]) + for line in out.splitlines(): + buffered_mcast = int(line) + if buffered_mcast == 1: + break + if buffered_mcast == 1: + break + finally: + dev[0].cmd_execute(['iw', 'dev', dev[0].ifname, + 'set', 'power_save', 'off']) + + if buffered_mcast != 1: + raise Exception("AP did not buffer multicast frames") + @remote_compatible def test_ap_open_select_network(dev, apdev): """Open mode connection and SELECT_NETWORK to change network"""