mac80211: unify 802.3 (offload) and 802.11 tx status codepath
authorFelix Fietkau <nbd@nbd.name>
Tue, 8 Sep 2020 12:36:58 +0000 (14:36 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 18 Sep 2020 10:20:49 +0000 (12:20 +0200)
Make ieee80211_tx_status_8023 call ieee80211_tx_status_ext, similar to
ieee80211_tx_status.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Link: https://lore.kernel.org/r/20200908123702.88454-11-nbd@nbd.name
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/status.c

index f868f90c913e5f1b8e8a535843775d56671e96ad..e793275d6e235fb7c4c75fbab8c2b900dce66cf6 100644 (file)
@@ -894,7 +894,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
        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;
@@ -987,17 +986,6 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
                    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
@@ -1092,10 +1080,12 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
        struct ieee80211_local *local = hw_to_local(hw);
        struct ieee80211_tx_info *info = status->info;
        struct ieee80211_sta *pubsta = status->sta;
+       struct sk_buff *skb = status->skb;
        struct ieee80211_supported_band *sband;
-       struct sta_info *sta;
+       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);
@@ -1147,7 +1137,18 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
                        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);
 
@@ -1162,6 +1163,12 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
        } 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);
 
@@ -1188,66 +1195,23 @@ void ieee80211_tx_status_8023(struct ieee80211_hw *hw,
                              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);