Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
[pandora-kernel.git] / net / mac80211 / wpa.c
1 /*
2  * Copyright 2002-2004, Instant802 Networks, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8
9 #include <linux/netdevice.h>
10 #include <linux/types.h>
11 #include <linux/slab.h>
12 #include <linux/skbuff.h>
13 #include <linux/compiler.h>
14 #include <net/mac80211.h>
15
16 #include "ieee80211_i.h"
17 #include "michael.h"
18 #include "tkip.h"
19 #include "aes_ccm.h"
20 #include "wpa.h"
21
22 static int ieee80211_get_hdr_info(const struct sk_buff *skb, u8 **sa, u8 **da,
23                                   u8 *qos_tid, u8 **data, size_t *data_len)
24 {
25         struct ieee80211_hdr *hdr;
26         size_t hdrlen;
27         u16 fc;
28         int a4_included;
29         u8 *pos;
30
31         hdr = (struct ieee80211_hdr *) skb->data;
32         fc = le16_to_cpu(hdr->frame_control);
33
34         hdrlen = 24;
35         if ((fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) ==
36             (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
37                 hdrlen += ETH_ALEN;
38                 *sa = hdr->addr4;
39                 *da = hdr->addr3;
40         } else if (fc & IEEE80211_FCTL_FROMDS) {
41                 *sa = hdr->addr3;
42                 *da = hdr->addr1;
43         } else if (fc & IEEE80211_FCTL_TODS) {
44                 *sa = hdr->addr2;
45                 *da = hdr->addr3;
46         } else {
47                 *sa = hdr->addr2;
48                 *da = hdr->addr1;
49         }
50
51         if (fc & 0x80)
52                 hdrlen += 2;
53
54         *data = skb->data + hdrlen;
55         *data_len = skb->len - hdrlen;
56
57         a4_included = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
58                 (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
59         if ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA &&
60             fc & IEEE80211_STYPE_QOS_DATA) {
61                 pos = (u8 *) &hdr->addr4;
62                 if (a4_included)
63                         pos += 6;
64                 *qos_tid = pos[0] & 0x0f;
65                 *qos_tid |= 0x80; /* qos_included flag */
66         } else
67                 *qos_tid = 0;
68
69         return skb->len < hdrlen ? -1 : 0;
70 }
71
72
73 ieee80211_tx_result
74 ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
75 {
76         u8 *data, *sa, *da, *key, *mic, qos_tid;
77         size_t data_len;
78         u16 fc;
79         struct sk_buff *skb = tx->skb;
80         int authenticator;
81         int wpa_test = 0;
82         int tail;
83
84         fc = tx->fc;
85
86         if (!tx->key || tx->key->conf.alg != ALG_TKIP || skb->len < 24 ||
87             !WLAN_FC_DATA_PRESENT(fc))
88                 return TX_CONTINUE;
89
90         if (ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len))
91                 return TX_DROP;
92
93         if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
94             !(tx->flags & IEEE80211_TX_FRAGMENTED) &&
95             !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC) &&
96             !wpa_test) {
97                 /* hwaccel - with no need for preallocated room for Michael MIC
98                  */
99                 return TX_CONTINUE;
100         }
101
102         tail = MICHAEL_MIC_LEN;
103         if (!(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE))
104                 tail += TKIP_ICV_LEN;
105
106         if (WARN_ON(skb_tailroom(skb) < tail ||
107                     skb_headroom(skb) < TKIP_IV_LEN))
108                 return TX_DROP;
109
110 #if 0
111         authenticator = fc & IEEE80211_FCTL_FROMDS; /* FIX */
112 #else
113         authenticator = 1;
114 #endif
115         key = &tx->key->conf.key[authenticator ? ALG_TKIP_TEMP_AUTH_TX_MIC_KEY :
116                                  ALG_TKIP_TEMP_AUTH_RX_MIC_KEY];
117         mic = skb_put(skb, MICHAEL_MIC_LEN);
118         michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic);
119
120         return TX_CONTINUE;
121 }
122
123
124 ieee80211_rx_result
125 ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
126 {
127         u8 *data, *sa, *da, *key = NULL, qos_tid;
128         size_t data_len;
129         u16 fc;
130         u8 mic[MICHAEL_MIC_LEN];
131         struct sk_buff *skb = rx->skb;
132         int authenticator = 1, wpa_test = 0;
133         DECLARE_MAC_BUF(mac);
134
135         fc = rx->fc;
136
137         /*
138          * No way to verify the MIC if the hardware stripped it
139          */
140         if (rx->status->flag & RX_FLAG_MMIC_STRIPPED)
141                 return RX_CONTINUE;
142
143         if (!rx->key || rx->key->conf.alg != ALG_TKIP ||
144             !(rx->fc & IEEE80211_FCTL_PROTECTED) || !WLAN_FC_DATA_PRESENT(fc))
145                 return RX_CONTINUE;
146
147         if (ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len)
148             || data_len < MICHAEL_MIC_LEN)
149                 return RX_DROP_UNUSABLE;
150
151         data_len -= MICHAEL_MIC_LEN;
152
153 #if 0
154         authenticator = fc & IEEE80211_FCTL_TODS; /* FIX */
155 #else
156         authenticator = 1;
157 #endif
158         key = &rx->key->conf.key[authenticator ? ALG_TKIP_TEMP_AUTH_RX_MIC_KEY :
159                                  ALG_TKIP_TEMP_AUTH_TX_MIC_KEY];
160         michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic);
161         if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) {
162                 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
163                         return RX_DROP_UNUSABLE;
164
165                 printk(KERN_DEBUG "%s: invalid Michael MIC in data frame from "
166                        "%s\n", rx->dev->name, print_mac(mac, sa));
167
168                 mac80211_ev_michael_mic_failure(rx->dev, rx->key->conf.keyidx,
169                                                 (void *) skb->data);
170                 return RX_DROP_UNUSABLE;
171         }
172
173         /* remove Michael MIC from payload */
174         skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
175
176         /* update IV in key information to be able to detect replays */
177         rx->key->u.tkip.rx[rx->queue].iv32 = rx->tkip_iv32;
178         rx->key->u.tkip.rx[rx->queue].iv16 = rx->tkip_iv16;
179
180         return RX_CONTINUE;
181 }
182
183
184 static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
185 {
186         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
187         struct ieee80211_key *key = tx->key;
188         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
189         int hdrlen, len, tail;
190         u16 fc;
191         u8 *pos;
192
193         info->control.icv_len = TKIP_ICV_LEN;
194         info->control.iv_len = TKIP_IV_LEN;
195
196         if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
197             !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
198                 /* hwaccel - with no need for preallocated room for IV/ICV */
199                 info->control.hw_key = &tx->key->conf;
200                 return 0;
201         }
202
203         fc = le16_to_cpu(hdr->frame_control);
204         hdrlen = ieee80211_get_hdrlen(fc);
205         len = skb->len - hdrlen;
206
207         if (tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
208                 tail = 0;
209         else
210                 tail = TKIP_ICV_LEN;
211
212         if (WARN_ON(skb_tailroom(skb) < tail ||
213                     skb_headroom(skb) < TKIP_IV_LEN))
214                 return -1;
215
216         pos = skb_push(skb, TKIP_IV_LEN);
217         memmove(pos, pos + TKIP_IV_LEN, hdrlen);
218         pos += hdrlen;
219
220         /* Increase IV for the frame */
221         key->u.tkip.tx.iv16++;
222         if (key->u.tkip.tx.iv16 == 0)
223                 key->u.tkip.tx.iv32++;
224
225         if (tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
226                 hdr = (struct ieee80211_hdr *)skb->data;
227
228                 /* hwaccel - with preallocated room for IV */
229                 ieee80211_tkip_add_iv(pos, key,
230                                       (u8) (key->u.tkip.tx.iv16 >> 8),
231                                       (u8) (((key->u.tkip.tx.iv16 >> 8) | 0x20) &
232                                             0x7f),
233                                       (u8) key->u.tkip.tx.iv16);
234
235                 info->control.hw_key = &tx->key->conf;
236                 return 0;
237         }
238
239         /* Add room for ICV */
240         skb_put(skb, TKIP_ICV_LEN);
241
242         hdr = (struct ieee80211_hdr *) skb->data;
243         ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm,
244                                     key, pos, len, hdr->addr2);
245         return 0;
246 }
247
248
249 ieee80211_tx_result
250 ieee80211_crypto_tkip_encrypt(struct ieee80211_tx_data *tx)
251 {
252         struct sk_buff *skb = tx->skb;
253
254         ieee80211_tx_set_protected(tx);
255
256         if (tkip_encrypt_skb(tx, skb) < 0)
257                 return TX_DROP;
258
259         if (tx->extra_frag) {
260                 int i;
261                 for (i = 0; i < tx->num_extra_frag; i++) {
262                         if (tkip_encrypt_skb(tx, tx->extra_frag[i]) < 0)
263                                 return TX_DROP;
264                 }
265         }
266
267         return TX_CONTINUE;
268 }
269
270
271 ieee80211_rx_result
272 ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
273 {
274         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
275         u16 fc;
276         int hdrlen, res, hwaccel = 0, wpa_test = 0;
277         struct ieee80211_key *key = rx->key;
278         struct sk_buff *skb = rx->skb;
279         DECLARE_MAC_BUF(mac);
280
281         fc = le16_to_cpu(hdr->frame_control);
282         hdrlen = ieee80211_get_hdrlen(fc);
283
284         if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
285                 return RX_CONTINUE;
286
287         if (!rx->sta || skb->len - hdrlen < 12)
288                 return RX_DROP_UNUSABLE;
289
290         if (rx->status->flag & RX_FLAG_DECRYPTED) {
291                 if (rx->status->flag & RX_FLAG_IV_STRIPPED) {
292                         /*
293                          * Hardware took care of all processing, including
294                          * replay protection, and stripped the ICV/IV so
295                          * we cannot do any checks here.
296                          */
297                         return RX_CONTINUE;
298                 }
299
300                 /* let TKIP code verify IV, but skip decryption */
301                 hwaccel = 1;
302         }
303
304         res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm,
305                                           key, skb->data + hdrlen,
306                                           skb->len - hdrlen, rx->sta->addr,
307                                           hdr->addr1, hwaccel, rx->queue,
308                                           &rx->tkip_iv32,
309                                           &rx->tkip_iv16);
310         if (res != TKIP_DECRYPT_OK || wpa_test) {
311 #ifdef CONFIG_MAC80211_DEBUG
312                 if (net_ratelimit())
313                         printk(KERN_DEBUG "%s: TKIP decrypt failed for RX "
314                                "frame from %s (res=%d)\n", rx->dev->name,
315                                print_mac(mac, rx->sta->addr), res);
316 #endif /* CONFIG_MAC80211_DEBUG */
317                 return RX_DROP_UNUSABLE;
318         }
319
320         /* Trim ICV */
321         skb_trim(skb, skb->len - TKIP_ICV_LEN);
322
323         /* Remove IV */
324         memmove(skb->data + TKIP_IV_LEN, skb->data, hdrlen);
325         skb_pull(skb, TKIP_IV_LEN);
326
327         return RX_CONTINUE;
328 }
329
330
331 static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
332                                 int encrypted)
333 {
334         u16 fc;
335         int a4_included, qos_included;
336         u8 qos_tid, *fc_pos, *data, *sa, *da;
337         int len_a;
338         size_t data_len;
339         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
340
341         fc_pos = (u8 *) &hdr->frame_control;
342         fc = fc_pos[0] ^ (fc_pos[1] << 8);
343         a4_included = (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
344                 (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS);
345
346         ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len);
347         data_len -= CCMP_HDR_LEN + (encrypted ? CCMP_MIC_LEN : 0);
348         if (qos_tid & 0x80) {
349                 qos_included = 1;
350                 qos_tid &= 0x0f;
351         } else
352                 qos_included = 0;
353         /* First block, b_0 */
354
355         b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
356         /* Nonce: QoS Priority | A2 | PN */
357         b_0[1] = qos_tid;
358         memcpy(&b_0[2], hdr->addr2, 6);
359         memcpy(&b_0[8], pn, CCMP_PN_LEN);
360         /* l(m) */
361         b_0[14] = (data_len >> 8) & 0xff;
362         b_0[15] = data_len & 0xff;
363
364
365         /* AAD (extra authenticate-only data) / masked 802.11 header
366          * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
367
368         len_a = a4_included ? 28 : 22;
369         if (qos_included)
370                 len_a += 2;
371
372         aad[0] = 0; /* (len_a >> 8) & 0xff; */
373         aad[1] = len_a & 0xff;
374         /* Mask FC: zero subtype b4 b5 b6 */
375         aad[2] = fc_pos[0] & ~(BIT(4) | BIT(5) | BIT(6));
376         /* Retry, PwrMgt, MoreData; set Protected */
377         aad[3] = (fc_pos[1] & ~(BIT(3) | BIT(4) | BIT(5))) | BIT(6);
378         memcpy(&aad[4], &hdr->addr1, 18);
379
380         /* Mask Seq#, leave Frag# */
381         aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
382         aad[23] = 0;
383         if (a4_included) {
384                 memcpy(&aad[24], hdr->addr4, 6);
385                 aad[30] = 0;
386                 aad[31] = 0;
387         } else
388                 memset(&aad[24], 0, 8);
389         if (qos_included) {
390                 u8 *dpos = &aad[a4_included ? 30 : 24];
391
392                 /* Mask QoS Control field */
393                 dpos[0] = qos_tid;
394                 dpos[1] = 0;
395         }
396 }
397
398
399 static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id)
400 {
401         hdr[0] = pn[5];
402         hdr[1] = pn[4];
403         hdr[2] = 0;
404         hdr[3] = 0x20 | (key_id << 6);
405         hdr[4] = pn[3];
406         hdr[5] = pn[2];
407         hdr[6] = pn[1];
408         hdr[7] = pn[0];
409 }
410
411
412 static inline int ccmp_hdr2pn(u8 *pn, u8 *hdr)
413 {
414         pn[0] = hdr[7];
415         pn[1] = hdr[6];
416         pn[2] = hdr[5];
417         pn[3] = hdr[4];
418         pn[4] = hdr[1];
419         pn[5] = hdr[0];
420         return (hdr[3] >> 6) & 0x03;
421 }
422
423
424 static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
425 {
426         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
427         struct ieee80211_key *key = tx->key;
428         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
429         int hdrlen, len, tail;
430         u16 fc;
431         u8 *pos, *pn, *b_0, *aad, *scratch;
432         int i;
433
434         info->control.icv_len = CCMP_MIC_LEN;
435         info->control.iv_len = CCMP_HDR_LEN;
436
437         if ((tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) &&
438             !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
439                 /* hwaccel - with no need for preallocated room for CCMP "
440                  * header or MIC fields */
441                 info->control.hw_key = &tx->key->conf;
442                 return 0;
443         }
444
445         scratch = key->u.ccmp.tx_crypto_buf;
446         b_0 = scratch + 3 * AES_BLOCK_LEN;
447         aad = scratch + 4 * AES_BLOCK_LEN;
448
449         fc = le16_to_cpu(hdr->frame_control);
450         hdrlen = ieee80211_get_hdrlen(fc);
451         len = skb->len - hdrlen;
452
453         if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
454                 tail = 0;
455         else
456                 tail = CCMP_MIC_LEN;
457
458         if (WARN_ON(skb_tailroom(skb) < tail ||
459                     skb_headroom(skb) < CCMP_HDR_LEN))
460                 return -1;
461
462         pos = skb_push(skb, CCMP_HDR_LEN);
463         memmove(pos, pos + CCMP_HDR_LEN, hdrlen);
464         hdr = (struct ieee80211_hdr *) pos;
465         pos += hdrlen;
466
467         /* PN = PN + 1 */
468         pn = key->u.ccmp.tx_pn;
469
470         for (i = CCMP_PN_LEN - 1; i >= 0; i--) {
471                 pn[i]++;
472                 if (pn[i])
473                         break;
474         }
475
476         ccmp_pn2hdr(pos, pn, key->conf.keyidx);
477
478         if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE) {
479                 /* hwaccel - with preallocated room for CCMP header */
480                 info->control.hw_key = &tx->key->conf;
481                 return 0;
482         }
483
484         pos += CCMP_HDR_LEN;
485         ccmp_special_blocks(skb, pn, b_0, aad, 0);
486         ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, scratch, b_0, aad, pos, len,
487                                   pos, skb_put(skb, CCMP_MIC_LEN));
488
489         return 0;
490 }
491
492
493 ieee80211_tx_result
494 ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx)
495 {
496         struct sk_buff *skb = tx->skb;
497
498         ieee80211_tx_set_protected(tx);
499
500         if (ccmp_encrypt_skb(tx, skb) < 0)
501                 return TX_DROP;
502
503         if (tx->extra_frag) {
504                 int i;
505                 for (i = 0; i < tx->num_extra_frag; i++) {
506                         if (ccmp_encrypt_skb(tx, tx->extra_frag[i]) < 0)
507                                 return TX_DROP;
508                 }
509         }
510
511         return TX_CONTINUE;
512 }
513
514
515 ieee80211_rx_result
516 ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
517 {
518         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
519         u16 fc;
520         int hdrlen;
521         struct ieee80211_key *key = rx->key;
522         struct sk_buff *skb = rx->skb;
523         u8 pn[CCMP_PN_LEN];
524         int data_len;
525         DECLARE_MAC_BUF(mac);
526
527         fc = le16_to_cpu(hdr->frame_control);
528         hdrlen = ieee80211_get_hdrlen(fc);
529
530         if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA)
531                 return RX_CONTINUE;
532
533         data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN;
534         if (!rx->sta || data_len < 0)
535                 return RX_DROP_UNUSABLE;
536
537         if ((rx->status->flag & RX_FLAG_DECRYPTED) &&
538             (rx->status->flag & RX_FLAG_IV_STRIPPED))
539                 return RX_CONTINUE;
540
541         (void) ccmp_hdr2pn(pn, skb->data + hdrlen);
542
543         if (memcmp(pn, key->u.ccmp.rx_pn[rx->queue], CCMP_PN_LEN) <= 0) {
544 #ifdef CONFIG_MAC80211_DEBUG
545                 u8 *ppn = key->u.ccmp.rx_pn[rx->queue];
546
547                 printk(KERN_DEBUG "%s: CCMP replay detected for RX frame from "
548                        "%s (RX PN %02x%02x%02x%02x%02x%02x <= prev. PN "
549                        "%02x%02x%02x%02x%02x%02x)\n", rx->dev->name,
550                        print_mac(mac, rx->sta->addr),
551                        pn[0], pn[1], pn[2], pn[3], pn[4], pn[5],
552                        ppn[0], ppn[1], ppn[2], ppn[3], ppn[4], ppn[5]);
553 #endif /* CONFIG_MAC80211_DEBUG */
554                 key->u.ccmp.replays++;
555                 return RX_DROP_UNUSABLE;
556         }
557
558         if (!(rx->status->flag & RX_FLAG_DECRYPTED)) {
559                 /* hardware didn't decrypt/verify MIC */
560                 u8 *scratch, *b_0, *aad;
561
562                 scratch = key->u.ccmp.rx_crypto_buf;
563                 b_0 = scratch + 3 * AES_BLOCK_LEN;
564                 aad = scratch + 4 * AES_BLOCK_LEN;
565
566                 ccmp_special_blocks(skb, pn, b_0, aad, 1);
567
568                 if (ieee80211_aes_ccm_decrypt(
569                             key->u.ccmp.tfm, scratch, b_0, aad,
570                             skb->data + hdrlen + CCMP_HDR_LEN, data_len,
571                             skb->data + skb->len - CCMP_MIC_LEN,
572                             skb->data + hdrlen + CCMP_HDR_LEN)) {
573 #ifdef CONFIG_MAC80211_DEBUG
574                         if (net_ratelimit())
575                                 printk(KERN_DEBUG "%s: CCMP decrypt failed "
576                                        "for RX frame from %s\n", rx->dev->name,
577                                        print_mac(mac, rx->sta->addr));
578 #endif /* CONFIG_MAC80211_DEBUG */
579                         return RX_DROP_UNUSABLE;
580                 }
581         }
582
583         memcpy(key->u.ccmp.rx_pn[rx->queue], pn, CCMP_PN_LEN);
584
585         /* Remove CCMP header and MIC */
586         skb_trim(skb, skb->len - CCMP_MIC_LEN);
587         memmove(skb->data + CCMP_HDR_LEN, skb->data, hdrlen);
588         skb_pull(skb, CCMP_HDR_LEN);
589
590         return RX_CONTINUE;
591 }