forked from mirrors/linux
		
	mac80211: reduce duplication in tx status functions
Move redundant functionality from __ieee80211_tx_status into ieee80211_tx_status_ext. Preparation for unifying with the 802.3 tx status codepath. Signed-off-by: Felix Fietkau <nbd@nbd.name> Link: https://lore.kernel.org/r/20200908123702.88454-7-nbd@nbd.name Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
		
							parent
							
								
									6aea26ce5a
								
							
						
					
					
						commit
						3318111cf6
					
				
					 1 changed files with 35 additions and 66 deletions
				
			
		| 
						 | 
					@ -184,18 +184,6 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb)
 | 
				
			||||||
	struct ieee80211_mgmt *mgmt = (void *) skb->data;
 | 
						struct ieee80211_mgmt *mgmt = (void *) skb->data;
 | 
				
			||||||
	struct ieee80211_local *local = sta->local;
 | 
						struct ieee80211_local *local = sta->local;
 | 
				
			||||||
	struct ieee80211_sub_if_data *sdata = sta->sdata;
 | 
						struct ieee80211_sub_if_data *sdata = sta->sdata;
 | 
				
			||||||
	struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
 | 
					 | 
				
			||||||
		sta->status_stats.last_ack = jiffies;
 | 
					 | 
				
			||||||
		if (txinfo->status.is_valid_ack_signal) {
 | 
					 | 
				
			||||||
			sta->status_stats.last_ack_signal =
 | 
					 | 
				
			||||||
					 (s8)txinfo->status.ack_signal;
 | 
					 | 
				
			||||||
			sta->status_stats.ack_signal_filled = true;
 | 
					 | 
				
			||||||
			ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
 | 
					 | 
				
			||||||
					    -txinfo->status.ack_signal);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ieee80211_is_data_qos(mgmt->frame_control)) {
 | 
						if (ieee80211_is_data_qos(mgmt->frame_control)) {
 | 
				
			||||||
		struct ieee80211_hdr *hdr = (void *) skb->data;
 | 
							struct ieee80211_hdr *hdr = (void *) skb->data;
 | 
				
			||||||
| 
						 | 
					@ -890,7 +878,8 @@ void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
					static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
				
			||||||
				  struct ieee80211_tx_status *status)
 | 
									  struct ieee80211_tx_status *status,
 | 
				
			||||||
 | 
									  int rates_idx, int retry_count)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *skb = status->skb;
 | 
						struct sk_buff *skb = status->skb;
 | 
				
			||||||
	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 | 
						struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 | 
				
			||||||
| 
						 | 
					@ -899,8 +888,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
				
			||||||
	struct sta_info *sta;
 | 
						struct sta_info *sta;
 | 
				
			||||||
	__le16 fc;
 | 
						__le16 fc;
 | 
				
			||||||
	struct ieee80211_supported_band *sband;
 | 
						struct ieee80211_supported_band *sband;
 | 
				
			||||||
	int retry_count;
 | 
					 | 
				
			||||||
	int rates_idx;
 | 
					 | 
				
			||||||
	bool send_to_cooked;
 | 
						bool send_to_cooked;
 | 
				
			||||||
	bool acked;
 | 
						bool acked;
 | 
				
			||||||
	bool noack_success;
 | 
						bool noack_success;
 | 
				
			||||||
