aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wpa.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/wpa.c')
-rw-r--r--net/mac80211/wpa.c61
1 files changed, 34 insertions, 27 deletions
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 1142b42b5fe9..4a2a9aa638b3 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -82,14 +82,14 @@ ieee80211_tx_h_michael_mic_add(struct ieee80211_txrx_data *tx)
82 82
83 fc = tx->fc; 83 fc = tx->fc;
84 84
85 if (!tx->key || tx->key->alg != ALG_TKIP || skb->len < 24 || 85 if (!tx->key || tx->key->conf.alg != ALG_TKIP || skb->len < 24 ||
86 !WLAN_FC_DATA_PRESENT(fc)) 86 !WLAN_FC_DATA_PRESENT(fc))
87 return TXRX_CONTINUE; 87 return TXRX_CONTINUE;
88 88
89 if (ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len)) 89 if (ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len))
90 return TXRX_DROP; 90 return TXRX_DROP;
91 91
92 if (!tx->key->force_sw_encrypt && 92 if (!(tx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) &&
93 !(tx->flags & IEEE80211_TXRXD_FRAGMENTED) && 93 !(tx->flags & IEEE80211_TXRXD_FRAGMENTED) &&
94 !(tx->local->hw.flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) && 94 !(tx->local->hw.flags & IEEE80211_HW_TKIP_INCLUDE_MMIC) &&
95 !wpa_test) { 95 !wpa_test) {
@@ -114,8 +114,8 @@ ieee80211_tx_h_michael_mic_add(struct ieee80211_txrx_data *tx)
114#else 114#else
115 authenticator = 1; 115 authenticator = 1;
116#endif 116#endif
117 key = &tx->key->key[authenticator ? ALG_TKIP_TEMP_AUTH_TX_MIC_KEY : 117 key = &tx->key->conf.key[authenticator ? ALG_TKIP_TEMP_AUTH_TX_MIC_KEY :
118 ALG_TKIP_TEMP_AUTH_RX_MIC_KEY]; 118 ALG_TKIP_TEMP_AUTH_RX_MIC_KEY];
119 mic = skb_put(skb, MICHAEL_MIC_LEN); 119 mic = skb_put(skb, MICHAEL_MIC_LEN);
120 michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic); 120 michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic);
121 121
@@ -141,12 +141,12 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_txrx_data *rx)
141 if (rx->local->hw.flags & IEEE80211_HW_DEVICE_STRIPS_MIC) 141 if (rx->local->hw.flags & IEEE80211_HW_DEVICE_STRIPS_MIC)
142 return TXRX_CONTINUE; 142 return TXRX_CONTINUE;
143 143
144 if (!rx->key || rx->key->alg != ALG_TKIP || 144 if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
145 !(rx->fc & IEEE80211_FCTL_PROTECTED) || !WLAN_FC_DATA_PRESENT(fc)) 145 !(rx->fc & IEEE80211_FCTL_PROTECTED) || !WLAN_FC_DATA_PRESENT(fc))
146 return TXRX_CONTINUE; 146 return TXRX_CONTINUE;
147 147
148 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) && 148 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
149 !rx->key->force_sw_encrypt) { 149 !(rx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)) {
150 if (rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) { 150 if (rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) {
151 if (skb->len < MICHAEL_MIC_LEN) 151 if (skb->len < MICHAEL_MIC_LEN)
152 return TXRX_DROP; 152 return TXRX_DROP;
@@ -169,8 +169,8 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_txrx_data *rx)
169#else 169#else
170 authenticator = 1; 170 authenticator = 1;
171#endif 171#endif
172 key = &rx->key->key[authenticator ? ALG_TKIP_TEMP_AUTH_RX_MIC_KEY : 172 key = &rx->key->conf.key[authenticator ? ALG_TKIP_TEMP_AUTH_RX_MIC_KEY :
173 ALG_TKIP_TEMP_AUTH_TX_MIC_KEY]; 173 ALG_TKIP_TEMP_AUTH_TX_MIC_KEY];
174 michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic); 174 michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic);
175 if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) { 175 if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) {
176 if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH)) 176 if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH))
@@ -179,7 +179,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_txrx_data *rx)
179 printk(KERN_DEBUG "%s: invalid Michael MIC in data frame from " 179 printk(KERN_DEBUG "%s: invalid Michael MIC in data frame from "
180 MAC_FMT "\n", rx->dev->name, MAC_ARG(sa)); 180 MAC_FMT "\n", rx->dev->name, MAC_ARG(sa));
181 181
182 mac80211_ev_michael_mic_failure(rx->dev, rx->key->keyidx, 182 mac80211_ev_michael_mic_failure(rx->dev, rx->key->conf.keyidx,
183 (void *) skb->data); 183 (void *) skb->data);
184 return TXRX_DROP; 184 return TXRX_DROP;
185 } 185 }
@@ -205,7 +205,11 @@ static int tkip_encrypt_skb(struct ieee80211_txrx_data *tx,
205 hdrlen = ieee80211_get_hdrlen(fc); 205 hdrlen = ieee80211_get_hdrlen(fc);
206 len = skb->len - hdrlen; 206 len = skb->len - hdrlen;
207 207
208 tailneed = !tx->key->force_sw_encrypt ? 0 : TKIP_ICV_LEN; 208 if (tx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)
209 tailneed = TKIP_ICV_LEN;
210 else
211 tailneed = 0;
212
209 if ((skb_headroom(skb) < TKIP_IV_LEN || 213 if ((skb_headroom(skb) < TKIP_IV_LEN ||
210 skb_tailroom(skb) < tailneed)) { 214 skb_tailroom(skb) < tailneed)) {
211 I802_DEBUG_INC(tx->local->tx_expand_skb_head); 215 I802_DEBUG_INC(tx->local->tx_expand_skb_head);
@@ -223,7 +227,7 @@ static int tkip_encrypt_skb(struct ieee80211_txrx_data *tx,
223 if (key->u.tkip.iv16 == 0) 227 if (key->u.tkip.iv16 == 0)
224 key->u.tkip.iv32++; 228 key->u.tkip.iv32++;
225 229
226 if (!tx->key->force_sw_encrypt) { 230 if (!(tx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)) {
227 u32 flags = tx->local->hw.flags; 231 u32 flags = tx->local->hw.flags;
228 hdr = (struct ieee80211_hdr *)skb->data; 232 hdr = (struct ieee80211_hdr *)skb->data;
229 233
@@ -250,7 +254,7 @@ static int tkip_encrypt_skb(struct ieee80211_txrx_data *tx,
250 ~IEEE80211_TXCTL_TKIP_NEW_PHASE1_KEY; 254 ~IEEE80211_TXCTL_TKIP_NEW_PHASE1_KEY;
251 } 255 }
252 256
253 tx->u.tx.control->key_idx = tx->key->hw_key_idx; 257 tx->u.tx.control->key_idx = tx->key->conf.hw_key_idx;
254 return 0; 258 return 0;
255 } 259 }
256 260
@@ -275,18 +279,18 @@ ieee80211_tx_h_tkip_encrypt(struct ieee80211_txrx_data *tx)
275 279
276 fc = le16_to_cpu(hdr->frame_control); 280 fc = le16_to_cpu(hdr->frame_control);
277 281
278 if (!key || key->alg != ALG_TKIP || !WLAN_FC_DATA_PRESENT(fc)) 282 if (!key || key->conf.alg != ALG_TKIP || !WLAN_FC_DATA_PRESENT(fc))
279 return TXRX_CONTINUE; 283 return TXRX_CONTINUE;
280 284
281 tx->u.tx.control->icv_len = TKIP_ICV_LEN; 285 tx->u.tx.control->icv_len = TKIP_ICV_LEN;
282 tx->u.tx.control->iv_len = TKIP_IV_LEN; 286 tx->u.tx.control->iv_len = TKIP_IV_LEN;
283 ieee80211_tx_set_iswep(tx); 287 ieee80211_tx_set_iswep(tx);
284 288
285 if (!tx->key->force_sw_encrypt && 289 if (!(tx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) &&
286 !(tx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) && 290 !(tx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) &&
287 !wpa_test) { 291 !wpa_test) {
288 /* hwaccel - with no need for preallocated room for IV/ICV */ 292 /* hwaccel - with no need for preallocated room for IV/ICV */
289 tx->u.tx.control->key_idx = tx->key->hw_key_idx; 293 tx->u.tx.control->key_idx = tx->key->conf.hw_key_idx;
290 return TXRX_CONTINUE; 294 return TXRX_CONTINUE;
291 } 295 }
292 296
@@ -318,7 +322,7 @@ ieee80211_rx_h_tkip_decrypt(struct ieee80211_txrx_data *rx)
318 fc = le16_to_cpu(hdr->frame_control); 322 fc = le16_to_cpu(hdr->frame_control);
319 hdrlen = ieee80211_get_hdrlen(fc); 323 hdrlen = ieee80211_get_hdrlen(fc);
320 324
321 if (!rx->key || rx->key->alg != ALG_TKIP || 325 if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
322 !(rx->fc & IEEE80211_FCTL_PROTECTED) || 326 !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
323 (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA) 327 (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
324 return TXRX_CONTINUE; 328 return TXRX_CONTINUE;
@@ -327,7 +331,7 @@ ieee80211_rx_h_tkip_decrypt(struct ieee80211_txrx_data *rx)
327 return TXRX_DROP; 331 return TXRX_DROP;
328 332
329 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) && 333 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
330 !rx->key->force_sw_encrypt) { 334 !(key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)) {
331 if (!(rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) { 335 if (!(rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) {
332 /* Hardware takes care of all processing, including 336 /* Hardware takes care of all processing, including
333 * replay protection, so no need to continue here. */ 337 * replay protection, so no need to continue here. */
@@ -471,7 +475,10 @@ static int ccmp_encrypt_skb(struct ieee80211_txrx_data *tx,
471 hdrlen = ieee80211_get_hdrlen(fc); 475 hdrlen = ieee80211_get_hdrlen(fc);
472 len = skb->len - hdrlen; 476 len = skb->len - hdrlen;
473 477
474 tailneed = !key->force_sw_encrypt ? 0 : CCMP_MIC_LEN; 478 if (key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)
479 tailneed = CCMP_MIC_LEN;
480 else
481 tailneed = 0;
475 482
476 if ((skb_headroom(skb) < CCMP_HDR_LEN || 483 if ((skb_headroom(skb) < CCMP_HDR_LEN ||
477 skb_tailroom(skb) < tailneed)) { 484 skb_tailroom(skb) < tailneed)) {
@@ -495,11 +502,11 @@ static int ccmp_encrypt_skb(struct ieee80211_txrx_data *tx,
495 break; 502 break;
496 } 503 }
497 504
498 ccmp_pn2hdr(pos, pn, key->keyidx); 505 ccmp_pn2hdr(pos, pn, key->conf.keyidx);
499 506
500 if (!key->force_sw_encrypt) { 507 if (!(key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)) {
501 /* hwaccel - with preallocated room for CCMP header */ 508 /* hwaccel - with preallocated room for CCMP header */
502 tx->u.tx.control->key_idx = key->hw_key_idx; 509 tx->u.tx.control->key_idx = key->conf.hw_key_idx;
503 return 0; 510 return 0;
504 } 511 }
505 512
@@ -523,18 +530,18 @@ ieee80211_tx_h_ccmp_encrypt(struct ieee80211_txrx_data *tx)
523 530
524 fc = le16_to_cpu(hdr->frame_control); 531 fc = le16_to_cpu(hdr->frame_control);
525 532
526 if (!key || key->alg != ALG_CCMP || !WLAN_FC_DATA_PRESENT(fc)) 533 if (!key || key->conf.alg != ALG_CCMP || !WLAN_FC_DATA_PRESENT(fc))
527 return TXRX_CONTINUE; 534 return TXRX_CONTINUE;
528 535
529 tx->u.tx.control->icv_len = CCMP_MIC_LEN; 536 tx->u.tx.control->icv_len = CCMP_MIC_LEN;
530 tx->u.tx.control->iv_len = CCMP_HDR_LEN; 537 tx->u.tx.control->iv_len = CCMP_HDR_LEN;
531 ieee80211_tx_set_iswep(tx); 538 ieee80211_tx_set_iswep(tx);
532 539
533 if (!tx->key->force_sw_encrypt && 540 if (!(tx->key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) &&
534 !(tx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) { 541 !(tx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) {
535 /* hwaccel - with no need for preallocated room for CCMP " 542 /* hwaccel - with no need for preallocated room for CCMP "
536 * header or MIC fields */ 543 * header or MIC fields */
537 tx->u.tx.control->key_idx = tx->key->hw_key_idx; 544 tx->u.tx.control->key_idx = tx->key->conf.hw_key_idx;
538 return TXRX_CONTINUE; 545 return TXRX_CONTINUE;
539 } 546 }
540 547
@@ -569,7 +576,7 @@ ieee80211_rx_h_ccmp_decrypt(struct ieee80211_txrx_data *rx)
569 fc = le16_to_cpu(hdr->frame_control); 576 fc = le16_to_cpu(hdr->frame_control);
570 hdrlen = ieee80211_get_hdrlen(fc); 577 hdrlen = ieee80211_get_hdrlen(fc);
571 578
572 if (!key || key->alg != ALG_CCMP || 579 if (!key || key->conf.alg != ALG_CCMP ||
573 !(rx->fc & IEEE80211_FCTL_PROTECTED) || 580 !(rx->fc & IEEE80211_FCTL_PROTECTED) ||
574 (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA) 581 (rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
575 return TXRX_CONTINUE; 582 return TXRX_CONTINUE;
@@ -579,7 +586,7 @@ ieee80211_rx_h_ccmp_decrypt(struct ieee80211_txrx_data *rx)
579 return TXRX_DROP; 586 return TXRX_DROP;
580 587
581 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) && 588 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
582 !key->force_sw_encrypt && 589 !(key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT) &&
583 !(rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV)) 590 !(rx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV))
584 return TXRX_CONTINUE; 591 return TXRX_CONTINUE;
585 592
@@ -600,7 +607,7 @@ ieee80211_rx_h_ccmp_decrypt(struct ieee80211_txrx_data *rx)
600 } 607 }
601 608
602 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) && 609 if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
603 !key->force_sw_encrypt) { 610 !(key->conf.flags & IEEE80211_KEY_FORCE_SW_ENCRYPT)) {
604 /* hwaccel has already decrypted frame and verified MIC */ 611 /* hwaccel has already decrypted frame and verified MIC */
605 } else { 612 } else {
606 u8 *scratch, *b_0, *aad; 613 u8 *scratch, *b_0, *aad;