mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	Make the code more closely match the original behavior Signed-off-by: Felix Fietkau <nbd@nbd.name>
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Felix Fietkau <nbd@nbd.name>
 | |
| 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 <gvalkov@abv.bg>
 | |
| Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | |
| ---
 | |
| 
 | |
| --- a/net/mac80211/status.c
 | |
| +++ b/net/mac80211/status.c
 | |
| @@ -991,10 +991,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
 | |
| @@ -1129,11 +1125,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;
 | |
|  
 | |
| @@ -1143,6 +1146,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);
 | |
|  }
 |