aboutsummaryrefslogtreecommitdiffstats
path: root/net/ieee80211/ieee80211_rx.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ieee80211/ieee80211_rx.c')
-rw-r--r--net/ieee80211/ieee80211_rx.c310
1 files changed, 157 insertions, 153 deletions
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c
index a5905f53aed7..f7dcd854139e 100644
--- a/net/ieee80211/ieee80211_rx.c
+++ b/net/ieee80211/ieee80211_rx.c
@@ -52,11 +52,14 @@ static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee,
52 netif_rx(skb); 52 netif_rx(skb);
53} 53}
54 54
55
56/* Called only as a tasklet (software IRQ) */ 55/* Called only as a tasklet (software IRQ) */
57static struct ieee80211_frag_entry * 56static struct ieee80211_frag_entry *ieee80211_frag_cache_find(struct
58ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq, 57 ieee80211_device
59 unsigned int frag, u8 *src, u8 *dst) 58 *ieee,
59 unsigned int seq,
60 unsigned int frag,
61 u8 * src,
62 u8 * dst)
60{ 63{
61 struct ieee80211_frag_entry *entry; 64 struct ieee80211_frag_entry *entry;
62 int i; 65 int i;
@@ -65,10 +68,9 @@ ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
65 entry = &ieee->frag_cache[i]; 68 entry = &ieee->frag_cache[i];
66 if (entry->skb != NULL && 69 if (entry->skb != NULL &&
67 time_after(jiffies, entry->first_frag_time + 2 * HZ)) { 70 time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
68 IEEE80211_DEBUG_FRAG( 71 IEEE80211_DEBUG_FRAG("expiring fragment cache entry "
69 "expiring fragment cache entry " 72 "seq=%u last_frag=%u\n",
70 "seq=%u last_frag=%u\n", 73 entry->seq, entry->last_frag);
71 entry->seq, entry->last_frag);
72 dev_kfree_skb_any(entry->skb); 74 dev_kfree_skb_any(entry->skb);
73 entry->skb = NULL; 75 entry->skb = NULL;
74 } 76 }
@@ -84,9 +86,8 @@ ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
84} 86}
85 87
86/* Called only as a tasklet (software IRQ) */ 88/* Called only as a tasklet (software IRQ) */
87static struct sk_buff * 89static struct sk_buff *ieee80211_frag_cache_get(struct ieee80211_device *ieee,
88ieee80211_frag_cache_get(struct ieee80211_device *ieee, 90 struct ieee80211_hdr *hdr)
89 struct ieee80211_hdr *hdr)
90{ 91{
91 struct sk_buff *skb = NULL; 92 struct sk_buff *skb = NULL;
92 u16 sc; 93 u16 sc;
@@ -101,9 +102,9 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
101 /* Reserve enough space to fit maximum frame length */ 102 /* Reserve enough space to fit maximum frame length */
102 skb = dev_alloc_skb(ieee->dev->mtu + 103 skb = dev_alloc_skb(ieee->dev->mtu +
103 sizeof(struct ieee80211_hdr) + 104 sizeof(struct ieee80211_hdr) +
104 8 /* LLC */ + 105 8 /* LLC */ +
105 2 /* alignment */ + 106 2 /* alignment */ +
106 8 /* WEP */ + ETH_ALEN /* WDS */); 107 8 /* WEP */ + ETH_ALEN /* WDS */ );
107 if (skb == NULL) 108 if (skb == NULL)
108 return NULL; 109 return NULL;
109 110
@@ -135,7 +136,6 @@ ieee80211_frag_cache_get(struct ieee80211_device *ieee,
135 return skb; 136 return skb;
136} 137}
137 138
138
139/* Called only as a tasklet (software IRQ) */ 139/* Called only as a tasklet (software IRQ) */
140static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee, 140static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
141 struct ieee80211_hdr *hdr) 141 struct ieee80211_hdr *hdr)
@@ -151,9 +151,8 @@ static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
151 hdr->addr1); 151 hdr->addr1);
152 152
153 if (entry == NULL) { 153 if (entry == NULL) {
154 IEEE80211_DEBUG_FRAG( 154 IEEE80211_DEBUG_FRAG("could not invalidate fragment cache "
155 "could not invalidate fragment cache " 155 "entry (seq=%u)\n", seq);
156 "entry (seq=%u)\n", seq);
157 return -1; 156 return -1;
158 } 157 }
159 158
@@ -161,7 +160,6 @@ static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
161 return 0; 160 return 0;
162} 161}
163 162
164
165#ifdef NOT_YET 163#ifdef NOT_YET
166/* ieee80211_rx_frame_mgtmt 164/* ieee80211_rx_frame_mgtmt
167 * 165 *
@@ -201,7 +199,7 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
201 return 0; 199 return 0;
202 } 200 }
203 201
204 if (ieee->iw_mode == IW_MODE_MASTER) { 202 if (ieee->iw_mode == IW_MODE_MASTER) {
205 if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) { 203 if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
206 printk(KERN_DEBUG "%s: unknown management frame " 204 printk(KERN_DEBUG "%s: unknown management frame "
207 "(type=0x%02x, stype=0x%02x) dropped\n", 205 "(type=0x%02x, stype=0x%02x) dropped\n",
@@ -219,14 +217,13 @@ ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
219} 217}
220#endif 218#endif
221 219
222
223/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ 220/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
224/* Ethernet-II snap header (RFC1042 for most EtherTypes) */ 221/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
225static unsigned char rfc1042_header[] = 222static unsigned char rfc1042_header[] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
226{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; 223
227/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */ 224/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
228static unsigned char bridge_tunnel_header[] = 225static unsigned char bridge_tunnel_header[] =
229{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 }; 226 { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
230/* No encapsulation header if EtherType < 0x600 (=length) */ 227/* No encapsulation header if EtherType < 0x600 (=length) */
231 228
232/* Called by ieee80211_rx_frame_decrypt */ 229/* Called by ieee80211_rx_frame_decrypt */
@@ -241,7 +238,7 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
241 if (skb->len < 24) 238 if (skb->len < 24)
242 return 0; 239 return 0;
243 240
244 hdr = (struct ieee80211_hdr *) skb->data; 241 hdr = (struct ieee80211_hdr *)skb->data;
245 fc = le16_to_cpu(hdr->frame_ctl); 242 fc = le16_to_cpu(hdr->frame_ctl);
246 243
247 /* check that the frame is unicast frame to us */ 244 /* check that the frame is unicast frame to us */
@@ -271,7 +268,7 @@ static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
271 268
272/* Called only as a tasklet (software IRQ), by ieee80211_rx */ 269/* Called only as a tasklet (software IRQ), by ieee80211_rx */
273static inline int 270static inline int
274ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb, 271ieee80211_rx_frame_decrypt(struct ieee80211_device *ieee, struct sk_buff *skb,
275 struct ieee80211_crypt_data *crypt) 272 struct ieee80211_crypt_data *crypt)
276{ 273{
277 struct ieee80211_hdr *hdr; 274 struct ieee80211_hdr *hdr;
@@ -280,12 +277,11 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
280 if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) 277 if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
281 return 0; 278 return 0;
282 279
283 hdr = (struct ieee80211_hdr *) skb->data; 280 hdr = (struct ieee80211_hdr *)skb->data;
284 hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); 281 hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
285 282
286#ifdef CONFIG_IEEE80211_CRYPT_TKIP 283#ifdef CONFIG_IEEE80211_CRYPT_TKIP
287 if (ieee->tkip_countermeasures && 284 if (ieee->tkip_countermeasures && strcmp(crypt->ops->name, "TKIP") == 0) {
288 strcmp(crypt->ops->name, "TKIP") == 0) {
289 if (net_ratelimit()) { 285 if (net_ratelimit()) {
290 printk(KERN_DEBUG "%s: TKIP countermeasures: dropped " 286 printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
291 "received packet from " MAC_FMT "\n", 287 "received packet from " MAC_FMT "\n",
@@ -299,9 +295,8 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
299 res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); 295 res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
300 atomic_dec(&crypt->refcnt); 296 atomic_dec(&crypt->refcnt);
301 if (res < 0) { 297 if (res < 0) {
302 IEEE80211_DEBUG_DROP( 298 IEEE80211_DEBUG_DROP("decryption failed (SA=" MAC_FMT
303 "decryption failed (SA=" MAC_FMT 299 ") res=%d\n", MAC_ARG(hdr->addr2), res);
304 ") res=%d\n", MAC_ARG(hdr->addr2), res);
305 if (res == -2) 300 if (res == -2)
306 IEEE80211_DEBUG_DROP("Decryption failed ICV " 301 IEEE80211_DEBUG_DROP("Decryption failed ICV "
307 "mismatch (key %d)\n", 302 "mismatch (key %d)\n",
@@ -313,11 +308,11 @@ ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
313 return res; 308 return res;
314} 309}
315 310
316
317/* Called only as a tasklet (software IRQ), by ieee80211_rx */ 311/* Called only as a tasklet (software IRQ), by ieee80211_rx */
318static inline int 312static inline int
319ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb, 313ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device *ieee,
320 int keyidx, struct ieee80211_crypt_data *crypt) 314 struct sk_buff *skb, int keyidx,
315 struct ieee80211_crypt_data *crypt)
321{ 316{
322 struct ieee80211_hdr *hdr; 317 struct ieee80211_hdr *hdr;
323 int res, hdrlen; 318 int res, hdrlen;
@@ -325,7 +320,7 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s
325 if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) 320 if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
326 return 0; 321 return 0;
327 322
328 hdr = (struct ieee80211_hdr *) skb->data; 323 hdr = (struct ieee80211_hdr *)skb->data;
329 hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); 324 hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
330 325
331 atomic_inc(&crypt->refcnt); 326 atomic_inc(&crypt->refcnt);
@@ -341,7 +336,6 @@ ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *s
341 return 0; 336 return 0;
342} 337}
343 338
344
345/* All received frames are sent to this function. @skb contains the frame in 339/* All received frames are sent to this function. @skb contains the frame in
346 * IEEE 802.11 format, i.e., in the format it was sent over air. 340 * IEEE 802.11 format, i.e., in the format it was sent over air.
347 * This function is called only as a tasklet (software IRQ). */ 341 * This function is called only as a tasklet (software IRQ). */
@@ -373,8 +367,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
373 stats = &ieee->stats; 367 stats = &ieee->stats;
374 368
375 if (skb->len < 10) { 369 if (skb->len < 10) {
376 printk(KERN_INFO "%s: SKB length < 10\n", 370 printk(KERN_INFO "%s: SKB length < 10\n", dev->name);
377 dev->name);
378 goto rx_dropped; 371 goto rx_dropped;
379 } 372 }
380 373
@@ -399,8 +392,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
399 /* Update spy records */ 392 /* Update spy records */
400 wireless_spy_update(dev, hdr->addr2, &wstats); 393 wireless_spy_update(dev, hdr->addr2, &wstats);
401 } 394 }
402#endif /* IW_WIRELESS_SPY */ 395#endif /* IW_WIRELESS_SPY */
403#endif /* WIRELESS_EXT > 15 */ 396#endif /* WIRELESS_EXT > 15 */
404 hostap_update_rx_stats(local->ap, hdr, rx_stats); 397 hostap_update_rx_stats(local->ap, hdr, rx_stats);
405#endif 398#endif
406 399
@@ -429,8 +422,8 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
429 * stations that do not support WEP key mapping). */ 422 * stations that do not support WEP key mapping). */
430 423
431 if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key) 424 if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
432 (void) hostap_handle_sta_crypto(local, hdr, &crypt, 425 (void)hostap_handle_sta_crypto(local, hdr, &crypt,
433 &sta); 426 &sta);
434#endif 427#endif
435 428
436 /* allow NULL decrypt to indicate an station specific override 429 /* allow NULL decrypt to indicate an station specific override
@@ -451,13 +444,11 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
451 goto rx_dropped; 444 goto rx_dropped;
452 } 445 }
453 } 446 }
454
455#ifdef NOT_YET 447#ifdef NOT_YET
456 if (type != WLAN_FC_TYPE_DATA) { 448 if (type != WLAN_FC_TYPE_DATA) {
457 if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH && 449 if (type == WLAN_FC_TYPE_MGMT && stype == WLAN_FC_STYPE_AUTH &&
458 fc & IEEE80211_FCTL_PROTECTED && ieee->host_decrypt && 450 fc & IEEE80211_FCTL_PROTECTED && ieee->host_decrypt &&
459 (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) 451 (keyidx = hostap_rx_frame_decrypt(ieee, skb, crypt)) < 0) {
460 {
461 printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth " 452 printk(KERN_DEBUG "%s: failed to decrypt mgmt::auth "
462 "from " MAC_FMT "\n", dev->name, 453 "from " MAC_FMT "\n", dev->name,
463 MAC_ARG(hdr->addr2)); 454 MAC_ARG(hdr->addr2));
@@ -507,9 +498,9 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
507 } 498 }
508 499
509 if (ieee->iw_mode == IW_MODE_MASTER && !wds && 500 if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
510 (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS && 501 (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
511 ieee->stadev && 502 IEEE80211_FCTL_FROMDS && ieee->stadev
512 memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) { 503 && memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
513 /* Frame from BSSID of the AP for which we are a client */ 504 /* Frame from BSSID of the AP for which we are a client */
514 skb->dev = dev = ieee->stadev; 505 skb->dev = dev = ieee->stadev;
515 stats = hostap_get_stats(dev); 506 stats = hostap_get_stats(dev);
@@ -521,8 +512,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
521 512
522#ifdef NOT_YET 513#ifdef NOT_YET
523 if ((ieee->iw_mode == IW_MODE_MASTER || 514 if ((ieee->iw_mode == IW_MODE_MASTER ||
524 ieee->iw_mode == IW_MODE_REPEAT) && 515 ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) {
525 !from_assoc_ap) {
526 switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats, 516 switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
527 wds != NULL)) { 517 wds != NULL)) {
528 case AP_RX_CONTINUE_NOT_AUTHORIZED: 518 case AP_RX_CONTINUE_NOT_AUTHORIZED:
@@ -546,11 +536,10 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
546 stype != IEEE80211_STYPE_DATA_CFPOLL && 536 stype != IEEE80211_STYPE_DATA_CFPOLL &&
547 stype != IEEE80211_STYPE_DATA_CFACKPOLL) { 537 stype != IEEE80211_STYPE_DATA_CFACKPOLL) {
548 if (stype != IEEE80211_STYPE_NULLFUNC) 538 if (stype != IEEE80211_STYPE_NULLFUNC)
549 IEEE80211_DEBUG_DROP( 539 IEEE80211_DEBUG_DROP("RX: dropped data frame "
550 "RX: dropped data frame " 540 "with no data (type=0x%02x, "
551 "with no data (type=0x%02x, " 541 "subtype=0x%02x, len=%d)\n",
552 "subtype=0x%02x, len=%d)\n", 542 type, stype, skb->len);
553 type, stype, skb->len);
554 goto rx_dropped; 543 goto rx_dropped;
555 } 544 }
556 545
@@ -560,7 +549,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
560 (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0) 549 (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
561 goto rx_dropped; 550 goto rx_dropped;
562 551
563 hdr = (struct ieee80211_hdr *) skb->data; 552 hdr = (struct ieee80211_hdr *)skb->data;
564 553
565 /* skb: hdr + (possibly fragmented) plaintext payload */ 554 /* skb: hdr + (possibly fragmented) plaintext payload */
566 // PR: FIXME: hostap has additional conditions in the "if" below: 555 // PR: FIXME: hostap has additional conditions in the "if" below:
@@ -614,7 +603,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
614 /* this was the last fragment and the frame will be 603 /* this was the last fragment and the frame will be
615 * delivered, so remove skb from fragment cache */ 604 * delivered, so remove skb from fragment cache */
616 skb = frag_skb; 605 skb = frag_skb;
617 hdr = (struct ieee80211_hdr *) skb->data; 606 hdr = (struct ieee80211_hdr *)skb->data;
618 ieee80211_frag_cache_invalidate(ieee, hdr); 607 ieee80211_frag_cache_invalidate(ieee, hdr);
619 } 608 }
620 609
@@ -624,28 +613,26 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
624 ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) 613 ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
625 goto rx_dropped; 614 goto rx_dropped;
626 615
627 hdr = (struct ieee80211_hdr *) skb->data; 616 hdr = (struct ieee80211_hdr *)skb->data;
628 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) { 617 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) {
629 if (/*ieee->ieee802_1x &&*/ 618 if ( /*ieee->ieee802_1x && */
630 ieee80211_is_eapol_frame(ieee, skb)) { 619 ieee80211_is_eapol_frame(ieee, skb)) {
631 /* pass unencrypted EAPOL frames even if encryption is 620 /* pass unencrypted EAPOL frames even if encryption is
632 * configured */ 621 * configured */
633 } else { 622 } else {
634 IEEE80211_DEBUG_DROP( 623 IEEE80211_DEBUG_DROP("encryption configured, but RX "
635 "encryption configured, but RX " 624 "frame not encrypted (SA=" MAC_FMT
636 "frame not encrypted (SA=" MAC_FMT ")\n", 625 ")\n", MAC_ARG(hdr->addr2));
637 MAC_ARG(hdr->addr2));
638 goto rx_dropped; 626 goto rx_dropped;
639 } 627 }
640 } 628 }
641 629
642 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep && 630 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep &&
643 !ieee80211_is_eapol_frame(ieee, skb)) { 631 !ieee80211_is_eapol_frame(ieee, skb)) {
644 IEEE80211_DEBUG_DROP( 632 IEEE80211_DEBUG_DROP("dropped unencrypted RX data "
645 "dropped unencrypted RX data " 633 "frame from " MAC_FMT
646 "frame from " MAC_FMT 634 " (drop_unencrypted=1)\n",
647 " (drop_unencrypted=1)\n", 635 MAC_ARG(hdr->addr2));
648 MAC_ARG(hdr->addr2));
649 goto rx_dropped; 636 goto rx_dropped;
650 } 637 }
651 638
@@ -673,8 +660,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
673 } else if (!frame_authorized) { 660 } else if (!frame_authorized) {
674 printk(KERN_DEBUG "%s: dropped frame from " 661 printk(KERN_DEBUG "%s: dropped frame from "
675 "unauthorized port (IEEE 802.1X): " 662 "unauthorized port (IEEE 802.1X): "
676 "ethertype=0x%04x\n", 663 "ethertype=0x%04x\n", dev->name, ethertype);
677 dev->name, ethertype);
678 goto rx_dropped; 664 goto rx_dropped;
679 } 665 }
680 } 666 }
@@ -702,8 +688,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
702 688
703#ifdef NOT_YET 689#ifdef NOT_YET
704 if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == 690 if (wds && ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
705 IEEE80211_FCTL_TODS) && 691 IEEE80211_FCTL_TODS) && skb->len >= ETH_HLEN + ETH_ALEN) {
706 skb->len >= ETH_HLEN + ETH_ALEN) {
707 /* Non-standard frame: get addr4 from its bogus location after 692 /* Non-standard frame: get addr4 from its bogus location after
708 * the payload */ 693 * the payload */
709 memcpy(skb->data + ETH_ALEN, 694 memcpy(skb->data + ETH_ALEN,
@@ -716,8 +701,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
716 stats->rx_bytes += skb->len; 701 stats->rx_bytes += skb->len;
717 702
718#ifdef NOT_YET 703#ifdef NOT_YET
719 if (ieee->iw_mode == IW_MODE_MASTER && !wds && 704 if (ieee->iw_mode == IW_MODE_MASTER && !wds && ieee->ap->bridge_packets) {
720 ieee->ap->bridge_packets) {
721 if (dst[0] & 0x01) { 705 if (dst[0] & 0x01) {
722 /* copy multicast frame both to the higher layers and 706 /* copy multicast frame both to the higher layers and
723 * to the wireless media */ 707 * to the wireless media */
@@ -743,25 +727,24 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
743 skb2->dev = dev; 727 skb2->dev = dev;
744 dev_queue_xmit(skb2); 728 dev_queue_xmit(skb2);
745 } 729 }
746
747#endif 730#endif
748 731
749 if (skb) { 732 if (skb) {
750 skb->protocol = eth_type_trans(skb, dev); 733 skb->protocol = eth_type_trans(skb, dev);
751 memset(skb->cb, 0, sizeof(skb->cb)); 734 memset(skb->cb, 0, sizeof(skb->cb));
752 skb->dev = dev; 735 skb->dev = dev;
753 skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */ 736 skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
754 netif_rx(skb); 737 netif_rx(skb);
755 } 738 }
756 739
757 rx_exit: 740 rx_exit:
758#ifdef NOT_YET 741#ifdef NOT_YET
759 if (sta) 742 if (sta)
760 hostap_handle_sta_release(sta); 743 hostap_handle_sta_release(sta);
761#endif 744#endif
762 return 1; 745 return 1;
763 746
764 rx_dropped: 747 rx_dropped:
765 stats->rx_dropped++; 748 stats->rx_dropped++;
766 749
767 /* Returning 0 indicates to caller that we have not handled the SKB-- 750 /* Returning 0 indicates to caller that we have not handled the SKB--
@@ -785,22 +768,21 @@ static inline int ieee80211_is_ofdm_rate(u8 rate)
785 case IEEE80211_OFDM_RATE_54MB: 768 case IEEE80211_OFDM_RATE_54MB:
786 return 1; 769 return 1;
787 } 770 }
788 return 0; 771 return 0;
789} 772}
790 773
791 774static inline int ieee80211_network_init(struct ieee80211_device *ieee,
792static inline int ieee80211_network_init( 775 struct ieee80211_probe_response
793 struct ieee80211_device *ieee, 776 *beacon,
794 struct ieee80211_probe_response *beacon, 777 struct ieee80211_network *network,
795 struct ieee80211_network *network, 778 struct ieee80211_rx_stats *stats)
796 struct ieee80211_rx_stats *stats)
797{ 779{
798#ifdef CONFIG_IEEE80211_DEBUG 780#ifdef CONFIG_IEEE80211_DEBUG
799 char rates_str[64]; 781 char rates_str[64];
800 char *p; 782 char *p;
801#endif 783#endif
802 struct ieee80211_info_element *info_element; 784 struct ieee80211_info_element *info_element;
803 u16 left; 785 u16 left;
804 u8 i; 786 u8 i;
805 787
806 /* Pull out fixed field data */ 788 /* Pull out fixed field data */
@@ -810,7 +792,7 @@ static inline int ieee80211_network_init(
810 network->time_stamp[0] = beacon->time_stamp[0]; 792 network->time_stamp[0] = beacon->time_stamp[0];
811 network->time_stamp[1] = beacon->time_stamp[1]; 793 network->time_stamp[1] = beacon->time_stamp[1];
812 network->beacon_interval = beacon->beacon_interval; 794 network->beacon_interval = beacon->beacon_interval;
813 /* Where to pull this? beacon->listen_interval;*/ 795 /* Where to pull this? beacon->listen_interval; */
814 network->listen_interval = 0x0A; 796 network->listen_interval = 0x0A;
815 network->rates_len = network->rates_ex_len = 0; 797 network->rates_len = network->rates_ex_len = 0;
816 network->last_associate = 0; 798 network->last_associate = 0;
@@ -824,18 +806,20 @@ static inline int ieee80211_network_init(
824 } else 806 } else
825 network->flags |= NETWORK_HAS_CCK; 807 network->flags |= NETWORK_HAS_CCK;
826 808
827 network->wpa_ie_len = 0; 809 network->wpa_ie_len = 0;
828 network->rsn_ie_len = 0; 810 network->rsn_ie_len = 0;
829 811
830 info_element = &beacon->info_element; 812 info_element = &beacon->info_element;
831 left = stats->len - ((void *)info_element - (void *)beacon); 813 left = stats->len - ((void *)info_element - (void *)beacon);
832 while (left >= sizeof(struct ieee80211_info_element_hdr)) { 814 while (left >= sizeof(struct ieee80211_info_element_hdr)) {
833 if (sizeof(struct ieee80211_info_element_hdr) + info_element->len > left) { 815 if (sizeof(struct ieee80211_info_element_hdr) +
834 IEEE80211_DEBUG_SCAN("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n", 816 info_element->len > left) {
835 info_element->len + sizeof(struct ieee80211_info_element), 817 IEEE80211_DEBUG_SCAN
836 left); 818 ("SCAN: parse failed: info_element->len + 2 > left : info_element->len+2=%Zd left=%d.\n",
819 info_element->len +
820 sizeof(struct ieee80211_info_element), left);
837 return 1; 821 return 1;
838 } 822 }
839 823
840 switch (info_element->id) { 824 switch (info_element->id) {
841 case MFIE_TYPE_SSID: 825 case MFIE_TYPE_SSID:
@@ -846,10 +830,11 @@ static inline int ieee80211_network_init(
846 } 830 }
847 831
848 network->ssid_len = min(info_element->len, 832 network->ssid_len = min(info_element->len,
849 (u8)IW_ESSID_MAX_SIZE); 833 (u8) IW_ESSID_MAX_SIZE);
850 memcpy(network->ssid, info_element->data, network->ssid_len); 834 memcpy(network->ssid, info_element->data,
851 if (network->ssid_len < IW_ESSID_MAX_SIZE) 835 network->ssid_len);
852 memset(network->ssid + network->ssid_len, 0, 836 if (network->ssid_len < IW_ESSID_MAX_SIZE)
837 memset(network->ssid + network->ssid_len, 0,
853 IW_ESSID_MAX_SIZE - network->ssid_len); 838 IW_ESSID_MAX_SIZE - network->ssid_len);
854 839
855 IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n", 840 IEEE80211_DEBUG_SCAN("MFIE_TYPE_SSID: '%s' len=%d.\n",
@@ -860,18 +845,23 @@ static inline int ieee80211_network_init(
860#ifdef CONFIG_IEEE80211_DEBUG 845#ifdef CONFIG_IEEE80211_DEBUG
861 p = rates_str; 846 p = rates_str;
862#endif 847#endif
863 network->rates_len = min(info_element->len, MAX_RATES_LENGTH); 848 network->rates_len =
849 min(info_element->len, MAX_RATES_LENGTH);
864 for (i = 0; i < network->rates_len; i++) { 850 for (i = 0; i < network->rates_len; i++) {
865 network->rates[i] = info_element->data[i]; 851 network->rates[i] = info_element->data[i];
866#ifdef CONFIG_IEEE80211_DEBUG 852#ifdef CONFIG_IEEE80211_DEBUG
867 p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); 853 p += snprintf(p,
854 sizeof(rates_str) - (p -
855 rates_str),
856 "%02X ", network->rates[i]);
868#endif 857#endif
869 if (ieee80211_is_ofdm_rate(info_element->data[i])) { 858 if (ieee80211_is_ofdm_rate
859 (info_element->data[i])) {
870 network->flags |= NETWORK_HAS_OFDM; 860 network->flags |= NETWORK_HAS_OFDM;
871 if (info_element->data[i] & 861 if (info_element->data[i] &
872 IEEE80211_BASIC_RATE_MASK) 862 IEEE80211_BASIC_RATE_MASK)
873 network->flags &= 863 network->flags &=
874 ~NETWORK_HAS_CCK; 864 ~NETWORK_HAS_CCK;
875 } 865 }
876 } 866 }
877 867
@@ -883,18 +873,23 @@ static inline int ieee80211_network_init(
883#ifdef CONFIG_IEEE80211_DEBUG 873#ifdef CONFIG_IEEE80211_DEBUG
884 p = rates_str; 874 p = rates_str;
885#endif 875#endif
886 network->rates_ex_len = min(info_element->len, MAX_RATES_EX_LENGTH); 876 network->rates_ex_len =
877 min(info_element->len, MAX_RATES_EX_LENGTH);
887 for (i = 0; i < network->rates_ex_len; i++) { 878 for (i = 0; i < network->rates_ex_len; i++) {
888 network->rates_ex[i] = info_element->data[i]; 879 network->rates_ex[i] = info_element->data[i];
889#ifdef CONFIG_IEEE80211_DEBUG 880#ifdef CONFIG_IEEE80211_DEBUG
890 p += snprintf(p, sizeof(rates_str) - (p - rates_str), "%02X ", network->rates[i]); 881 p += snprintf(p,
882 sizeof(rates_str) - (p -
883 rates_str),
884 "%02X ", network->rates[i]);
891#endif 885#endif
892 if (ieee80211_is_ofdm_rate(info_element->data[i])) { 886 if (ieee80211_is_ofdm_rate
887 (info_element->data[i])) {
893 network->flags |= NETWORK_HAS_OFDM; 888 network->flags |= NETWORK_HAS_OFDM;
894 if (info_element->data[i] & 889 if (info_element->data[i] &
895 IEEE80211_BASIC_RATE_MASK) 890 IEEE80211_BASIC_RATE_MASK)
896 network->flags &= 891 network->flags &=
897 ~NETWORK_HAS_CCK; 892 ~NETWORK_HAS_CCK;
898 } 893 }
899 } 894 }
900 895
@@ -903,14 +898,14 @@ static inline int ieee80211_network_init(
903 break; 898 break;
904 899
905 case MFIE_TYPE_DS_SET: 900 case MFIE_TYPE_DS_SET:
906 IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n", 901 IEEE80211_DEBUG_SCAN("MFIE_TYPE_DS_SET: %d\n",
907 info_element->data[0]); 902 info_element->data[0]);
908 if (stats->freq == IEEE80211_24GHZ_BAND) 903 if (stats->freq == IEEE80211_24GHZ_BAND)
909 network->channel = info_element->data[0]; 904 network->channel = info_element->data[0];
910 break; 905 break;
911 906
912 case MFIE_TYPE_FH_SET: 907 case MFIE_TYPE_FH_SET:
913 IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n"); 908 IEEE80211_DEBUG_SCAN("MFIE_TYPE_FH_SET: ignored\n");
914 break; 909 break;
915 910
916 case MFIE_TYPE_CF_SET: 911 case MFIE_TYPE_CF_SET:
@@ -932,13 +927,13 @@ static inline int ieee80211_network_init(
932 case MFIE_TYPE_GENERIC: 927 case MFIE_TYPE_GENERIC:
933 IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n", 928 IEEE80211_DEBUG_SCAN("MFIE_TYPE_GENERIC: %d bytes\n",
934 info_element->len); 929 info_element->len);
935 if (info_element->len >= 4 && 930 if (info_element->len >= 4 &&
936 info_element->data[0] == 0x00 && 931 info_element->data[0] == 0x00 &&
937 info_element->data[1] == 0x50 && 932 info_element->data[1] == 0x50 &&
938 info_element->data[2] == 0xf2 && 933 info_element->data[2] == 0xf2 &&
939 info_element->data[3] == 0x01) { 934 info_element->data[3] == 0x01) {
940 network->wpa_ie_len = min(info_element->len + 2, 935 network->wpa_ie_len = min(info_element->len + 2,
941 MAX_WPA_IE_LEN); 936 MAX_WPA_IE_LEN);
942 memcpy(network->wpa_ie, info_element, 937 memcpy(network->wpa_ie, info_element,
943 network->wpa_ie_len); 938 network->wpa_ie_len);
944 } 939 }
@@ -948,7 +943,7 @@ static inline int ieee80211_network_init(
948 IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n", 943 IEEE80211_DEBUG_SCAN("MFIE_TYPE_RSN: %d bytes\n",
949 info_element->len); 944 info_element->len);
950 network->rsn_ie_len = min(info_element->len + 2, 945 network->rsn_ie_len = min(info_element->len + 2,
951 MAX_WPA_IE_LEN); 946 MAX_WPA_IE_LEN);
952 memcpy(network->rsn_ie, info_element, 947 memcpy(network->rsn_ie, info_element,
953 network->rsn_ie_len); 948 network->rsn_ie_len);
954 break; 949 break;
@@ -956,14 +951,14 @@ static inline int ieee80211_network_init(
956 default: 951 default:
957 IEEE80211_DEBUG_SCAN("unsupported IE %d\n", 952 IEEE80211_DEBUG_SCAN("unsupported IE %d\n",
958 info_element->id); 953 info_element->id);
959 break; 954 break;
960 } 955 }
961 956
962 left -= sizeof(struct ieee80211_info_element_hdr) + 957 left -= sizeof(struct ieee80211_info_element_hdr) +
963 info_element->len; 958 info_element->len;
964 info_element = (struct ieee80211_info_element *) 959 info_element = (struct ieee80211_info_element *)
965 &info_element->data[info_element->len]; 960 &info_element->data[info_element->len];
966 } 961 }
967 962
968 network->mode = 0; 963 network->mode = 0;
969 if (stats->freq == IEEE80211_52GHZ_BAND) 964 if (stats->freq == IEEE80211_52GHZ_BAND)
@@ -1032,10 +1027,13 @@ static inline void update_network(struct ieee80211_network *dst,
1032 /* dst->last_associate is not overwritten */ 1027 /* dst->last_associate is not overwritten */
1033} 1028}
1034 1029
1035static inline void ieee80211_process_probe_response( 1030static inline void ieee80211_process_probe_response(struct ieee80211_device
1036 struct ieee80211_device *ieee, 1031 *ieee,
1037 struct ieee80211_probe_response *beacon, 1032 struct
1038 struct ieee80211_rx_stats *stats) 1033 ieee80211_probe_response
1034 *beacon,
1035 struct ieee80211_rx_stats
1036 *stats)
1039{ 1037{
1040 struct ieee80211_network network; 1038 struct ieee80211_network network;
1041 struct ieee80211_network *target; 1039 struct ieee80211_network *target;
@@ -1045,33 +1043,35 @@ static inline void ieee80211_process_probe_response(
1045#endif 1043#endif
1046 unsigned long flags; 1044 unsigned long flags;
1047 1045
1048 IEEE80211_DEBUG_SCAN( 1046 IEEE80211_DEBUG_SCAN("'%s' (" MAC_FMT
1049 "'%s' (" MAC_FMT "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n", 1047 "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
1050 escape_essid(info_element->data, info_element->len), 1048 escape_essid(info_element->data,
1051 MAC_ARG(beacon->header.addr3), 1049 info_element->len),
1052 (beacon->capability & (1<<0xf)) ? '1' : '0', 1050 MAC_ARG(beacon->header.addr3),
1053 (beacon->capability & (1<<0xe)) ? '1' : '0', 1051 (beacon->capability & (1 << 0xf)) ? '1' : '0',
1054 (beacon->capability & (1<<0xd)) ? '1' : '0', 1052 (beacon->capability & (1 << 0xe)) ? '1' : '0',
1055 (beacon->capability & (1<<0xc)) ? '1' : '0', 1053 (beacon->capability & (1 << 0xd)) ? '1' : '0',
1056 (beacon->capability & (1<<0xb)) ? '1' : '0', 1054 (beacon->capability & (1 << 0xc)) ? '1' : '0',
1057 (beacon->capability & (1<<0xa)) ? '1' : '0', 1055 (beacon->capability & (1 << 0xb)) ? '1' : '0',
1058 (beacon->capability & (1<<0x9)) ? '1' : '0', 1056 (beacon->capability & (1 << 0xa)) ? '1' : '0',
1059 (beacon->capability & (1<<0x8)) ? '1' : '0', 1057 (beacon->capability & (1 << 0x9)) ? '1' : '0',
1060 (beacon->capability & (1<<0x7)) ? '1' : '0', 1058 (beacon->capability & (1 << 0x8)) ? '1' : '0',
1061 (beacon->capability & (1<<0x6)) ? '1' : '0', 1059 (beacon->capability & (1 << 0x7)) ? '1' : '0',
1062 (beacon->capability & (1<<0x5)) ? '1' : '0', 1060 (beacon->capability & (1 << 0x6)) ? '1' : '0',
1063 (beacon->capability & (1<<0x4)) ? '1' : '0', 1061 (beacon->capability & (1 << 0x5)) ? '1' : '0',
1064 (beacon->capability & (1<<0x3)) ? '1' : '0', 1062 (beacon->capability & (1 << 0x4)) ? '1' : '0',
1065 (beacon->capability & (1<<0x2)) ? '1' : '0', 1063 (beacon->capability & (1 << 0x3)) ? '1' : '0',
1066 (beacon->capability & (1<<0x1)) ? '1' : '0', 1064 (beacon->capability & (1 << 0x2)) ? '1' : '0',
1067 (beacon->capability & (1<<0x0)) ? '1' : '0'); 1065 (beacon->capability & (1 << 0x1)) ? '1' : '0',
1066 (beacon->capability & (1 << 0x0)) ? '1' : '0');
1068 1067
1069 if (ieee80211_network_init(ieee, beacon, &network, stats)) { 1068 if (ieee80211_network_init(ieee, beacon, &network, stats)) {
1070 IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n", 1069 IEEE80211_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n",
1071 escape_essid(info_element->data, 1070 escape_essid(info_element->data,
1072 info_element->len), 1071 info_element->len),
1073 MAC_ARG(beacon->header.addr3), 1072 MAC_ARG(beacon->header.addr3),
1074 WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == 1073 WLAN_FC_GET_STYPE(beacon->header.
1074 frame_ctl) ==
1075 IEEE80211_STYPE_PROBE_RESP ? 1075 IEEE80211_STYPE_PROBE_RESP ?
1076 "PROBE RESPONSE" : "BEACON"); 1076 "PROBE RESPONSE" : "BEACON");
1077 return; 1077 return;
@@ -1117,13 +1117,13 @@ static inline void ieee80211_process_probe_response(
1117 list_del(ieee->network_free_list.next); 1117 list_del(ieee->network_free_list.next);
1118 } 1118 }
1119 1119
1120
1121#ifdef CONFIG_IEEE80211_DEBUG 1120#ifdef CONFIG_IEEE80211_DEBUG
1122 IEEE80211_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n", 1121 IEEE80211_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n",
1123 escape_essid(network.ssid, 1122 escape_essid(network.ssid,
1124 network.ssid_len), 1123 network.ssid_len),
1125 MAC_ARG(network.bssid), 1124 MAC_ARG(network.bssid),
1126 WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == 1125 WLAN_FC_GET_STYPE(beacon->header.
1126 frame_ctl) ==
1127 IEEE80211_STYPE_PROBE_RESP ? 1127 IEEE80211_STYPE_PROBE_RESP ?
1128 "PROBE RESPONSE" : "BEACON"); 1128 "PROBE RESPONSE" : "BEACON");
1129#endif 1129#endif
@@ -1134,7 +1134,8 @@ static inline void ieee80211_process_probe_response(
1134 escape_essid(target->ssid, 1134 escape_essid(target->ssid,
1135 target->ssid_len), 1135 target->ssid_len),
1136 MAC_ARG(target->bssid), 1136 MAC_ARG(target->bssid),
1137 WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == 1137 WLAN_FC_GET_STYPE(beacon->header.
1138 frame_ctl) ==
1138 IEEE80211_STYPE_PROBE_RESP ? 1139 IEEE80211_STYPE_PROBE_RESP ?
1139 "PROBE RESPONSE" : "BEACON"); 1140 "PROBE RESPONSE" : "BEACON");
1140 update_network(target, &network); 1141 update_network(target, &network);
@@ -1162,16 +1163,20 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
1162 IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n", 1163 IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
1163 WLAN_FC_GET_STYPE(header->frame_ctl)); 1164 WLAN_FC_GET_STYPE(header->frame_ctl));
1164 IEEE80211_DEBUG_SCAN("Probe response\n"); 1165 IEEE80211_DEBUG_SCAN("Probe response\n");
1165 ieee80211_process_probe_response( 1166 ieee80211_process_probe_response(ieee,
1166 ieee, (struct ieee80211_probe_response *)header, stats); 1167 (struct
1168 ieee80211_probe_response *)
1169 header, stats);
1167 break; 1170 break;
1168 1171
1169 case IEEE80211_STYPE_BEACON: 1172 case IEEE80211_STYPE_BEACON:
1170 IEEE80211_DEBUG_MGMT("received BEACON (%d)\n", 1173 IEEE80211_DEBUG_MGMT("received BEACON (%d)\n",
1171 WLAN_FC_GET_STYPE(header->frame_ctl)); 1174 WLAN_FC_GET_STYPE(header->frame_ctl));
1172 IEEE80211_DEBUG_SCAN("Beacon\n"); 1175 IEEE80211_DEBUG_SCAN("Beacon\n");
1173 ieee80211_process_probe_response( 1176 ieee80211_process_probe_response(ieee,
1174 ieee, (struct ieee80211_probe_response *)header, stats); 1177 (struct
1178 ieee80211_probe_response *)
1179 header, stats);
1175 break; 1180 break;
1176 1181
1177 default: 1182 default:
@@ -1184,6 +1189,5 @@ void ieee80211_rx_mgt(struct ieee80211_device *ieee,
1184 } 1189 }
1185} 1190}
1186 1191
1187
1188EXPORT_SYMBOL(ieee80211_rx_mgt); 1192EXPORT_SYMBOL(ieee80211_rx_mgt);
1189EXPORT_SYMBOL(ieee80211_rx); 1193EXPORT_SYMBOL(ieee80211_rx);