350-mac80211-add-hdrlen-to-ieee80211_tx_data.patch 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. From: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  2. Date: Fri, 19 Feb 2016 11:01:49 +0100
  3. Subject: [PATCH] mac80211: add hdrlen to ieee80211_tx_data
  4. This is preparation for adding support for inserting padding between the
  5. 802.11 header and LLC data
  6. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  7. Signed-off-by: Felix Fietkau <nbd@nbd.name>
  8. ---
  9. --- a/net/mac80211/ieee80211_i.h
  10. +++ b/net/mac80211/ieee80211_i.h
  11. @@ -179,6 +179,7 @@ struct ieee80211_tx_data {
  12. struct ieee80211_tx_rate rate;
  13. unsigned int flags;
  14. + unsigned int hdrlen;
  15. };
  16. --- a/net/mac80211/tx.c
  17. +++ b/net/mac80211/tx.c
  18. @@ -925,7 +925,7 @@ ieee80211_tx_h_fragment(struct ieee80211
  19. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  20. struct ieee80211_hdr *hdr = (void *)skb->data;
  21. int frag_threshold = tx->local->hw.wiphy->frag_threshold;
  22. - int hdrlen;
  23. + int hdrlen = tx->hdrlen;
  24. int fragnum;
  25. /* no matter what happens, tx->skb moves to tx->skbs */
  26. @@ -946,8 +946,6 @@ ieee80211_tx_h_fragment(struct ieee80211
  27. if (WARN_ON(info->flags & IEEE80211_TX_CTL_AMPDU))
  28. return TX_DROP;
  29. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  30. -
  31. /* internal error, why isn't DONTFRAG set? */
  32. if (WARN_ON(skb->len + FCS_LEN <= frag_threshold))
  33. return TX_DROP;
  34. @@ -1178,6 +1176,8 @@ ieee80211_tx_prepare(struct ieee80211_su
  35. hdr = (struct ieee80211_hdr *) skb->data;
  36. + tx->hdrlen = ieee80211_hdrlen(hdr->frame_control);
  37. +
  38. if (likely(sta)) {
  39. if (!IS_ERR(sta))
  40. tx->sta = sta;
  41. @@ -3525,6 +3525,7 @@ begin:
  42. tx.local = local;
  43. tx.skb = skb;
  44. tx.sdata = vif_to_sdata(info->control.vif);
  45. + tx.hdrlen = ieee80211_hdrlen(hdr->frame_control);
  46. if (txq->sta) {
  47. tx.sta = container_of(txq->sta, struct sta_info, sta);
  48. @@ -3569,7 +3570,7 @@ begin:
  49. if (tx.key &&
  50. (tx.key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))
  51. - pn_offs = ieee80211_hdrlen(hdr->frame_control);
  52. + pn_offs = tx.hdrlen;
  53. ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs,
  54. tx.key, skb);
  55. @@ -4028,6 +4029,7 @@ ieee80211_build_data_template(struct iee
  56. hdr = (void *)skb->data;
  57. tx.sta = sta_info_get(sdata, hdr->addr1);
  58. tx.skb = skb;
  59. + tx.hdrlen = ieee80211_hdrlen(hdr->frame_control);
  60. if (ieee80211_tx_h_select_key(&tx) != TX_CONTINUE) {
  61. rcu_read_unlock();
  62. --- a/net/mac80211/util.c
  63. +++ b/net/mac80211/util.c
  64. @@ -1396,6 +1396,7 @@ void ieee80211_send_auth(struct ieee8021
  65. struct ieee80211_local *local = sdata->local;
  66. struct sk_buff *skb;
  67. struct ieee80211_mgmt *mgmt;
  68. + unsigned int hdrlen;
  69. int err;
  70. /* 24 + 6 = header + auth_algo + auth_transaction + status_code */
  71. @@ -1419,8 +1420,10 @@ void ieee80211_send_auth(struct ieee8021
  72. skb_put_data(skb, extra, extra_len);
  73. if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) {
  74. + hdrlen = ieee80211_hdrlen(mgmt->frame_control);
  75. mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
  76. - err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx);
  77. + err = ieee80211_wep_encrypt(local, skb, hdrlen, key,
  78. + key_len, key_idx);
  79. WARN_ON(err);
  80. }
  81. --- a/net/mac80211/wep.c
  82. +++ b/net/mac80211/wep.c
  83. @@ -89,11 +89,11 @@ static void ieee80211_wep_get_iv(struct
  84. static u8 *ieee80211_wep_add_iv(struct ieee80211_local *local,
  85. struct sk_buff *skb,
  86. + unsigned int hdrlen,
  87. int keylen, int keyidx)
  88. {
  89. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  90. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  91. - unsigned int hdrlen;
  92. u8 *newhdr;
  93. hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
  94. @@ -101,7 +101,6 @@ static u8 *ieee80211_wep_add_iv(struct i
  95. if (WARN_ON(skb_headroom(skb) < IEEE80211_WEP_IV_LEN))
  96. return NULL;
  97. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  98. newhdr = skb_push(skb, IEEE80211_WEP_IV_LEN);
  99. memmove(newhdr, newhdr + IEEE80211_WEP_IV_LEN, hdrlen);
  100. @@ -160,6 +159,7 @@ int ieee80211_wep_encrypt_data(struct cr
  101. */
  102. int ieee80211_wep_encrypt(struct ieee80211_local *local,
  103. struct sk_buff *skb,
  104. + unsigned int hdrlen,
  105. const u8 *key, int keylen, int keyidx)
  106. {
  107. u8 *iv;
  108. @@ -169,7 +169,7 @@ int ieee80211_wep_encrypt(struct ieee802
  109. if (WARN_ON(skb_tailroom(skb) < IEEE80211_WEP_ICV_LEN))
  110. return -1;
  111. - iv = ieee80211_wep_add_iv(local, skb, keylen, keyidx);
  112. + iv = ieee80211_wep_add_iv(local, skb, hdrlen, keylen, keyidx);
  113. if (!iv)
  114. return -1;
  115. @@ -307,13 +307,14 @@ static int wep_encrypt_skb(struct ieee80
  116. struct ieee80211_key_conf *hw_key = info->control.hw_key;
  117. if (!hw_key) {
  118. - if (ieee80211_wep_encrypt(tx->local, skb, tx->key->conf.key,
  119. + if (ieee80211_wep_encrypt(tx->local, skb, tx->hdrlen,
  120. + tx->key->conf.key,
  121. tx->key->conf.keylen,
  122. tx->key->conf.keyidx))
  123. return -1;
  124. } else if ((hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) ||
  125. (hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) {
  126. - if (!ieee80211_wep_add_iv(tx->local, skb,
  127. + if (!ieee80211_wep_add_iv(tx->local, skb, tx->hdrlen,
  128. tx->key->conf.keylen,
  129. tx->key->conf.keyidx))
  130. return -1;
  131. --- a/net/mac80211/wep.h
  132. +++ b/net/mac80211/wep.h
  133. @@ -22,6 +22,7 @@ int ieee80211_wep_encrypt_data(struct cr
  134. size_t klen, u8 *data, size_t data_len);
  135. int ieee80211_wep_encrypt(struct ieee80211_local *local,
  136. struct sk_buff *skb,
  137. + unsigned int hdrlen,
  138. const u8 *key, int keylen, int keyidx);
  139. int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
  140. size_t klen, u8 *data, size_t data_len);
  141. --- a/net/mac80211/wpa.c
  142. +++ b/net/mac80211/wpa.c
  143. @@ -44,7 +44,7 @@ ieee80211_tx_h_michael_mic_add(struct ie
  144. skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control))
  145. return TX_CONTINUE;
  146. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  147. + hdrlen = tx->hdrlen;
  148. if (skb->len < hdrlen)
  149. return TX_DROP;
  150. @@ -195,7 +195,6 @@ mic_fail_no_key:
  151. static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
  152. {
  153. - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  154. struct ieee80211_key *key = tx->key;
  155. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  156. unsigned int hdrlen;
  157. @@ -210,7 +209,7 @@ static int tkip_encrypt_skb(struct ieee8
  158. return 0;
  159. }
  160. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  161. + hdrlen = tx->hdrlen;
  162. len = skb->len - hdrlen;
  163. if (info->control.hw_key)
  164. @@ -428,7 +427,7 @@ static int ccmp_encrypt_skb(struct ieee8
  165. return 0;
  166. }
  167. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  168. + hdrlen = tx->hdrlen;
  169. len = skb->len - hdrlen;
  170. if (info->control.hw_key)
  171. @@ -660,7 +659,7 @@ static int gcmp_encrypt_skb(struct ieee8
  172. return 0;
  173. }
  174. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  175. + hdrlen = tx->hdrlen;
  176. len = skb->len - hdrlen;
  177. if (info->control.hw_key)
  178. @@ -800,7 +799,6 @@ static ieee80211_tx_result
  179. ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx,
  180. struct sk_buff *skb)
  181. {
  182. - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  183. struct ieee80211_key *key = tx->key;
  184. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  185. int hdrlen;
  186. @@ -816,8 +814,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8
  187. pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC)))
  188. return TX_DROP;
  189. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  190. -
  191. + hdrlen = tx->hdrlen;
  192. pos = skb_push(skb, iv_len);
  193. memmove(pos, pos + iv_len, hdrlen);