123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- From: Felix Fietkau <[email protected]>
- Date: Mon, 17 Aug 2020 13:54:19 +0200
- Subject: [PATCH] mac80211: unify 802.3 (offload) and 802.11 tx status
- codepath
- Make ieee80211_tx_status_8023 call ieee80211_tx_status_ext, similar to
- ieee80211_tx_status.
- Signed-off-by: Felix Fietkau <[email protected]>
- ---
- --- a/net/mac80211/status.c
- +++ b/net/mac80211/status.c
- @@ -901,7 +901,6 @@ static void __ieee80211_tx_status(struct
- struct ieee80211_bar *bar;
- int shift = 0;
- int tid = IEEE80211_NUM_TIDS;
- - u16 tx_time_est;
-
- sband = local->hw.wiphy->bands[info->band];
- fc = hdr->frame_control;
- @@ -994,17 +993,6 @@ static void __ieee80211_tx_status(struct
- ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
- ieee80211_sta_tx_notify(sta->sdata, (void *) skb->data,
- acked, info->status.tx_time);
- -
- - if ((tx_time_est = ieee80211_info_get_tx_time_est(info)) > 0) {
- - /* Do this here to avoid the expensive lookup of the sta
- - * in ieee80211_report_used_skb().
- - */
- - ieee80211_sta_update_pending_airtime(local, sta,
- - skb_get_queue_mapping(skb),
- - tx_time_est,
- - true);
- - ieee80211_info_set_tx_time_est(info, 0);
- - }
- }
-
- /* SNMP counters
- @@ -1100,9 +1088,11 @@ void ieee80211_tx_status_ext(struct ieee
- struct ieee80211_tx_info *info = status->info;
- struct ieee80211_sta *pubsta = status->sta;
- struct ieee80211_supported_band *sband;
- - struct sta_info *sta;
- + struct sk_buff *skb = status->skb;
- + struct sta_info *sta = NULL;
- int rates_idx, retry_count;
- bool acked, noack_success;
- + u16 tx_time_est;
-
- if (pubsta) {
- sta = container_of(pubsta, struct sta_info, sta);
- @@ -1154,7 +1144,18 @@ void ieee80211_tx_status_ext(struct ieee
- ieee80211s_update_metric(local, sta, status);
- }
-
- - if (status->skb)
- + if (skb && (tx_time_est = ieee80211_info_get_tx_time_est(info)) > 0) {
- + /* Do this here to avoid the expensive lookup of the sta
- + * in ieee80211_report_used_skb().
- + */
- + ieee80211_sta_update_pending_airtime(local, sta,
- + skb_get_queue_mapping(skb),
- + tx_time_est,
- + true);
- + ieee80211_info_set_tx_time_est(info, 0);
- + }
- +
- + if (skb && !(info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
- return __ieee80211_tx_status(hw, status, rates_idx,
- retry_count);
-
- @@ -1169,6 +1170,12 @@ void ieee80211_tx_status_ext(struct ieee
- } else {
- I802_DEBUG_INC(local->dot11FailedCount);
- }
- +
- + if (!skb)
- + return;
- +
- + ieee80211_report_used_skb(local, skb, false);
- + dev_kfree_skb(skb);
- }
- EXPORT_SYMBOL(ieee80211_tx_status_ext);
-
- @@ -1195,66 +1202,23 @@ void ieee80211_tx_status_8023(struct iee
- struct ieee80211_vif *vif,
- struct sk_buff *skb)
- {
- - struct ieee80211_local *local = hw_to_local(hw);
- struct ieee80211_sub_if_data *sdata;
- - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- + struct ieee80211_tx_status status = {
- + .skb = skb,
- + .info = IEEE80211_SKB_CB(skb),
- + };
- struct sta_info *sta;
- - int retry_count;
- - int rates_idx;
- - bool acked;
-
- sdata = vif_to_sdata(vif);
-
- - acked = info->flags & IEEE80211_TX_STAT_ACK;
- - rates_idx = ieee80211_tx_get_rates(hw, info, &retry_count);
- -
- rcu_read_lock();
-
- - if (ieee80211_lookup_ra_sta(sdata, skb, &sta))
- - goto counters_update;
- -
- - if (IS_ERR(sta))
- - goto counters_update;
- -
- - if (!acked)
- - sta->status_stats.retry_failed++;
- -
- - if (rates_idx != -1)
- - sta->tx_stats.last_rate = info->status.rates[rates_idx];
- -
- - sta->status_stats.retry_count += retry_count;
- -
- - if (ieee80211_hw_check(hw, REPORTS_TX_ACK_STATUS)) {
- - sta->status_stats.last_ack = jiffies;
- - if (info->flags & IEEE80211_TX_STAT_ACK) {
- - if (sta->status_stats.lost_packets)
- - sta->status_stats.lost_packets = 0;
- + if (!ieee80211_lookup_ra_sta(sdata, skb, &sta) && !IS_ERR(sta))
- + status.sta = &sta->sta;
-
- - sta->status_stats.last_pkt_time = jiffies;
- - } else {
- - ieee80211_lost_packet(sta, info);
- - }
- - }
- + ieee80211_tx_status_ext(hw, &status);
-
- -counters_update:
- rcu_read_unlock();
- - ieee80211_led_tx(local);
- -
- - if (!(info->flags & IEEE80211_TX_STAT_ACK) &&
- - !(info->flags & IEEE80211_TX_STAT_NOACK_TRANSMITTED))
- - goto skip_stats_update;
- -
- - I802_DEBUG_INC(local->dot11TransmittedFrameCount);
- - if (is_multicast_ether_addr(skb->data))
- - I802_DEBUG_INC(local->dot11MulticastTransmittedFrameCount);
- - if (retry_count > 0)
- - I802_DEBUG_INC(local->dot11RetryCount);
- - if (retry_count > 1)
- - I802_DEBUG_INC(local->dot11MultipleRetryCount);
- -
- -skip_stats_update:
- - ieee80211_report_used_skb(local, skb, false);
- - dev_kfree_skb(skb);
- }
- EXPORT_SYMBOL(ieee80211_tx_status_8023);
-
|