mac80211: add missing change for encap offload on devices with sw rate control
authorFelix Fietkau <nbd@nbd.name>
Mon, 16 Aug 2021 12:10:19 +0000 (14:10 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 24 Aug 2021 15:35:45 +0000 (17:35 +0200)
Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/mac80211/patches/subsys/376-mac80211-add-rate-control-support-for-encap-offload.patch
package/kernel/mac80211/patches/subsys/383-mac80211-fix-enabling-4-address-mode-on-a-sta-vif-af.patch
package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch [new file with mode: 0644]

index 43a4a1334df0e47276071ba38ee16671c7247f7d..2a4551023f2f9d1167ce881e5bc20476eb81a7ec 100644 (file)
@@ -7,24 +7,6 @@ The software rate control cannot deal with encap offload, so fix it.
 Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
 ---
 
---- a/net/mac80211/ieee80211_i.h
-+++ b/net/mac80211/ieee80211_i.h
-@@ -2024,6 +2024,15 @@ static inline void ieee80211_tx_skb(stru
-       ieee80211_tx_skb_tid(sdata, skb, 7);
- }
-+static inline bool ieee80211_is_tx_data(struct sk_buff *skb)
-+{
-+      struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-+      struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-+
-+      return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
-+             ieee80211_is_data(hdr->frame_control);
-+}
-+
- u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
-                              struct ieee802_11_elems *elems,
-                              u64 filter, u32 crc, u8 *transmitter_bssid,
 --- a/net/mac80211/rate.c
 +++ b/net/mac80211/rate.c
 @@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie
@@ -44,7 +26,18 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
  }
  
  static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate,
-@@ -870,7 +866,6 @@ void ieee80211_get_tx_rates(struct ieee8
+@@ -396,6 +392,10 @@ static bool rate_control_send_low(struct
+       int mcast_rate;
+       bool use_basicrate = false;
++      if (ieee80211_is_tx_data(txrc->skb) &&
++          info->flags & IEEE80211_TX_CTL_NO_ACK)
++              return false;
++
+       if (!pubsta || rc_no_data_or_no_ack_use_min(txrc)) {
+               __rate_control_send_low(txrc->hw, sband, pubsta, info,
+                                       txrc->rate_idx_mask);
+@@ -870,7 +870,6 @@ void ieee80211_get_tx_rates(struct ieee8
                            int max_rates)
  {
        struct ieee80211_sub_if_data *sdata;
@@ -52,7 +45,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_supported_band *sband;
  
-@@ -882,7 +877,7 @@ void ieee80211_get_tx_rates(struct ieee8
+@@ -882,7 +881,7 @@ void ieee80211_get_tx_rates(struct ieee8
        sdata = vif_to_sdata(vif);
        sband = sdata->local->hw.wiphy->bands[info->band];
  
@@ -117,3 +110,28 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
  
        if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
                struct sta_info *sta = container_of(txq->sta, struct sta_info,
+--- a/include/net/mac80211.h
++++ b/include/net/mac80211.h
+@@ -6728,4 +6728,22 @@ struct sk_buff *ieee80211_get_fils_disco
+ struct sk_buff *
+ ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
+                                         struct ieee80211_vif *vif);
++
++/**
++ * ieee80211_is_tx_data - check if frame is a data frame
++ *
++ * The function is used to check if a frame is a data frame. Frames with
++ * hardware encapsulation enabled are data frames.
++ *
++ * @skb: the frame to be transmitted.
++ */
++static inline bool ieee80211_is_tx_data(struct sk_buff *skb)
++{
++      struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
++      struct ieee80211_hdr *hdr = (void *) skb->data;
++
++      return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
++             ieee80211_is_data(hdr->frame_control);
++}
++
+ #endif /* MAC80211_H */
index 5a82f00c9e78b27767d03923f146e08b265e4ace..c1f77ff5d967d6e2efdb5a3bd42ad134d790b56f 100644 (file)
@@ -48,7 +48,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -2224,6 +2224,8 @@ void ieee80211_dynamic_ps_timer(struct t
+@@ -2215,6 +2215,8 @@ void ieee80211_dynamic_ps_timer(struct t
  void ieee80211_send_nullfunc(struct ieee80211_local *local,
                             struct ieee80211_sub_if_data *sdata,
                             bool powersave);
diff --git a/package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch b/package/kernel/mac80211/patches/subsys/386-mac80211-check-per-vif-offload_flags-in-Tx-path.patch
new file mode 100644 (file)
index 0000000..cfad1c3
--- /dev/null
@@ -0,0 +1,26 @@
+From: Ryder Lee <ryder.lee@mediatek.com>
+Date: Fri, 18 Jun 2021 04:38:59 +0800
+Subject: [PATCH] mac80211: check per vif offload_flags in Tx path
+
+offload_flags has been introduced to indicate encap status of each interface.
+An interface can encap offload at runtime, or if it has some extra limitations
+it can simply override the flags, so it's more flexible to check offload_flags
+in Tx path.
+
+Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
+Link: https://lore.kernel.org/r/177785418cf407808bf3a44760302d0647076990.1623961575.git.ryder.lee@mediatek.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+---
+
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -3309,6 +3309,9 @@ static bool ieee80211_amsdu_aggregate(st
+       if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
+               return false;
++      if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
++              return false;
++
+       if (skb_is_gso(skb))
+               return false;