diff options
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 07d99578a2b1..43439203f4e4 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -335,7 +335,8 @@ static void ieee80211_report_used_skb(struct ieee80211_local *local, | |||
335 | if (dropped) | 335 | if (dropped) |
336 | acked = false; | 336 | acked = false; |
337 | 337 | ||
338 | if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) { | 338 | if (info->flags & (IEEE80211_TX_INTFL_NL80211_FRAME_TX | |
339 | IEEE80211_TX_INTFL_MLME_CONN_TX)) { | ||
339 | struct ieee80211_sub_if_data *sdata = NULL; | 340 | struct ieee80211_sub_if_data *sdata = NULL; |
340 | struct ieee80211_sub_if_data *iter_sdata; | 341 | struct ieee80211_sub_if_data *iter_sdata; |
341 | u64 cookie = (unsigned long)skb; | 342 | u64 cookie = (unsigned long)skb; |
@@ -357,10 +358,13 @@ static void ieee80211_report_used_skb(struct ieee80211_local *local, | |||
357 | sdata = rcu_dereference(local->p2p_sdata); | 358 | sdata = rcu_dereference(local->p2p_sdata); |
358 | } | 359 | } |
359 | 360 | ||
360 | if (!sdata) | 361 | if (!sdata) { |
361 | skb->dev = NULL; | 362 | skb->dev = NULL; |
362 | else if (ieee80211_is_nullfunc(hdr->frame_control) || | 363 | } else if (info->flags & IEEE80211_TX_INTFL_MLME_CONN_TX) { |
363 | ieee80211_is_qos_nullfunc(hdr->frame_control)) { | 364 | ieee80211_mgd_conn_tx_status(sdata, hdr->frame_control, |
365 | acked); | ||
366 | } else if (ieee80211_is_nullfunc(hdr->frame_control) || | ||
367 | ieee80211_is_qos_nullfunc(hdr->frame_control)) { | ||
364 | cfg80211_probe_status(sdata->dev, hdr->addr1, | 368 | cfg80211_probe_status(sdata->dev, hdr->addr1, |
365 | cookie, acked, GFP_ATOMIC); | 369 | cookie, acked, GFP_ATOMIC); |
366 | } else { | 370 | } else { |
@@ -468,6 +472,13 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
468 | return; | 472 | return; |
469 | } | 473 | } |
470 | 474 | ||
475 | /* mesh Peer Service Period support */ | ||
476 | if (ieee80211_vif_is_mesh(&sta->sdata->vif) && | ||
477 | ieee80211_is_data_qos(fc)) | ||
478 | ieee80211_mpsp_trigger_process( | ||
479 | ieee80211_get_qos_ctl(hdr), | ||
480 | sta, true, acked); | ||
481 | |||
471 | if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) && | 482 | if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) && |
472 | (rates_idx != -1)) | 483 | (rates_idx != -1)) |
473 | sta->last_tx_rate = info->status.rates[rates_idx]; | 484 | sta->last_tx_rate = info->status.rates[rates_idx]; |
@@ -502,11 +513,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
502 | IEEE80211_BAR_CTRL_TID_INFO_MASK) >> | 513 | IEEE80211_BAR_CTRL_TID_INFO_MASK) >> |
503 | IEEE80211_BAR_CTRL_TID_INFO_SHIFT; | 514 | IEEE80211_BAR_CTRL_TID_INFO_SHIFT; |
504 | 515 | ||
505 | if (local->hw.flags & | 516 | ieee80211_set_bar_pending(sta, tid, ssn); |
506 | IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL) | ||
507 | ieee80211_stop_tx_ba_session(&sta->sta, tid); | ||
508 | else | ||
509 | ieee80211_set_bar_pending(sta, tid, ssn); | ||
510 | } | 517 | } |
511 | } | 518 | } |
512 | 519 | ||