From: Antonio Quartulli <antonio@xxxxxxxxxxxxx> In mgmt_tx, if no channel has been specified via cfg80211, use the current one. If the interface requires offchan (because disconnected or for other reasons) then fail. Signed-off-by: Antonio Quartulli <antonio@xxxxxxxxxxxxx> --- net/mac80211/cfg.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 9034da1..e6e41c7 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -2836,6 +2836,13 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, return -EOPNOTSUPP; } + /* + * configurations requiring offchan cannot work if no channel has been + * specified + */ + if (need_offchan && !chan) + return -EINVAL; + mutex_lock(&local->mtx); /* Check if the operating channel is the requested channel */ @@ -2845,6 +2852,10 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, rcu_read_lock(); chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); + /* if no channel was specified, use the current one */ + if (chanctx_conf && !chan) + chan = chanctx_conf->def.chan; + if (chanctx_conf) need_offchan = chan != chanctx_conf->def.chan; else @@ -2852,6 +2863,12 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, rcu_read_unlock(); } + /* at this point a channel should have been chosen */ + if (!chan) { + ret = -EINVAL; + goto out_unlock; + } + if (need_offchan && !offchan) { ret = -EBUSY; goto out_unlock; -- 1.8.1.5 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html