12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- From: Felix Fietkau <[email protected]>
- Date: Mon, 21 Sep 2020 17:43:06 +0200
- Subject: [PATCH] mac80211: fix regression in sta connection monitor
- When a frame was acked and probe frames were sent, the connection monitoring
- needs to be reset, otherwise it will keep probing until the connection is
- considered dead, even though frames have been acked in the mean time.
- Fixes: 9abf4e49830d ("mac80211: optimize station connection monitor")
- Reported-by: Georgi Valkov <[email protected]>
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/net/mac80211/status.c
- +++ b/net/mac80211/status.c
- @@ -989,10 +989,6 @@ static void __ieee80211_tx_status(struct
- if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
- ieee80211_frame_acked(sta, skb);
-
- - if ((sta->sdata->vif.type == NL80211_IFTYPE_STATION) &&
- - ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
- - ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
- - acked, info->status.tx_time);
- }
-
- /* SNMP counters
- @@ -1127,11 +1123,18 @@ void ieee80211_tx_status_ext(struct ieee
- noack_success = !!(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED);
-
- if (pubsta) {
- + struct ieee80211_sub_if_data *sdata = sta->sdata;
- +
- if (!acked && !noack_success)
- sta->status_stats.retry_failed++;
- sta->status_stats.retry_count += retry_count;
-
- if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
- + if (sdata->vif.type == NL80211_IFTYPE_STATION &&
- + skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
- + ieee80211_sta_tx_notify(sdata, (void *) skb->data,
- + acked, info->status.tx_time);
- +
- if (acked) {
- sta->status_stats.last_ack = jiffies;
-
- @@ -1141,6 +1144,11 @@ void ieee80211_tx_status_ext(struct ieee
- /* Track when last packet was ACKed */
- sta->status_stats.last_pkt_time = jiffies;
-
- + /* Reset connection monitor */
- + if (sdata->vif.type == NL80211_IFTYPE_STATION &&
- + unlikely(sdata->u.mgd.probe_send_count > 0))
- + sdata->u.mgd.probe_send_count = 0;
- +
- if (info->status.is_valid_ack_signal) {
- sta->status_stats.last_ack_signal =
- (s8)info->status.ack_signal;
- --- a/net/mac80211/mlme.c
- +++ b/net/mac80211/mlme.c
- @@ -2508,7 +2508,9 @@ void ieee80211_sta_tx_notify(struct ieee
- !sdata->u.mgd.probe_send_count)
- return;
-
- - if (!ack)
- + if (ack)
- + sdata->u.mgd.probe_send_count = 0;
- + else
- sdata->u.mgd.nullfunc_failed = true;
- ieee80211_queue_work(&sdata->local->hw, &sdata->work);
- }
|