mac80211: Update to version 5.4.36-1
[openwrt/openwrt.git] / package / kernel / mac80211 / patches / subsys / 300-mac80211-optimize-skb-resizing.patch
index e2fbdc6787fd65585a12143b6d7e5d4d6bbc0cab..dcdb94565d6d9f2f3ada489357c028d5b083b41f 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1779,6 +1779,9 @@ int ieee80211_tx_control_port(struct wip
+@@ -1782,6 +1782,9 @@ int ieee80211_tx_control_port(struct wip
                              const u8 *dest, __be16 proto, bool unencrypted);
  int ieee80211_probe_mesh_link(struct wiphy *wiphy, struct net_device *dev,
                              const u8 *buf, size_t len);
@@ -36,7 +36,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
 --- a/net/mac80211/status.c
 +++ b/net/mac80211/status.c
-@@ -655,6 +655,11 @@ void ieee80211_tx_monitor(struct ieee802
+@@ -815,6 +815,11 @@ void ieee80211_tx_monitor(struct ieee802
        struct net_device *prev_dev = NULL;
        int rtap_len;
  
@@ -46,11 +46,11 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +      }
 +
        /* send frame to monitor interfaces now */
-       rtap_len = ieee80211_tx_radiotap_len(info);
+       rtap_len = ieee80211_tx_radiotap_len(info, status);
        if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) {
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -1936,37 +1936,53 @@ static bool ieee80211_tx(struct ieee8021
+@@ -1943,37 +1943,53 @@ static bool ieee80211_tx(struct ieee8021
  }
  
  /* device xmit handlers */
@@ -67,14 +67,20 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        struct ieee80211_hdr *hdr;
 -      bool enc_tailroom;
 -      int tail_need = 0;
-+      int head_need, head_max;
-+      int tail_need, tail_max;
-+      bool enc_tailroom = false;
+-
 -      hdr = (struct ieee80211_hdr *) skb->data;
 -      enc_tailroom = may_encrypt &&
 -                     (sdata->crypto_tx_tailroom_needed_cnt ||
 -                      ieee80211_is_mgmt(hdr->frame_control));
+-
+-      if (enc_tailroom) {
+-              tail_need = IEEE80211_ENCRYPT_TAILROOM;
+-              tail_need -= skb_tailroom(skb);
+-              tail_need = max_t(int, tail_need, 0);
++      int head_need, head_max;
++      int tail_need, tail_max;
++      bool enc_tailroom = false;
++
 +      if (sdata && !hdr_len &&
 +          !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) {
 +              hdr = (struct ieee80211_hdr *) skb->data;
@@ -82,11 +88,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 +                              ieee80211_is_mgmt(hdr->frame_control));
 +              hdr_len += sdata->encrypt_headroom;
 +      }
--      if (enc_tailroom) {
--              tail_need = IEEE80211_ENCRYPT_TAILROOM;
--              tail_need -= skb_tailroom(skb);
--              tail_need = max_t(int, tail_need, 0);
++
 +      head_need = head_max = hdr_len;
 +      tail_need = tail_max = 0;
 +      if (!sdata) {
@@ -121,7 +123,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                wiphy_debug(local->hw.wiphy,
                            "failed to reallocate TX buffer\n");
                return -ENOMEM;
-@@ -1982,18 +1998,8 @@ void ieee80211_xmit(struct ieee80211_sub
+@@ -1989,18 +2005,8 @@ void ieee80211_xmit(struct ieee80211_sub
        struct ieee80211_local *local = sdata->local;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_hdr *hdr;
@@ -129,24 +131,25 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -      bool may_encrypt;
 -
 -      may_encrypt = !(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT);
--
 -      headroom = local->tx_headroom;
 -      if (may_encrypt)
 -              headroom += sdata->encrypt_headroom;
 -      headroom -= skb_headroom(skb);
 -      headroom = max_t(int, 0, headroom);
+-
 -      if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) {
 +      if (ieee80211_skb_resize(local, sdata, skb, 0, 0)) {
                ieee80211_free_txskb(&local->hw, skb);
                return;
        }
-@@ -2774,29 +2780,13 @@ static struct sk_buff *ieee80211_build_h
+@@ -2790,29 +2796,13 @@ static struct sk_buff *ieee80211_build_h
        }
  
        skb_pull(skb, skip_header_bytes);
 -      head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb);
--
++      head_need = hdrlen + encaps_len + meshhdrlen;
 -      /*
 -       * So we need to modify the skb header and hence need a copy of
 -       * that. The head_need variable above doesn't, so far, include
@@ -158,8 +161,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 -       * the ever needed space. Also, if we need to reallocate it anyway,
 -       * make it big enough for everything we may ever need.
 -       */
-+      head_need = hdrlen + encaps_len + meshhdrlen;
+-
 -      if (head_need > 0 || skb_cloned(skb)) {
 -              head_need += sdata->encrypt_headroom;
 -              head_need += local->tx_headroom;
@@ -177,7 +179,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
  
        if (encaps_data)
-@@ -3411,7 +3401,6 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3427,7 +3417,6 @@ static bool ieee80211_xmit_fast(struct i
        struct ieee80211_local *local = sdata->local;
        u16 ethertype = (skb->data[12] << 8) | skb->data[13];
        int extra_head = fast_tx->hdr_len - (ETH_HLEN - 2);
@@ -185,7 +187,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        struct ethhdr eth;
        struct ieee80211_tx_info *info;
        struct ieee80211_hdr *hdr = (void *)fast_tx->hdr;
-@@ -3463,10 +3452,7 @@ static bool ieee80211_xmit_fast(struct i
+@@ -3479,10 +3468,7 @@ static bool ieee80211_xmit_fast(struct i
         * as the may-encrypt argument for the resize to not account for
         * more room than we already have in 'extra_head'
         */