|
|
|
@ -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) {
|
|
|
|
@ -129,13 +131,13 @@ 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);
|
|
|
|
@ -146,7 +148,8 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|