wpa.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580
  1. /*
  2. * Copyright 2002-2004, Instant802 Networks, Inc.
  3. * Copyright 2008, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. */
  9. #include <linux/netdevice.h>
  10. #include <linux/types.h>
  11. #include <linux/skbuff.h>
  12. #include <linux/compiler.h>
  13. #include <linux/ieee80211.h>
  14. #include <linux/gfp.h>
  15. #include <asm/unaligned.h>
  16. #include <net/mac80211.h>
  17. #include "ieee80211_i.h"
  18. #include "michael.h"
  19. #include "tkip.h"
  20. #include "aes_ccm.h"
  21. #include "aes_cmac.h"
  22. #include "wpa.h"
  23. ieee80211_tx_result
  24. ieee80211_tx_h_michael_mic_add(struct ieee80211_tx_data *tx)
  25. {
  26. u8 *data, *key, *mic;
  27. size_t data_len;
  28. unsigned int hdrlen;
  29. struct ieee80211_hdr *hdr;
  30. struct sk_buff *skb = tx->skb;
  31. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  32. int tail;
  33. hdr = (struct ieee80211_hdr *)skb->data;
  34. if (!tx->key || tx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
  35. skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control))
  36. return TX_CONTINUE;
  37. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  38. if (skb->len < hdrlen)
  39. return TX_DROP;
  40. data = skb->data + hdrlen;
  41. data_len = skb->len - hdrlen;
  42. if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE)) {
  43. /* Need to use software crypto for the test */
  44. info->control.hw_key = NULL;
  45. }
  46. if (info->control.hw_key &&
  47. !(tx->flags & IEEE80211_TX_FRAGMENTED) &&
  48. !(tx->key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC)) {
  49. /* hwaccel - with no need for SW-generated MMIC */
  50. return TX_CONTINUE;
  51. }
  52. tail = MICHAEL_MIC_LEN;
  53. if (!info->control.hw_key)
  54. tail += TKIP_ICV_LEN;
  55. if (WARN_ON(skb_tailroom(skb) < tail ||
  56. skb_headroom(skb) < TKIP_IV_LEN))
  57. return TX_DROP;
  58. key = &tx->key->conf.key[NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY];
  59. mic = skb_put(skb, MICHAEL_MIC_LEN);
  60. michael_mic(key, hdr, data, data_len, mic);
  61. if (unlikely(info->flags & IEEE80211_TX_INTFL_TKIP_MIC_FAILURE))
  62. mic[0]++;
  63. return TX_CONTINUE;
  64. }
  65. ieee80211_rx_result
  66. ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
  67. {
  68. u8 *data, *key = NULL;
  69. size_t data_len;
  70. unsigned int hdrlen;
  71. u8 mic[MICHAEL_MIC_LEN];
  72. struct sk_buff *skb = rx->skb;
  73. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  74. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  75. /* No way to verify the MIC if the hardware stripped it */
  76. if (status->flag & RX_FLAG_MMIC_STRIPPED)
  77. return RX_CONTINUE;
  78. if (!rx->key || rx->key->conf.cipher != WLAN_CIPHER_SUITE_TKIP ||
  79. !ieee80211_has_protected(hdr->frame_control) ||
  80. !ieee80211_is_data_present(hdr->frame_control))
  81. return RX_CONTINUE;
  82. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  83. if (skb->len < hdrlen + MICHAEL_MIC_LEN)
  84. return RX_DROP_UNUSABLE;
  85. data = skb->data + hdrlen;
  86. data_len = skb->len - hdrlen - MICHAEL_MIC_LEN;
  87. key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY];
  88. michael_mic(key, hdr, data, data_len, mic);
  89. if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0) {
  90. if (!(status->rx_flags & IEEE80211_RX_RA_MATCH))
  91. return RX_DROP_UNUSABLE;
  92. mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
  93. (void *) skb->data, NULL,
  94. GFP_ATOMIC);
  95. return RX_DROP_UNUSABLE;
  96. }
  97. /* remove Michael MIC from payload */
  98. skb_trim(skb, skb->len - MICHAEL_MIC_LEN);
  99. /* update IV in key information to be able to detect replays */
  100. rx->key->u.tkip.rx[rx->queue].iv32 = rx->tkip_iv32;
  101. rx->key->u.tkip.rx[rx->queue].iv16 = rx->tkip_iv16;
  102. return RX_CONTINUE;
  103. }
  104. static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
  105. {
  106. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  107. struct ieee80211_key *key = tx->key;
  108. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  109. unsigned int hdrlen;
  110. int len, tail;
  111. u8 *pos;
  112. if (info->control.hw_key &&
  113. !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
  114. /* hwaccel - with no need for software-generated IV */
  115. return 0;
  116. }
  117. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  118. len = skb->len - hdrlen;
  119. if (info->control.hw_key)
  120. tail = 0;
  121. else
  122. tail = TKIP_ICV_LEN;
  123. if (WARN_ON(skb_tailroom(skb) < tail ||
  124. skb_headroom(skb) < TKIP_IV_LEN))
  125. return -1;
  126. pos = skb_push(skb, TKIP_IV_LEN);
  127. memmove(pos, pos + TKIP_IV_LEN, hdrlen);
  128. pos += hdrlen;
  129. /* Increase IV for the frame */
  130. key->u.tkip.tx.iv16++;
  131. if (key->u.tkip.tx.iv16 == 0)
  132. key->u.tkip.tx.iv32++;
  133. pos = ieee80211_tkip_add_iv(pos, key, key->u.tkip.tx.iv16);
  134. /* hwaccel - with software IV */
  135. if (info->control.hw_key)
  136. return 0;
  137. /* Add room for ICV */
  138. skb_put(skb, TKIP_ICV_LEN);
  139. hdr = (struct ieee80211_hdr *) skb->data;
  140. return ieee80211_tkip_encrypt_data(tx->local->wep_tx_tfm,
  141. key, pos, len, hdr->addr2);
  142. }
  143. ieee80211_tx_result
  144. ieee80211_crypto_tkip_encrypt(struct ieee80211_tx_data *tx)
  145. {
  146. struct sk_buff *skb = tx->skb;
  147. ieee80211_tx_set_protected(tx);
  148. do {
  149. if (tkip_encrypt_skb(tx, skb) < 0)
  150. return TX_DROP;
  151. } while ((skb = skb->next));
  152. return TX_CONTINUE;
  153. }
  154. ieee80211_rx_result
  155. ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
  156. {
  157. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
  158. int hdrlen, res, hwaccel = 0;
  159. struct ieee80211_key *key = rx->key;
  160. struct sk_buff *skb = rx->skb;
  161. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  162. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  163. if (!ieee80211_is_data(hdr->frame_control))
  164. return RX_CONTINUE;
  165. if (!rx->sta || skb->len - hdrlen < 12)
  166. return RX_DROP_UNUSABLE;
  167. /*
  168. * Let TKIP code verify IV, but skip decryption.
  169. * In the case where hardware checks the IV as well,
  170. * we don't even get here, see ieee80211_rx_h_decrypt()
  171. */
  172. if (status->flag & RX_FLAG_DECRYPTED)
  173. hwaccel = 1;
  174. res = ieee80211_tkip_decrypt_data(rx->local->wep_rx_tfm,
  175. key, skb->data + hdrlen,
  176. skb->len - hdrlen, rx->sta->sta.addr,
  177. hdr->addr1, hwaccel, rx->queue,
  178. &rx->tkip_iv32,
  179. &rx->tkip_iv16);
  180. if (res != TKIP_DECRYPT_OK)
  181. return RX_DROP_UNUSABLE;
  182. /* Trim ICV */
  183. skb_trim(skb, skb->len - TKIP_ICV_LEN);
  184. /* Remove IV */
  185. memmove(skb->data + TKIP_IV_LEN, skb->data, hdrlen);
  186. skb_pull(skb, TKIP_IV_LEN);
  187. return RX_CONTINUE;
  188. }
  189. static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
  190. int encrypted)
  191. {
  192. __le16 mask_fc;
  193. int a4_included, mgmt;
  194. u8 qos_tid;
  195. u8 *b_0, *aad;
  196. u16 data_len, len_a;
  197. unsigned int hdrlen;
  198. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  199. b_0 = scratch + 3 * AES_BLOCK_LEN;
  200. aad = scratch + 4 * AES_BLOCK_LEN;
  201. /*
  202. * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
  203. * Retry, PwrMgt, MoreData; set Protected
  204. */
  205. mgmt = ieee80211_is_mgmt(hdr->frame_control);
  206. mask_fc = hdr->frame_control;
  207. mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY |
  208. IEEE80211_FCTL_PM | IEEE80211_FCTL_MOREDATA);
  209. if (!mgmt)
  210. mask_fc &= ~cpu_to_le16(0x0070);
  211. mask_fc |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
  212. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  213. len_a = hdrlen - 2;
  214. a4_included = ieee80211_has_a4(hdr->frame_control);
  215. if (ieee80211_is_data_qos(hdr->frame_control))
  216. qos_tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
  217. else
  218. qos_tid = 0;
  219. data_len = skb->len - hdrlen - CCMP_HDR_LEN;
  220. if (encrypted)
  221. data_len -= CCMP_MIC_LEN;
  222. /* First block, b_0 */
  223. b_0[0] = 0x59; /* flags: Adata: 1, M: 011, L: 001 */
  224. /* Nonce: Nonce Flags | A2 | PN
  225. * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7)
  226. */
  227. b_0[1] = qos_tid | (mgmt << 4);
  228. memcpy(&b_0[2], hdr->addr2, ETH_ALEN);
  229. memcpy(&b_0[8], pn, CCMP_PN_LEN);
  230. /* l(m) */
  231. put_unaligned_be16(data_len, &b_0[14]);
  232. /* AAD (extra authenticate-only data) / masked 802.11 header
  233. * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
  234. put_unaligned_be16(len_a, &aad[0]);
  235. put_unaligned(mask_fc, (__le16 *)&aad[2]);
  236. memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
  237. /* Mask Seq#, leave Frag# */
  238. aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
  239. aad[23] = 0;
  240. if (a4_included) {
  241. memcpy(&aad[24], hdr->addr4, ETH_ALEN);
  242. aad[30] = qos_tid;
  243. aad[31] = 0;
  244. } else {
  245. memset(&aad[24], 0, ETH_ALEN + IEEE80211_QOS_CTL_LEN);
  246. aad[24] = qos_tid;
  247. }
  248. }
  249. static inline void ccmp_pn2hdr(u8 *hdr, u8 *pn, int key_id)
  250. {
  251. hdr[0] = pn[5];
  252. hdr[1] = pn[4];
  253. hdr[2] = 0;
  254. hdr[3] = 0x20 | (key_id << 6);
  255. hdr[4] = pn[3];
  256. hdr[5] = pn[2];
  257. hdr[6] = pn[1];
  258. hdr[7] = pn[0];
  259. }
  260. static inline void ccmp_hdr2pn(u8 *pn, u8 *hdr)
  261. {
  262. pn[0] = hdr[7];
  263. pn[1] = hdr[6];
  264. pn[2] = hdr[5];
  265. pn[3] = hdr[4];
  266. pn[4] = hdr[1];
  267. pn[5] = hdr[0];
  268. }
  269. static int ccmp_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
  270. {
  271. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  272. struct ieee80211_key *key = tx->key;
  273. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  274. int hdrlen, len, tail;
  275. u8 *pos, *pn;
  276. int i;
  277. if (info->control.hw_key &&
  278. !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) {
  279. /*
  280. * hwaccel has no need for preallocated room for CCMP
  281. * header or MIC fields
  282. */
  283. return 0;
  284. }
  285. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  286. len = skb->len - hdrlen;
  287. if (info->control.hw_key)
  288. tail = 0;
  289. else
  290. tail = CCMP_MIC_LEN;
  291. if (WARN_ON(skb_tailroom(skb) < tail ||
  292. skb_headroom(skb) < CCMP_HDR_LEN))
  293. return -1;
  294. pos = skb_push(skb, CCMP_HDR_LEN);
  295. memmove(pos, pos + CCMP_HDR_LEN, hdrlen);
  296. hdr = (struct ieee80211_hdr *) pos;
  297. pos += hdrlen;
  298. /* PN = PN + 1 */
  299. pn = key->u.ccmp.tx_pn;
  300. for (i = CCMP_PN_LEN - 1; i >= 0; i--) {
  301. pn[i]++;
  302. if (pn[i])
  303. break;
  304. }
  305. ccmp_pn2hdr(pos, pn, key->conf.keyidx);
  306. /* hwaccel - with software CCMP header */
  307. if (info->control.hw_key)
  308. return 0;
  309. pos += CCMP_HDR_LEN;
  310. ccmp_special_blocks(skb, pn, key->u.ccmp.tx_crypto_buf, 0);
  311. ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, key->u.ccmp.tx_crypto_buf, pos, len,
  312. pos, skb_put(skb, CCMP_MIC_LEN));
  313. return 0;
  314. }
  315. ieee80211_tx_result
  316. ieee80211_crypto_ccmp_encrypt(struct ieee80211_tx_data *tx)
  317. {
  318. struct sk_buff *skb = tx->skb;
  319. ieee80211_tx_set_protected(tx);
  320. do {
  321. if (ccmp_encrypt_skb(tx, skb) < 0)
  322. return TX_DROP;
  323. } while ((skb = skb->next));
  324. return TX_CONTINUE;
  325. }
  326. ieee80211_rx_result
  327. ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx)
  328. {
  329. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
  330. int hdrlen;
  331. struct ieee80211_key *key = rx->key;
  332. struct sk_buff *skb = rx->skb;
  333. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  334. u8 pn[CCMP_PN_LEN];
  335. int data_len;
  336. int queue;
  337. hdrlen = ieee80211_hdrlen(hdr->frame_control);
  338. if (!ieee80211_is_data(hdr->frame_control) &&
  339. !ieee80211_is_robust_mgmt_frame(hdr))
  340. return RX_CONTINUE;
  341. data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN;
  342. if (!rx->sta || data_len < 0)
  343. return RX_DROP_UNUSABLE;
  344. ccmp_hdr2pn(pn, skb->data + hdrlen);
  345. queue = ieee80211_is_mgmt(hdr->frame_control) ?
  346. NUM_RX_DATA_QUEUES : rx->queue;
  347. if (memcmp(pn, key->u.ccmp.rx_pn[queue], CCMP_PN_LEN) <= 0) {
  348. key->u.ccmp.replays++;
  349. return RX_DROP_UNUSABLE;
  350. }
  351. if (!(status->flag & RX_FLAG_DECRYPTED)) {
  352. /* hardware didn't decrypt/verify MIC */
  353. ccmp_special_blocks(skb, pn, key->u.ccmp.rx_crypto_buf, 1);
  354. if (ieee80211_aes_ccm_decrypt(
  355. key->u.ccmp.tfm, key->u.ccmp.rx_crypto_buf,
  356. skb->data + hdrlen + CCMP_HDR_LEN, data_len,
  357. skb->data + skb->len - CCMP_MIC_LEN,
  358. skb->data + hdrlen + CCMP_HDR_LEN))
  359. return RX_DROP_UNUSABLE;
  360. }
  361. memcpy(key->u.ccmp.rx_pn[queue], pn, CCMP_PN_LEN);
  362. /* Remove CCMP header and MIC */
  363. skb_trim(skb, skb->len - CCMP_MIC_LEN);
  364. memmove(skb->data + CCMP_HDR_LEN, skb->data, hdrlen);
  365. skb_pull(skb, CCMP_HDR_LEN);
  366. return RX_CONTINUE;
  367. }
  368. static void bip_aad(struct sk_buff *skb, u8 *aad)
  369. {
  370. /* BIP AAD: FC(masked) || A1 || A2 || A3 */
  371. /* FC type/subtype */
  372. aad[0] = skb->data[0];
  373. /* Mask FC Retry, PwrMgt, MoreData flags to zero */
  374. aad[1] = skb->data[1] & ~(BIT(4) | BIT(5) | BIT(6));
  375. /* A1 || A2 || A3 */
  376. memcpy(aad + 2, skb->data + 4, 3 * ETH_ALEN);
  377. }
  378. static inline void bip_ipn_swap(u8 *d, const u8 *s)
  379. {
  380. *d++ = s[5];
  381. *d++ = s[4];
  382. *d++ = s[3];
  383. *d++ = s[2];
  384. *d++ = s[1];
  385. *d = s[0];
  386. }
  387. ieee80211_tx_result
  388. ieee80211_crypto_aes_cmac_encrypt(struct ieee80211_tx_data *tx)
  389. {
  390. struct sk_buff *skb = tx->skb;
  391. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  392. struct ieee80211_key *key = tx->key;
  393. struct ieee80211_mmie *mmie;
  394. u8 *pn, aad[20];
  395. int i;
  396. if (info->control.hw_key)
  397. return 0;
  398. if (WARN_ON(skb_tailroom(skb) < sizeof(*mmie)))
  399. return TX_DROP;
  400. mmie = (struct ieee80211_mmie *) skb_put(skb, sizeof(*mmie));
  401. mmie->element_id = WLAN_EID_MMIE;
  402. mmie->length = sizeof(*mmie) - 2;
  403. mmie->key_id = cpu_to_le16(key->conf.keyidx);
  404. /* PN = PN + 1 */
  405. pn = key->u.aes_cmac.tx_pn;
  406. for (i = sizeof(key->u.aes_cmac.tx_pn) - 1; i >= 0; i--) {
  407. pn[i]++;
  408. if (pn[i])
  409. break;
  410. }
  411. bip_ipn_swap(mmie->sequence_number, pn);
  412. bip_aad(skb, aad);
  413. /*
  414. * MIC = AES-128-CMAC(IGTK, AAD || Management Frame Body || MMIE, 64)
  415. */
  416. ieee80211_aes_cmac(key->u.aes_cmac.tfm, key->u.aes_cmac.tx_crypto_buf,
  417. aad, skb->data + 24, skb->len - 24, mmie->mic);
  418. return TX_CONTINUE;
  419. }
  420. ieee80211_rx_result
  421. ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx)
  422. {
  423. struct sk_buff *skb = rx->skb;
  424. struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
  425. struct ieee80211_key *key = rx->key;
  426. struct ieee80211_mmie *mmie;
  427. u8 aad[20], mic[8], ipn[6];
  428. struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  429. if (!ieee80211_is_mgmt(hdr->frame_control))
  430. return RX_CONTINUE;
  431. if (skb->len < 24 + sizeof(*mmie))
  432. return RX_DROP_UNUSABLE;
  433. mmie = (struct ieee80211_mmie *)
  434. (skb->data + skb->len - sizeof(*mmie));
  435. if (mmie->element_id != WLAN_EID_MMIE ||
  436. mmie->length != sizeof(*mmie) - 2)
  437. return RX_DROP_UNUSABLE; /* Invalid MMIE */
  438. bip_ipn_swap(ipn, mmie->sequence_number);
  439. if (memcmp(ipn, key->u.aes_cmac.rx_pn, 6) <= 0) {
  440. key->u.aes_cmac.replays++;
  441. return RX_DROP_UNUSABLE;
  442. }
  443. if (!(status->flag & RX_FLAG_DECRYPTED)) {
  444. /* hardware didn't decrypt/verify MIC */
  445. bip_aad(skb, aad);
  446. ieee80211_aes_cmac(key->u.aes_cmac.tfm,
  447. key->u.aes_cmac.rx_crypto_buf, aad,
  448. skb->data + 24, skb->len - 24, mic);
  449. if (memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) {
  450. key->u.aes_cmac.icverrors++;
  451. return RX_DROP_UNUSABLE;
  452. }
  453. }
  454. memcpy(key->u.aes_cmac.rx_pn, ipn, 6);
  455. /* Remove MMIE */
  456. skb_trim(skb, skb->len - sizeof(*mmie));
  457. return RX_CONTINUE;
  458. }