2020-01-14 06:06:01

by Thomas Pedersen

[permalink] [raw]
Subject: [PATCH v3 0/2] more STA PS fixes and mac80211_hwsim PS support

This patchset adds power save support to mac80211_hwsim, and fixes some
lingering bugs in mac80211 STA PS related to (QoS) nullfunc probing.

The hostap hwsim test failures initially observed[0] have been
"resolved" by disabling STA PS by default. It turns out STA PS behavior
violates some assumption for eg. the bgscan_simple_beacon_loss test
where a beacon loss event was expected instead of a disconnect event,
which is triggered because hwsim can now do nullfunc probing. For the
p2p failures I really have no idea :)

[0]:
https://lore.kernel.org/linux-wireless/[email protected]/

Thomas Pedersen (2):
mac80211_hwsim: add power save support
mac80211: add ieee80211_is_any_nullfunc()

drivers/net/wireless/mac80211_hwsim.c | 9 +++++++++
include/linux/ieee80211.h | 9 +++++++++
net/mac80211/mlme.c | 2 +-
net/mac80211/rx.c | 8 +++-----
net/mac80211/status.c | 5 ++---
net/mac80211/tx.c | 2 +-
6 files changed, 25 insertions(+), 10 deletions(-)

--
2.20.1


2020-01-14 06:07:21

by Thomas Pedersen

[permalink] [raw]
Subject: [PATCH v3 1/2] mac80211_hwsim: add power save support

Advertise the correct flags to mac80211 to indicate PS
trigger frames and frame buffering should be handled by
mac80211. This means mac80211_hwsim will now also have to
release buffered multicast frames after a (DTIM) beacon.

Leave STA power save disabled by default since it causes
several p2p, scanning, and rrm hostap tests to fail.

Signed-off-by: Thomas Pedersen <[email protected]>

---

v3:
disable STA PS by default
---
drivers/net/wireless/mac80211_hwsim.c | 9 +++++++++
1 file changed, 9 insertions(+)

diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 03738107fd10..8d9d85f3f3a7 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -1595,6 +1595,11 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
mac80211_hwsim_tx_frame(hw, skb,
rcu_dereference(vif->chanctx_conf)->def.chan);

+ while ((skb = ieee80211_get_buffered_bc(hw, vif)) != NULL) {
+ mac80211_hwsim_tx_frame(hw, skb,
+ rcu_dereference(vif->chanctx_conf)->def.chan);
+ }
+
if (vif->csa_active && ieee80211_csa_is_complete(vif))
ieee80211_csa_finish(vif);
}
@@ -2925,11 +2930,15 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
ieee80211_hw_set(hw, MFP_CAPABLE);
ieee80211_hw_set(hw, SIGNAL_DBM);
ieee80211_hw_set(hw, SUPPORTS_PS);
+ ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
+ ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
+ ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
ieee80211_hw_set(hw, TDLS_WIDER_BW);
if (rctbl)
ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
ieee80211_hw_set(hw, SUPPORTS_MULTI_BSSID);

+ hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
WIPHY_FLAG_AP_UAPSD |
--
2.20.1