summaryrefslogtreecommitdiffstats
path: root/net/mac80211/cfg.c
diff options
context:
space:
mode:
authorMatti Gottlieb <matti.gottlieb@intel.com>2015-04-20 22:54:14 +0300
committerJohannes Berg <johannes.berg@intel.com>2015-04-24 12:27:17 +0200
commitb8e69d51ffb5753cbb62f3ebfeadeffd3a19b0e9 (patch)
tree6fd4a76fb49a7bb535577cff1a0efd273b3a2aab /net/mac80211/cfg.c
parentb497de63ad5dcdae999c14444c4e7f53fd60119c (diff)
downloadlinux-b8e69d51ffb5753cbb62f3ebfeadeffd3a19b0e9.tar.gz
linux-b8e69d51ffb5753cbb62f3ebfeadeffd3a19b0e9.tar.bz2
linux-b8e69d51ffb5753cbb62f3ebfeadeffd3a19b0e9.zip
mac80211: force off channel transmission for public action frames
Currently while associated to an AP and sending a (public) action frame to a different AP on the same channel, the action frame will be sent like a regular tx frame without going off channel. When power save is enabled this can cause problems, since the device can go into power save and miss the response to the action frame that is sent by the other AP. Force off-channel transmission to avoid this issue in case - HW offchannel is used, - the user didn't forbid transmitting frames off channel - the frame is not sent to the AP that we are associated with (if it is we assume the response would be bufferable) Signed-off-by: Matti Gottlieb <matti.gottlieb@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> [reword commit message a bit] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r--net/mac80211/cfg.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 4aa5e893cbaa..72a0178af737 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -3343,8 +3343,14 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
break;
case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_P2P_CLIENT:
- if (!sdata->u.mgd.associated)
+ sdata_lock(sdata);
+ if (!sdata->u.mgd.associated ||
+ (params->offchan && params->wait &&
+ local->ops->remain_on_channel &&
+ memcmp(sdata->u.mgd.associated->bssid,
+ mgmt->bssid, ETH_ALEN)))
need_offchan = true;
+ sdata_unlock(sdata);
break;
case NL80211_IFTYPE_P2P_DEVICE:
need_offchan = true;