ieee80211_do_stop() releases the channel of a monitor, but leaves its chanreq filled. When the monitor comes back up it has no channel, yet the RX path still filters on the old chanreq and drops all frames received on other frequencies. Only keep the chanreq filled while a channel is set on the monitor. Fixes: f92e0cf19ae0 ("wifi: mac80211: filter on monitor interfaces based on configured channel") Signed-off-by: Felix Fietkau --- v2: drop unnecessary condition for memset net/mac80211/cfg.c | 5 ++++- net/mac80211/iface.c | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 9608c07bcea7..64e2bd0cf124 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1165,8 +1165,11 @@ static int ieee80211_set_monitor_channel(struct wiphy *wiphy, ieee80211_link_release_channel(&sdata->deflink); ret = ieee80211_link_use_channel(&sdata->deflink, &chanreq, IEEE80211_CHANCTX_SHARED); - if (ret) + if (ret) { + memset(&sdata->vif.bss_conf.chanreq, 0, + sizeof(sdata->vif.bss_conf.chanreq)); return ret; + } done: local->monitor_chanreq = chanreq; return 0; diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 63a371c79183..79739b142398 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -758,6 +758,8 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, bool going_do break; ieee80211_link_release_channel(&sdata->deflink); + memset(&sdata->vif.bss_conf.chanreq, 0, + sizeof(sdata->vif.bss_conf.chanreq)); fallthrough; default: if (!going_down) -- 2.47.3