| 
						 | 
					@ -909,8 +896,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
				
			||||||
	int tid = IEEE80211_NUM_TIDS;
 | 
						int tid = IEEE80211_NUM_TIDS;
 | 
				
			||||||
	u16 tx_time_est;
 | 
						u16 tx_time_est;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sband = local->hw.wiphy->bands[info->band];
 | 
						sband = local->hw.wiphy->bands[info->band];
 | 
				
			||||||
	fc = hdr->frame_control;
 | 
						fc = hdr->frame_control;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -987,23 +972,13 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
				
			||||||
		if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
 | 
							if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) {
 | 
				
			||||||
			ieee80211_handle_filtered_frame(local, sta, skb);
 | 
								ieee80211_handle_filtered_frame(local, sta, skb);
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		} else {
 | 
							} else if (ieee80211_is_data_present(fc)) {
 | 
				
			||||||
			if (!acked && !noack_success)
 | 
					 | 
				
			||||||
				sta->status_stats.retry_failed++;
 | 
					 | 
				
			||||||
			sta->status_stats.retry_count += retry_count;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (ieee80211_is_data_present(fc)) {
 | 
					 | 
				
			||||||
			if (!acked && !noack_success)
 | 
								if (!acked && !noack_success)
 | 
				
			||||||
				sta->status_stats.msdu_failed[tid]++;
 | 
									sta->status_stats.msdu_failed[tid]++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			sta->status_stats.msdu_retries[tid] +=
 | 
								sta->status_stats.msdu_retries[tid] +=
 | 
				
			||||||
				retry_count;
 | 
									retry_count;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		rate_control_tx_status(local, sband, status);
 | 
					 | 
				
			||||||
		if (ieee80211_vif_is_mesh(&sta->sdata->vif))
 | 
					 | 
				
			||||||
			ieee80211s_update_metric(local, sta, status);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
 | 
							if (!(info->flags & IEEE80211_TX_CTL_INJECTED) && acked)
 | 
				
			||||||
			ieee80211_frame_acked(sta, skb);
 | 
								ieee80211_frame_acked(sta, skb);
 | 
				
			||||||
| 
						 | 
					@ -1029,20 +1004,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
 | 
				
			||||||
							     true);
 | 
												     true);
 | 
				
			||||||
			ieee80211_info_set_tx_time_est(info, 0);
 | 
								ieee80211_info_set_tx_time_est(info, 0);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
 | 
					 | 
				
			||||||
			if (acked) {
 | 
					 | 
				
			||||||
				if (sta->status_stats.lost_packets)
 | 
					 | 
				
			||||||
					sta->status_stats.lost_packets = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				/* Track when last TDLS packet was ACKed */
 | 
					 | 
				
			||||||
				sta->status_stats.last_pkt_time = jiffies;
 | 
					 | 
				
			||||||
			} else if (noack_success) {
 | 
					 | 
				
			||||||
				/* nothing to do here, do not account as lost */
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ieee80211_lost_packet(sta, info);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* SNMP counters
 | 
						/* SNMP counters
 | 
				
			||||||
| 
						 | 
					@ -1126,7 +1087,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
 | 
				
			||||||
	if (sta)
 | 
						if (sta)
 | 
				
			||||||
		status.sta = &sta->sta;
 | 
							status.sta = &sta->sta;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__ieee80211_tx_status(hw, &status);
 | 
						ieee80211_tx_status_ext(hw, &status);
 | 
				
			||||||
	rcu_read_unlock();
 | 
						rcu_read_unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(ieee80211_tx_status);
 | 
					EXPORT_SYMBOL(ieee80211_tx_status);
 | 
				
			||||||
| 
						 | 
					@ -1139,7 +1100,7 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 | 
				
			||||||
	struct ieee80211_sta *pubsta = status->sta;
 | 
						struct ieee80211_sta *pubsta = status->sta;
 | 
				
			||||||
	struct ieee80211_supported_band *sband;
 | 
						struct ieee80211_supported_band *sband;
 | 
				
			||||||
	struct sta_info *sta;
 | 
						struct sta_info *sta;
 | 
				
			||||||
	int retry_count;
 | 
						int rates_idx, retry_count;
 | 
				
			||||||
	bool acked, noack_success;
 | 
						bool acked, noack_success;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pubsta) {
 | 
						if (pubsta) {
 | 
				
			||||||
| 
						 | 
					@ -1149,13 +1110,7 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 | 
				
			||||||
			sta->tx_stats.last_rate_info = *status->rate;
 | 
								sta->tx_stats.last_rate_info = *status->rate;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (status->skb)
 | 
						rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
 | 
				
			||||||
		return __ieee80211_tx_status(hw, status);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!status->sta)
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ieee80211_tx_get_rates(hw, info, &retry_count);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sband = hw->wiphy->bands[info->band];
 | 
						sband = hw->wiphy->bands[info->band];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1167,6 +1122,7 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 | 
				
			||||||
			sta->status_stats.retry_failed++;
 | 
								sta->status_stats.retry_failed++;
 | 
				
			||||||
		sta->status_stats.retry_count += retry_count;
 | 
							sta->status_stats.retry_count += retry_count;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
 | 
				
			||||||
			if (acked) {
 | 
								if (acked) {
 | 
				
			||||||
				sta->status_stats.last_ack = jiffies;
 | 
									sta->status_stats.last_ack = jiffies;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1175,6 +1131,14 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				/* Track when last packet was ACKed */
 | 
									/* Track when last packet was ACKed */
 | 
				
			||||||
				sta->status_stats.last_pkt_time = jiffies;
 | 
									sta->status_stats.last_pkt_time = jiffies;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if (info->status.is_valid_ack_signal) {
 | 
				
			||||||
 | 
										sta->status_stats.last_ack_signal =
 | 
				
			||||||
 | 
												 (s8)info->status.ack_signal;
 | 
				
			||||||
 | 
										sta->status_stats.ack_signal_filled = true;
 | 
				
			||||||
 | 
										ewma_avg_signal_add(&sta->status_stats.avg_ack_signal,
 | 
				
			||||||
 | 
												    -info->status.ack_signal);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
 | 
								} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
			} else if (noack_success) {
 | 
								} else if (noack_success) {
 | 
				
			||||||
| 
						 | 
					@ -1182,12 +1146,17 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				ieee80211_lost_packet(sta, info);
 | 
									ieee80211_lost_packet(sta, info);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rate_control_tx_status(local, sband, status);
 | 
							rate_control_tx_status(local, sband, status);
 | 
				
			||||||
		if (ieee80211_vif_is_mesh(&sta->sdata->vif))
 | 
							if (ieee80211_vif_is_mesh(&sta->sdata->vif))
 | 
				
			||||||
			ieee80211s_update_metric(local, sta, status);
 | 
								ieee80211s_update_metric(local, sta, status);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (status->skb)
 | 
				
			||||||
 | 
							return __ieee80211_tx_status(hw, status, rates_idx,
 | 
				
			||||||
 | 
										     retry_count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (acked || noack_success) {
 | 
						if (acked || noack_success) {
 | 
				
			||||||
		I802_DEBUG_INC(local->dot11TransmittedFrameCount);
 | 
							I802_DEBUG_INC(local->dot11TransmittedFrameCount);
 | 
				
			||||||
		if (!pubsta)
 | 
							if (!pubsta)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue