aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/cfg.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r--net/mac80211/cfg.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index c7b3e57aec04..267d3aca9947 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -3167,26 +3167,25 @@ static int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
3167} 3167}
3168 3168
3169static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, 3169static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3170 struct ieee80211_channel *chan, bool offchan, 3170 struct cfg80211_mgmt_tx_params *params,
3171 unsigned int wait, const u8 *buf, size_t len, 3171 u64 *cookie)
3172 bool no_cck, bool dont_wait_for_ack, u64 *cookie)
3173{ 3172{
3174 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 3173 struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
3175 struct ieee80211_local *local = sdata->local; 3174 struct ieee80211_local *local = sdata->local;
3176 struct sk_buff *skb; 3175 struct sk_buff *skb;
3177 struct sta_info *sta; 3176 struct sta_info *sta;
3178 const struct ieee80211_mgmt *mgmt = (void *)buf; 3177 const struct ieee80211_mgmt *mgmt = (void *)params->buf;
3179 bool need_offchan = false; 3178 bool need_offchan = false;
3180 u32 flags; 3179 u32 flags;
3181 int ret; 3180 int ret;
3182 3181
3183 if (dont_wait_for_ack) 3182 if (params->dont_wait_for_ack)
3184 flags = IEEE80211_TX_CTL_NO_ACK; 3183 flags = IEEE80211_TX_CTL_NO_ACK;
3185 else 3184 else
3186 flags = IEEE80211_TX_INTFL_NL80211_FRAME_TX | 3185 flags = IEEE80211_TX_INTFL_NL80211_FRAME_TX |
3187 IEEE80211_TX_CTL_REQ_TX_STATUS; 3186 IEEE80211_TX_CTL_REQ_TX_STATUS;
3188 3187
3189 if (no_cck) 3188 if (params->no_cck)
3190 flags |= IEEE80211_TX_CTL_NO_CCK_RATE; 3189 flags |= IEEE80211_TX_CTL_NO_CCK_RATE;
3191 3190
3192 switch (sdata->vif.type) { 3191 switch (sdata->vif.type) {
@@ -3234,7 +3233,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3234 /* configurations requiring offchan cannot work if no channel has been 3233 /* configurations requiring offchan cannot work if no channel has been
3235 * specified 3234 * specified
3236 */ 3235 */
3237 if (need_offchan && !chan) 3236 if (need_offchan && !params->chan)
3238 return -EINVAL; 3237 return -EINVAL;
3239 3238
3240 mutex_lock(&local->mtx); 3239 mutex_lock(&local->mtx);
@@ -3247,8 +3246,10 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3247 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); 3246 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3248 3247
3249 if (chanctx_conf) { 3248 if (chanctx_conf) {
3250 need_offchan = chan && (chan != chanctx_conf->def.chan); 3249 need_offchan = params->chan &&
3251 } else if (!chan) { 3250 (params->chan !=
3251 chanctx_conf->def.chan);
3252 } else if (!params->chan) {
3252 ret = -EINVAL; 3253 ret = -EINVAL;
3253 rcu_read_unlock(); 3254 rcu_read_unlock();
3254 goto out_unlock; 3255 goto out_unlock;
@@ -3258,19 +3259,19 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3258 rcu_read_unlock(); 3259 rcu_read_unlock();
3259 } 3260 }
3260 3261
3261 if (need_offchan && !offchan) { 3262 if (need_offchan && !params->offchan) {
3262 ret = -EBUSY; 3263 ret = -EBUSY;
3263 goto out_unlock; 3264 goto out_unlock;
3264 } 3265 }
3265 3266
3266 skb = dev_alloc_skb(local->hw.extra_tx_headroom + len); 3267 skb = dev_alloc_skb(local->hw.extra_tx_headroom + params->len);
3267 if (!skb) { 3268 if (!skb) {
3268 ret = -ENOMEM; 3269 ret = -ENOMEM;
3269 goto out_unlock; 3270 goto out_unlock;
3270 } 3271 }
3271 skb_reserve(skb, local->hw.extra_tx_headroom); 3272 skb_reserve(skb, local->hw.extra_tx_headroom);
3272 3273
3273 memcpy(skb_put(skb, len), buf, len); 3274 memcpy(skb_put(skb, params->len), params->buf, params->len);
3274 3275
3275 IEEE80211_SKB_CB(skb)->flags = flags; 3276 IEEE80211_SKB_CB(skb)->flags = flags;
3276 3277
@@ -3290,8 +3291,8 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3290 local->hw.offchannel_tx_hw_queue; 3291 local->hw.offchannel_tx_hw_queue;
3291 3292
3292 /* This will handle all kinds of coalescing and immediate TX */ 3293 /* This will handle all kinds of coalescing and immediate TX */
3293 ret = ieee80211_start_roc_work(local, sdata, chan, 3294 ret = ieee80211_start_roc_work(local, sdata, params->chan,
3294 wait, cookie, skb, 3295 params->wait, cookie, skb,
3295 IEEE80211_ROC_TYPE_MGMT_TX); 3296 IEEE80211_ROC_TYPE_MGMT_TX);
3296 if (ret) 3297 if (ret)
3297 kfree_skb(skb); 3298 kfree_skb(skb);