diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2007-07-27 09:43:22 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:47:33 -0400 |
commit | e2ebc74d7e3d71600640db6fbb28cc2f362184c1 (patch) | |
tree | 7f9a830869b9f6157ee8235feb4953df7a639dbd /net/mac80211/ieee80211.c | |
parent | 340e11f332c695c43f506e82b1d39d00716c5005 (diff) |
[MAC80211]: split TX path into own file
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/ieee80211.c')
-rw-r--r-- | net/mac80211/ieee80211.c | 1845 |
1 files changed, 0 insertions, 1845 deletions
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c index c0094209bed9..a35e3a95a15a 100644 --- a/net/mac80211/ieee80211.c +++ b/net/mac80211/ieee80211.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/compiler.h> | 24 | #include <linux/compiler.h> |
25 | #include <linux/bitmap.h> | 25 | #include <linux/bitmap.h> |
26 | #include <net/cfg80211.h> | 26 | #include <net/cfg80211.h> |
27 | #include <asm/unaligned.h> | ||
28 | 27 | ||
29 | #include "ieee80211_common.h" | 28 | #include "ieee80211_common.h" |
30 | #include "ieee80211_i.h" | 29 | #include "ieee80211_i.h" |
@@ -68,16 +67,6 @@ struct ieee80211_tx_status_rtap_hdr { | |||
68 | } __attribute__ ((packed)); | 67 | } __attribute__ ((packed)); |
69 | 68 | ||
70 | 69 | ||
71 | static inline void ieee80211_include_sequence(struct ieee80211_sub_if_data *sdata, | ||
72 | struct ieee80211_hdr *hdr) | ||
73 | { | ||
74 | /* Set the sequence number for this frame. */ | ||
75 | hdr->seq_ctrl = cpu_to_le16(sdata->sequence); | ||
76 | |||
77 | /* Increase the sequence number. */ | ||
78 | sdata->sequence = (sdata->sequence + 0x10) & IEEE80211_SCTL_SEQ; | ||
79 | } | ||
80 | |||
81 | struct ieee80211_key_conf * | 70 | struct ieee80211_key_conf * |
82 | ieee80211_key_data2conf(struct ieee80211_local *local, | 71 | ieee80211_key_data2conf(struct ieee80211_local *local, |
83 | const struct ieee80211_key *data) | 72 | const struct ieee80211_key *data) |
@@ -346,45 +335,6 @@ int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb) | |||
346 | EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb); | 335 | EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb); |
347 | 336 | ||
348 | 337 | ||
349 | #ifdef CONFIG_MAC80211_LOWTX_FRAME_DUMP | ||
350 | static void ieee80211_dump_frame(const char *ifname, const char *title, | ||
351 | const struct sk_buff *skb) | ||
352 | { | ||
353 | const struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
354 | u16 fc; | ||
355 | int hdrlen; | ||
356 | |||
357 | printk(KERN_DEBUG "%s: %s (len=%d)", ifname, title, skb->len); | ||
358 | if (skb->len < 4) { | ||
359 | printk("\n"); | ||
360 | return; | ||
361 | } | ||
362 | |||
363 | fc = le16_to_cpu(hdr->frame_control); | ||
364 | hdrlen = ieee80211_get_hdrlen(fc); | ||
365 | if (hdrlen > skb->len) | ||
366 | hdrlen = skb->len; | ||
367 | if (hdrlen >= 4) | ||
368 | printk(" FC=0x%04x DUR=0x%04x", | ||
369 | fc, le16_to_cpu(hdr->duration_id)); | ||
370 | if (hdrlen >= 10) | ||
371 | printk(" A1=" MAC_FMT, MAC_ARG(hdr->addr1)); | ||
372 | if (hdrlen >= 16) | ||
373 | printk(" A2=" MAC_FMT, MAC_ARG(hdr->addr2)); | ||
374 | if (hdrlen >= 24) | ||
375 | printk(" A3=" MAC_FMT, MAC_ARG(hdr->addr3)); | ||
376 | if (hdrlen >= 30) | ||
377 | printk(" A4=" MAC_FMT, MAC_ARG(hdr->addr4)); | ||
378 | printk("\n"); | ||
379 | } | ||
380 | #else /* CONFIG_MAC80211_LOWTX_FRAME_DUMP */ | ||
381 | static inline void ieee80211_dump_frame(const char *ifname, const char *title, | ||
382 | struct sk_buff *skb) | ||
383 | { | ||
384 | } | ||
385 | #endif /* CONFIG_MAC80211_LOWTX_FRAME_DUMP */ | ||
386 | |||
387 | |||
388 | int ieee80211_is_eapol(const struct sk_buff *skb) | 338 | int ieee80211_is_eapol(const struct sk_buff *skb) |
389 | { | 339 | { |
390 | const struct ieee80211_hdr *hdr; | 340 | const struct ieee80211_hdr *hdr; |
@@ -411,187 +361,6 @@ int ieee80211_is_eapol(const struct sk_buff *skb) | |||
411 | } | 361 | } |
412 | 362 | ||
413 | 363 | ||
414 | static ieee80211_txrx_result | ||
415 | ieee80211_tx_h_rate_ctrl(struct ieee80211_txrx_data *tx) | ||
416 | { | ||
417 | struct rate_control_extra extra; | ||
418 | |||
419 | memset(&extra, 0, sizeof(extra)); | ||
420 | extra.mode = tx->u.tx.mode; | ||
421 | extra.mgmt_data = tx->sdata && | ||
422 | tx->sdata->type == IEEE80211_IF_TYPE_MGMT; | ||
423 | extra.ethertype = tx->ethertype; | ||
424 | |||
425 | tx->u.tx.rate = rate_control_get_rate(tx->local, tx->dev, tx->skb, | ||
426 | &extra); | ||
427 | if (unlikely(extra.probe != NULL)) { | ||
428 | tx->u.tx.control->flags |= IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
429 | tx->u.tx.probe_last_frag = 1; | ||
430 | tx->u.tx.control->alt_retry_rate = tx->u.tx.rate->val; | ||
431 | tx->u.tx.rate = extra.probe; | ||
432 | } else { | ||
433 | tx->u.tx.control->alt_retry_rate = -1; | ||
434 | } | ||
435 | if (!tx->u.tx.rate) | ||
436 | return TXRX_DROP; | ||
437 | if (tx->u.tx.mode->mode == MODE_IEEE80211G && | ||
438 | tx->sdata->use_protection && tx->fragmented && | ||
439 | extra.nonerp) { | ||
440 | tx->u.tx.last_frag_rate = tx->u.tx.rate; | ||
441 | tx->u.tx.probe_last_frag = extra.probe ? 1 : 0; | ||
442 | |||
443 | tx->u.tx.rate = extra.nonerp; | ||
444 | tx->u.tx.control->rate = extra.nonerp; | ||
445 | tx->u.tx.control->flags &= ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
446 | } else { | ||
447 | tx->u.tx.last_frag_rate = tx->u.tx.rate; | ||
448 | tx->u.tx.control->rate = tx->u.tx.rate; | ||
449 | } | ||
450 | tx->u.tx.control->tx_rate = tx->u.tx.rate->val; | ||
451 | if ((tx->u.tx.rate->flags & IEEE80211_RATE_PREAMBLE2) && | ||
452 | tx->local->short_preamble && | ||
453 | (!tx->sta || (tx->sta->flags & WLAN_STA_SHORT_PREAMBLE))) { | ||
454 | tx->u.tx.short_preamble = 1; | ||
455 | tx->u.tx.control->tx_rate = tx->u.tx.rate->val2; | ||
456 | } | ||
457 | |||
458 | return TXRX_CONTINUE; | ||
459 | } | ||
460 | |||
461 | |||
462 | static ieee80211_txrx_result | ||
463 | ieee80211_tx_h_select_key(struct ieee80211_txrx_data *tx) | ||
464 | { | ||
465 | if (tx->sta) | ||
466 | tx->u.tx.control->key_idx = tx->sta->key_idx_compression; | ||
467 | else | ||
468 | tx->u.tx.control->key_idx = HW_KEY_IDX_INVALID; | ||
469 | |||
470 | if (unlikely(tx->u.tx.control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) | ||
471 | tx->key = NULL; | ||
472 | else if (tx->sta && tx->sta->key) | ||
473 | tx->key = tx->sta->key; | ||
474 | else if (tx->sdata->default_key) | ||
475 | tx->key = tx->sdata->default_key; | ||
476 | else if (tx->sdata->drop_unencrypted && | ||
477 | !(tx->sdata->eapol && ieee80211_is_eapol(tx->skb))) { | ||
478 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); | ||
479 | return TXRX_DROP; | ||
480 | } else | ||
481 | tx->key = NULL; | ||
482 | |||
483 | if (tx->key) { | ||
484 | tx->key->tx_rx_count++; | ||
485 | if (unlikely(tx->local->key_tx_rx_threshold && | ||
486 | tx->key->tx_rx_count > | ||
487 | tx->local->key_tx_rx_threshold)) { | ||
488 | ieee80211_key_threshold_notify(tx->dev, tx->key, | ||
489 | tx->sta); | ||
490 | } | ||
491 | } | ||
492 | |||
493 | return TXRX_CONTINUE; | ||
494 | } | ||
495 | |||
496 | |||
497 | static ieee80211_txrx_result | ||
498 | ieee80211_tx_h_fragment(struct ieee80211_txrx_data *tx) | ||
499 | { | ||
500 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
501 | size_t hdrlen, per_fragm, num_fragm, payload_len, left; | ||
502 | struct sk_buff **frags, *first, *frag; | ||
503 | int i; | ||
504 | u16 seq; | ||
505 | u8 *pos; | ||
506 | int frag_threshold = tx->local->fragmentation_threshold; | ||
507 | |||
508 | if (!tx->fragmented) | ||
509 | return TXRX_CONTINUE; | ||
510 | |||
511 | first = tx->skb; | ||
512 | |||
513 | hdrlen = ieee80211_get_hdrlen(tx->fc); | ||
514 | payload_len = first->len - hdrlen; | ||
515 | per_fragm = frag_threshold - hdrlen - FCS_LEN; | ||
516 | num_fragm = (payload_len + per_fragm - 1) / per_fragm; | ||
517 | |||
518 | frags = kzalloc(num_fragm * sizeof(struct sk_buff *), GFP_ATOMIC); | ||
519 | if (!frags) | ||
520 | goto fail; | ||
521 | |||
522 | hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); | ||
523 | seq = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ; | ||
524 | pos = first->data + hdrlen + per_fragm; | ||
525 | left = payload_len - per_fragm; | ||
526 | for (i = 0; i < num_fragm - 1; i++) { | ||
527 | struct ieee80211_hdr *fhdr; | ||
528 | size_t copylen; | ||
529 | |||
530 | if (left <= 0) | ||
531 | goto fail; | ||
532 | |||
533 | /* reserve enough extra head and tail room for possible | ||
534 | * encryption */ | ||
535 | frag = frags[i] = | ||
536 | dev_alloc_skb(tx->local->tx_headroom + | ||
537 | frag_threshold + | ||
538 | IEEE80211_ENCRYPT_HEADROOM + | ||
539 | IEEE80211_ENCRYPT_TAILROOM); | ||
540 | if (!frag) | ||
541 | goto fail; | ||
542 | /* Make sure that all fragments use the same priority so | ||
543 | * that they end up using the same TX queue */ | ||
544 | frag->priority = first->priority; | ||
545 | skb_reserve(frag, tx->local->tx_headroom + | ||
546 | IEEE80211_ENCRYPT_HEADROOM); | ||
547 | fhdr = (struct ieee80211_hdr *) skb_put(frag, hdrlen); | ||
548 | memcpy(fhdr, first->data, hdrlen); | ||
549 | if (i == num_fragm - 2) | ||
550 | fhdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREFRAGS); | ||
551 | fhdr->seq_ctrl = cpu_to_le16(seq | ((i + 1) & IEEE80211_SCTL_FRAG)); | ||
552 | copylen = left > per_fragm ? per_fragm : left; | ||
553 | memcpy(skb_put(frag, copylen), pos, copylen); | ||
554 | |||
555 | pos += copylen; | ||
556 | left -= copylen; | ||
557 | } | ||
558 | skb_trim(first, hdrlen + per_fragm); | ||
559 | |||
560 | tx->u.tx.num_extra_frag = num_fragm - 1; | ||
561 | tx->u.tx.extra_frag = frags; | ||
562 | |||
563 | return TXRX_CONTINUE; | ||
564 | |||
565 | fail: | ||
566 | printk(KERN_DEBUG "%s: failed to fragment frame\n", tx->dev->name); | ||
567 | if (frags) { | ||
568 | for (i = 0; i < num_fragm - 1; i++) | ||
569 | if (frags[i]) | ||
570 | dev_kfree_skb(frags[i]); | ||
571 | kfree(frags); | ||
572 | } | ||
573 | I802_DEBUG_INC(tx->local->tx_handlers_drop_fragment); | ||
574 | return TXRX_DROP; | ||
575 | } | ||
576 | |||
577 | |||
578 | static int wep_encrypt_skb(struct ieee80211_txrx_data *tx, struct sk_buff *skb) | ||
579 | { | ||
580 | if (tx->key->force_sw_encrypt) { | ||
581 | if (ieee80211_wep_encrypt(tx->local, skb, tx->key)) | ||
582 | return -1; | ||
583 | } else { | ||
584 | tx->u.tx.control->key_idx = tx->key->hw_key_idx; | ||
585 | if (tx->local->hw.flags & IEEE80211_HW_WEP_INCLUDE_IV) { | ||
586 | if (ieee80211_wep_add_iv(tx->local, skb, tx->key) == | ||
587 | NULL) | ||
588 | return -1; | ||
589 | } | ||
590 | } | ||
591 | return 0; | ||
592 | } | ||
593 | |||
594 | |||
595 | void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx) | 364 | void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx) |
596 | { | 365 | { |
597 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | 366 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; |
@@ -609,44 +378,6 @@ void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx) | |||
609 | } | 378 | } |
610 | 379 | ||
611 | 380 | ||
612 | static ieee80211_txrx_result | ||
613 | ieee80211_tx_h_wep_encrypt(struct ieee80211_txrx_data *tx) | ||
614 | { | ||
615 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
616 | u16 fc; | ||
617 | |||
618 | fc = le16_to_cpu(hdr->frame_control); | ||
619 | |||
620 | if (!tx->key || tx->key->alg != ALG_WEP || | ||
621 | ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA && | ||
622 | ((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT || | ||
623 | (fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH))) | ||
624 | return TXRX_CONTINUE; | ||
625 | |||
626 | tx->u.tx.control->iv_len = WEP_IV_LEN; | ||
627 | tx->u.tx.control->icv_len = WEP_ICV_LEN; | ||
628 | ieee80211_tx_set_iswep(tx); | ||
629 | |||
630 | if (wep_encrypt_skb(tx, tx->skb) < 0) { | ||
631 | I802_DEBUG_INC(tx->local->tx_handlers_drop_wep); | ||
632 | return TXRX_DROP; | ||
633 | } | ||
634 | |||
635 | if (tx->u.tx.extra_frag) { | ||
636 | int i; | ||
637 | for (i = 0; i < tx->u.tx.num_extra_frag; i++) { | ||
638 | if (wep_encrypt_skb(tx, tx->u.tx.extra_frag[i]) < 0) { | ||
639 | I802_DEBUG_INC(tx->local-> | ||
640 | tx_handlers_drop_wep); | ||
641 | return TXRX_DROP; | ||
642 | } | ||
643 | } | ||
644 | } | ||
645 | |||
646 | return TXRX_CONTINUE; | ||
647 | } | ||
648 | |||
649 | |||
650 | static int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, | 381 | static int ieee80211_frame_duration(struct ieee80211_local *local, size_t len, |
651 | int rate, int erp, int short_preamble) | 382 | int rate, int erp, int short_preamble) |
652 | { | 383 | { |
@@ -720,1400 +451,6 @@ __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, | |||
720 | EXPORT_SYMBOL(ieee80211_generic_frame_duration); | 451 | EXPORT_SYMBOL(ieee80211_generic_frame_duration); |
721 | 452 | ||
722 | 453 | ||
723 | static u16 ieee80211_duration(struct ieee80211_txrx_data *tx, int group_addr, | ||
724 | int next_frag_len) | ||
725 | { | ||
726 | int rate, mrate, erp, dur, i; | ||
727 | struct ieee80211_rate *txrate = tx->u.tx.rate; | ||
728 | struct ieee80211_local *local = tx->local; | ||
729 | struct ieee80211_hw_mode *mode = tx->u.tx.mode; | ||
730 | |||
731 | erp = txrate->flags & IEEE80211_RATE_ERP; | ||
732 | |||
733 | /* | ||
734 | * data and mgmt (except PS Poll): | ||
735 | * - during CFP: 32768 | ||
736 | * - during contention period: | ||
737 | * if addr1 is group address: 0 | ||
738 | * if more fragments = 0 and addr1 is individual address: time to | ||
739 | * transmit one ACK plus SIFS | ||
740 | * if more fragments = 1 and addr1 is individual address: time to | ||
741 | * transmit next fragment plus 2 x ACK plus 3 x SIFS | ||
742 | * | ||
743 | * IEEE 802.11, 9.6: | ||
744 | * - control response frame (CTS or ACK) shall be transmitted using the | ||
745 | * same rate as the immediately previous frame in the frame exchange | ||
746 | * sequence, if this rate belongs to the PHY mandatory rates, or else | ||
747 | * at the highest possible rate belonging to the PHY rates in the | ||
748 | * BSSBasicRateSet | ||
749 | */ | ||
750 | |||
751 | if ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) { | ||
752 | /* TODO: These control frames are not currently sent by | ||
753 | * 80211.o, but should they be implemented, this function | ||
754 | * needs to be updated to support duration field calculation. | ||
755 | * | ||
756 | * RTS: time needed to transmit pending data/mgmt frame plus | ||
757 | * one CTS frame plus one ACK frame plus 3 x SIFS | ||
758 | * CTS: duration of immediately previous RTS minus time | ||
759 | * required to transmit CTS and its SIFS | ||
760 | * ACK: 0 if immediately previous directed data/mgmt had | ||
761 | * more=0, with more=1 duration in ACK frame is duration | ||
762 | * from previous frame minus time needed to transmit ACK | ||
763 | * and its SIFS | ||
764 | * PS Poll: BIT(15) | BIT(14) | aid | ||
765 | */ | ||
766 | return 0; | ||
767 | } | ||
768 | |||
769 | /* data/mgmt */ | ||
770 | if (0 /* FIX: data/mgmt during CFP */) | ||
771 | return 32768; | ||
772 | |||
773 | if (group_addr) /* Group address as the destination - no ACK */ | ||
774 | return 0; | ||
775 | |||
776 | /* Individual destination address: | ||
777 | * IEEE 802.11, Ch. 9.6 (after IEEE 802.11g changes) | ||
778 | * CTS and ACK frames shall be transmitted using the highest rate in | ||
779 | * basic rate set that is less than or equal to the rate of the | ||
780 | * immediately previous frame and that is using the same modulation | ||
781 | * (CCK or OFDM). If no basic rate set matches with these requirements, | ||
782 | * the highest mandatory rate of the PHY that is less than or equal to | ||
783 | * the rate of the previous frame is used. | ||
784 | * Mandatory rates for IEEE 802.11g PHY: 1, 2, 5.5, 11, 6, 12, 24 Mbps | ||
785 | */ | ||
786 | rate = -1; | ||
787 | mrate = 10; /* use 1 Mbps if everything fails */ | ||
788 | for (i = 0; i < mode->num_rates; i++) { | ||
789 | struct ieee80211_rate *r = &mode->rates[i]; | ||
790 | if (r->rate > txrate->rate) | ||
791 | break; | ||
792 | |||
793 | if (IEEE80211_RATE_MODULATION(txrate->flags) != | ||
794 | IEEE80211_RATE_MODULATION(r->flags)) | ||
795 | continue; | ||
796 | |||
797 | if (r->flags & IEEE80211_RATE_BASIC) | ||
798 | rate = r->rate; | ||
799 | else if (r->flags & IEEE80211_RATE_MANDATORY) | ||
800 | mrate = r->rate; | ||
801 | } | ||
802 | if (rate == -1) { | ||
803 | /* No matching basic rate found; use highest suitable mandatory | ||
804 | * PHY rate */ | ||
805 | rate = mrate; | ||
806 | } | ||
807 | |||
808 | /* Time needed to transmit ACK | ||
809 | * (10 bytes + 4-byte FCS = 112 bits) plus SIFS; rounded up | ||
810 | * to closest integer */ | ||
811 | |||
812 | dur = ieee80211_frame_duration(local, 10, rate, erp, | ||
813 | local->short_preamble); | ||
814 | |||
815 | if (next_frag_len) { | ||
816 | /* Frame is fragmented: duration increases with time needed to | ||
817 | * transmit next fragment plus ACK and 2 x SIFS. */ | ||
818 | dur *= 2; /* ACK + SIFS */ | ||
819 | /* next fragment */ | ||
820 | dur += ieee80211_frame_duration(local, next_frag_len, | ||
821 | txrate->rate, erp, | ||
822 | local->short_preamble); | ||
823 | } | ||
824 | |||
825 | return dur; | ||
826 | } | ||
827 | |||
828 | |||
829 | static ieee80211_txrx_result | ||
830 | ieee80211_tx_h_misc(struct ieee80211_txrx_data *tx) | ||
831 | { | ||
832 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
833 | u16 dur; | ||
834 | struct ieee80211_tx_control *control = tx->u.tx.control; | ||
835 | struct ieee80211_hw_mode *mode = tx->u.tx.mode; | ||
836 | |||
837 | if (!is_multicast_ether_addr(hdr->addr1)) { | ||
838 | if (tx->skb->len + FCS_LEN > tx->local->rts_threshold && | ||
839 | tx->local->rts_threshold < IEEE80211_MAX_RTS_THRESHOLD) { | ||
840 | control->flags |= IEEE80211_TXCTL_USE_RTS_CTS; | ||
841 | control->retry_limit = | ||
842 | tx->local->long_retry_limit; | ||
843 | } else { | ||
844 | control->retry_limit = | ||
845 | tx->local->short_retry_limit; | ||
846 | } | ||
847 | } else { | ||
848 | control->retry_limit = 1; | ||
849 | } | ||
850 | |||
851 | if (tx->fragmented) { | ||
852 | /* Do not use multiple retry rates when sending fragmented | ||
853 | * frames. | ||
854 | * TODO: The last fragment could still use multiple retry | ||
855 | * rates. */ | ||
856 | control->alt_retry_rate = -1; | ||
857 | } | ||
858 | |||
859 | /* Use CTS protection for unicast frames sent using extended rates if | ||
860 | * there are associated non-ERP stations and RTS/CTS is not configured | ||
861 | * for the frame. */ | ||
862 | if (mode->mode == MODE_IEEE80211G && | ||
863 | (tx->u.tx.rate->flags & IEEE80211_RATE_ERP) && | ||
864 | tx->u.tx.unicast && tx->sdata->use_protection && | ||
865 | !(control->flags & IEEE80211_TXCTL_USE_RTS_CTS)) | ||
866 | control->flags |= IEEE80211_TXCTL_USE_CTS_PROTECT; | ||
867 | |||
868 | /* Setup duration field for the first fragment of the frame. Duration | ||
869 | * for remaining fragments will be updated when they are being sent | ||
870 | * to low-level driver in ieee80211_tx(). */ | ||
871 | dur = ieee80211_duration(tx, is_multicast_ether_addr(hdr->addr1), | ||
872 | tx->fragmented ? tx->u.tx.extra_frag[0]->len : | ||
873 | 0); | ||
874 | hdr->duration_id = cpu_to_le16(dur); | ||
875 | |||
876 | if ((control->flags & IEEE80211_TXCTL_USE_RTS_CTS) || | ||
877 | (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { | ||
878 | struct ieee80211_rate *rate; | ||
879 | |||
880 | /* Do not use multiple retry rates when using RTS/CTS */ | ||
881 | control->alt_retry_rate = -1; | ||
882 | |||
883 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | ||
884 | rate = tx->u.tx.rate; | ||
885 | while (rate > mode->rates && | ||
886 | !(rate->flags & IEEE80211_RATE_BASIC)) | ||
887 | rate--; | ||
888 | |||
889 | control->rts_cts_rate = rate->val; | ||
890 | control->rts_rate = rate; | ||
891 | } | ||
892 | |||
893 | if (tx->sta) { | ||
894 | tx->sta->tx_packets++; | ||
895 | tx->sta->tx_fragments++; | ||
896 | tx->sta->tx_bytes += tx->skb->len; | ||
897 | if (tx->u.tx.extra_frag) { | ||
898 | int i; | ||
899 | tx->sta->tx_fragments += tx->u.tx.num_extra_frag; | ||
900 | for (i = 0; i < tx->u.tx.num_extra_frag; i++) { | ||
901 | tx->sta->tx_bytes += | ||
902 | tx->u.tx.extra_frag[i]->len; | ||
903 | } | ||
904 | } | ||
905 | } | ||
906 | |||
907 | return TXRX_CONTINUE; | ||
908 | } | ||
909 | |||
910 | |||
911 | static ieee80211_txrx_result | ||
912 | ieee80211_tx_h_check_assoc(struct ieee80211_txrx_data *tx) | ||
913 | { | ||
914 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
915 | struct sk_buff *skb = tx->skb; | ||
916 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
917 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
918 | u32 sta_flags; | ||
919 | |||
920 | if (unlikely(tx->local->sta_scanning != 0) && | ||
921 | ((tx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT || | ||
922 | (tx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PROBE_REQ)) | ||
923 | return TXRX_DROP; | ||
924 | |||
925 | if (tx->u.tx.ps_buffered) | ||
926 | return TXRX_CONTINUE; | ||
927 | |||
928 | sta_flags = tx->sta ? tx->sta->flags : 0; | ||
929 | |||
930 | if (likely(tx->u.tx.unicast)) { | ||
931 | if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && | ||
932 | tx->sdata->type != IEEE80211_IF_TYPE_IBSS && | ||
933 | (tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { | ||
934 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
935 | printk(KERN_DEBUG "%s: dropped data frame to not " | ||
936 | "associated station " MAC_FMT "\n", | ||
937 | tx->dev->name, MAC_ARG(hdr->addr1)); | ||
938 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
939 | I802_DEBUG_INC(tx->local->tx_handlers_drop_not_assoc); | ||
940 | return TXRX_DROP; | ||
941 | } | ||
942 | } else { | ||
943 | if (unlikely((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && | ||
944 | tx->local->num_sta == 0 && | ||
945 | !tx->local->allow_broadcast_always && | ||
946 | tx->sdata->type != IEEE80211_IF_TYPE_IBSS)) { | ||
947 | /* | ||
948 | * No associated STAs - no need to send multicast | ||
949 | * frames. | ||
950 | */ | ||
951 | return TXRX_DROP; | ||
952 | } | ||
953 | return TXRX_CONTINUE; | ||
954 | } | ||
955 | |||
956 | if (unlikely(!tx->u.tx.mgmt_interface && tx->sdata->ieee802_1x && | ||
957 | !(sta_flags & WLAN_STA_AUTHORIZED))) { | ||
958 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
959 | printk(KERN_DEBUG "%s: dropped frame to " MAC_FMT | ||
960 | " (unauthorized port)\n", tx->dev->name, | ||
961 | MAC_ARG(hdr->addr1)); | ||
962 | #endif | ||
963 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unauth_port); | ||
964 | return TXRX_DROP; | ||
965 | } | ||
966 | |||
967 | return TXRX_CONTINUE; | ||
968 | } | ||
969 | |||
970 | static ieee80211_txrx_result | ||
971 | ieee80211_tx_h_sequence(struct ieee80211_txrx_data *tx) | ||
972 | { | ||
973 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | ||
974 | |||
975 | if (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control)) >= 24) | ||
976 | ieee80211_include_sequence(tx->sdata, hdr); | ||
977 | |||
978 | return TXRX_CONTINUE; | ||
979 | } | ||
980 | |||
981 | /* This function is called whenever the AP is about to exceed the maximum limit | ||
982 | * of buffered frames for power saving STAs. This situation should not really | ||
983 | * happen often during normal operation, so dropping the oldest buffered packet | ||
984 | * from each queue should be OK to make some room for new frames. */ | ||
985 | static void purge_old_ps_buffers(struct ieee80211_local *local) | ||
986 | { | ||
987 | int total = 0, purged = 0; | ||
988 | struct sk_buff *skb; | ||
989 | struct ieee80211_sub_if_data *sdata; | ||
990 | struct sta_info *sta; | ||
991 | |||
992 | read_lock(&local->sub_if_lock); | ||
993 | list_for_each_entry(sdata, &local->sub_if_list, list) { | ||
994 | struct ieee80211_if_ap *ap; | ||
995 | if (sdata->dev == local->mdev || | ||
996 | sdata->type != IEEE80211_IF_TYPE_AP) | ||
997 | continue; | ||
998 | ap = &sdata->u.ap; | ||
999 | skb = skb_dequeue(&ap->ps_bc_buf); | ||
1000 | if (skb) { | ||
1001 | purged++; | ||
1002 | dev_kfree_skb(skb); | ||
1003 | } | ||
1004 | total += skb_queue_len(&ap->ps_bc_buf); | ||
1005 | } | ||
1006 | read_unlock(&local->sub_if_lock); | ||
1007 | |||
1008 | spin_lock_bh(&local->sta_lock); | ||
1009 | list_for_each_entry(sta, &local->sta_list, list) { | ||
1010 | skb = skb_dequeue(&sta->ps_tx_buf); | ||
1011 | if (skb) { | ||
1012 | purged++; | ||
1013 | dev_kfree_skb(skb); | ||
1014 | } | ||
1015 | total += skb_queue_len(&sta->ps_tx_buf); | ||
1016 | } | ||
1017 | spin_unlock_bh(&local->sta_lock); | ||
1018 | |||
1019 | local->total_ps_buffered = total; | ||
1020 | printk(KERN_DEBUG "%s: PS buffers full - purged %d frames\n", | ||
1021 | local->mdev->name, purged); | ||
1022 | } | ||
1023 | |||
1024 | |||
1025 | static inline ieee80211_txrx_result | ||
1026 | ieee80211_tx_h_multicast_ps_buf(struct ieee80211_txrx_data *tx) | ||
1027 | { | ||
1028 | /* broadcast/multicast frame */ | ||
1029 | /* If any of the associated stations is in power save mode, | ||
1030 | * the frame is buffered to be sent after DTIM beacon frame */ | ||
1031 | if ((tx->local->hw.flags & IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING) && | ||
1032 | tx->sdata->type != IEEE80211_IF_TYPE_WDS && | ||
1033 | tx->sdata->bss && atomic_read(&tx->sdata->bss->num_sta_ps) && | ||
1034 | !(tx->fc & IEEE80211_FCTL_ORDER)) { | ||
1035 | if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) | ||
1036 | purge_old_ps_buffers(tx->local); | ||
1037 | if (skb_queue_len(&tx->sdata->bss->ps_bc_buf) >= | ||
1038 | AP_MAX_BC_BUFFER) { | ||
1039 | if (net_ratelimit()) { | ||
1040 | printk(KERN_DEBUG "%s: BC TX buffer full - " | ||
1041 | "dropping the oldest frame\n", | ||
1042 | tx->dev->name); | ||
1043 | } | ||
1044 | dev_kfree_skb(skb_dequeue(&tx->sdata->bss->ps_bc_buf)); | ||
1045 | } else | ||
1046 | tx->local->total_ps_buffered++; | ||
1047 | skb_queue_tail(&tx->sdata->bss->ps_bc_buf, tx->skb); | ||
1048 | return TXRX_QUEUED; | ||
1049 | } | ||
1050 | |||
1051 | return TXRX_CONTINUE; | ||
1052 | } | ||
1053 | |||
1054 | |||
1055 | static inline ieee80211_txrx_result | ||
1056 | ieee80211_tx_h_unicast_ps_buf(struct ieee80211_txrx_data *tx) | ||
1057 | { | ||
1058 | struct sta_info *sta = tx->sta; | ||
1059 | |||
1060 | if (unlikely(!sta || | ||
1061 | ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT && | ||
1062 | (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP))) | ||
1063 | return TXRX_CONTINUE; | ||
1064 | |||
1065 | if (unlikely((sta->flags & WLAN_STA_PS) && !sta->pspoll)) { | ||
1066 | struct ieee80211_tx_packet_data *pkt_data; | ||
1067 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | ||
1068 | printk(KERN_DEBUG "STA " MAC_FMT " aid %d: PS buffer (entries " | ||
1069 | "before %d)\n", | ||
1070 | MAC_ARG(sta->addr), sta->aid, | ||
1071 | skb_queue_len(&sta->ps_tx_buf)); | ||
1072 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | ||
1073 | sta->flags |= WLAN_STA_TIM; | ||
1074 | if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) | ||
1075 | purge_old_ps_buffers(tx->local); | ||
1076 | if (skb_queue_len(&sta->ps_tx_buf) >= STA_MAX_TX_BUFFER) { | ||
1077 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf); | ||
1078 | if (net_ratelimit()) { | ||
1079 | printk(KERN_DEBUG "%s: STA " MAC_FMT " TX " | ||
1080 | "buffer full - dropping oldest frame\n", | ||
1081 | tx->dev->name, MAC_ARG(sta->addr)); | ||
1082 | } | ||
1083 | dev_kfree_skb(old); | ||
1084 | } else | ||
1085 | tx->local->total_ps_buffered++; | ||
1086 | /* Queue frame to be sent after STA sends an PS Poll frame */ | ||
1087 | if (skb_queue_empty(&sta->ps_tx_buf)) { | ||
1088 | if (tx->local->ops->set_tim) | ||
1089 | tx->local->ops->set_tim(local_to_hw(tx->local), | ||
1090 | sta->aid, 1); | ||
1091 | if (tx->sdata->bss) | ||
1092 | bss_tim_set(tx->local, tx->sdata->bss, sta->aid); | ||
1093 | } | ||
1094 | pkt_data = (struct ieee80211_tx_packet_data *)tx->skb->cb; | ||
1095 | pkt_data->jiffies = jiffies; | ||
1096 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); | ||
1097 | return TXRX_QUEUED; | ||
1098 | } | ||
1099 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | ||
1100 | else if (unlikely(sta->flags & WLAN_STA_PS)) { | ||
1101 | printk(KERN_DEBUG "%s: STA " MAC_FMT " in PS mode, but pspoll " | ||
1102 | "set -> send frame\n", tx->dev->name, | ||
1103 | MAC_ARG(sta->addr)); | ||
1104 | } | ||
1105 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | ||
1106 | sta->pspoll = 0; | ||
1107 | |||
1108 | return TXRX_CONTINUE; | ||
1109 | } | ||
1110 | |||
1111 | |||
1112 | static ieee80211_txrx_result | ||
1113 | ieee80211_tx_h_ps_buf(struct ieee80211_txrx_data *tx) | ||
1114 | { | ||
1115 | if (unlikely(tx->u.tx.ps_buffered)) | ||
1116 | return TXRX_CONTINUE; | ||
1117 | |||
1118 | if (tx->u.tx.unicast) | ||
1119 | return ieee80211_tx_h_unicast_ps_buf(tx); | ||
1120 | else | ||
1121 | return ieee80211_tx_h_multicast_ps_buf(tx); | ||
1122 | } | ||
1123 | |||
1124 | |||
1125 | /* | ||
1126 | * deal with packet injection down monitor interface | ||
1127 | * with Radiotap Header -- only called for monitor mode interface | ||
1128 | */ | ||
1129 | |||
1130 | static ieee80211_txrx_result | ||
1131 | __ieee80211_parse_tx_radiotap( | ||
1132 | struct ieee80211_txrx_data *tx, | ||
1133 | struct sk_buff *skb, struct ieee80211_tx_control *control) | ||
1134 | { | ||
1135 | /* | ||
1136 | * this is the moment to interpret and discard the radiotap header that | ||
1137 | * must be at the start of the packet injected in Monitor mode | ||
1138 | * | ||
1139 | * Need to take some care with endian-ness since radiotap | ||
1140 | * args are little-endian | ||
1141 | */ | ||
1142 | |||
1143 | struct ieee80211_radiotap_iterator iterator; | ||
1144 | struct ieee80211_radiotap_header *rthdr = | ||
1145 | (struct ieee80211_radiotap_header *) skb->data; | ||
1146 | struct ieee80211_hw_mode *mode = tx->local->hw.conf.mode; | ||
1147 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); | ||
1148 | |||
1149 | /* | ||
1150 | * default control situation for all injected packets | ||
1151 | * FIXME: this does not suit all usage cases, expand to allow control | ||
1152 | */ | ||
1153 | |||
1154 | control->retry_limit = 1; /* no retry */ | ||
1155 | control->key_idx = -1; /* no encryption key */ | ||
1156 | control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS | | ||
1157 | IEEE80211_TXCTL_USE_CTS_PROTECT); | ||
1158 | control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT | | ||
1159 | IEEE80211_TXCTL_NO_ACK; | ||
1160 | control->antenna_sel_tx = 0; /* default to default antenna */ | ||
1161 | |||
1162 | /* | ||
1163 | * for every radiotap entry that is present | ||
1164 | * (ieee80211_radiotap_iterator_next returns -ENOENT when no more | ||
1165 | * entries present, or -EINVAL on error) | ||
1166 | */ | ||
1167 | |||
1168 | while (!ret) { | ||
1169 | int i, target_rate; | ||
1170 | |||
1171 | ret = ieee80211_radiotap_iterator_next(&iterator); | ||
1172 | |||
1173 | if (ret) | ||
1174 | continue; | ||
1175 | |||
1176 | /* see if this argument is something we can use */ | ||
1177 | switch (iterator.this_arg_index) { | ||
1178 | /* | ||
1179 | * You must take care when dereferencing iterator.this_arg | ||
1180 | * for multibyte types... the pointer is not aligned. Use | ||
1181 | * get_unaligned((type *)iterator.this_arg) to dereference | ||
1182 | * iterator.this_arg for type "type" safely on all arches. | ||
1183 | */ | ||
1184 | case IEEE80211_RADIOTAP_RATE: | ||
1185 | /* | ||
1186 | * radiotap rate u8 is in 500kbps units eg, 0x02=1Mbps | ||
1187 | * ieee80211 rate int is in 100kbps units eg, 0x0a=1Mbps | ||
1188 | */ | ||
1189 | target_rate = (*iterator.this_arg) * 5; | ||
1190 | for (i = 0; i < mode->num_rates; i++) { | ||
1191 | struct ieee80211_rate *r = &mode->rates[i]; | ||
1192 | |||
1193 | if (r->rate > target_rate) | ||
1194 | continue; | ||
1195 | |||
1196 | control->rate = r; | ||
1197 | |||
1198 | if (r->flags & IEEE80211_RATE_PREAMBLE2) | ||
1199 | control->tx_rate = r->val2; | ||
1200 | else | ||
1201 | control->tx_rate = r->val; | ||
1202 | |||
1203 | /* end on exact match */ | ||
1204 | if (r->rate == target_rate) | ||
1205 | i = mode->num_rates; | ||
1206 | } | ||
1207 | break; | ||
1208 | |||
1209 | case IEEE80211_RADIOTAP_ANTENNA: | ||
1210 | /* | ||
1211 | * radiotap uses 0 for 1st ant, mac80211 is 1 for | ||
1212 | * 1st ant | ||
1213 | */ | ||
1214 | control->antenna_sel_tx = (*iterator.this_arg) + 1; | ||
1215 | break; | ||
1216 | |||
1217 | case IEEE80211_RADIOTAP_DBM_TX_POWER: | ||
1218 | control->power_level = *iterator.this_arg; | ||
1219 | break; | ||
1220 | |||
1221 | case IEEE80211_RADIOTAP_FLAGS: | ||
1222 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FCS) { | ||
1223 | /* | ||
1224 | * this indicates that the skb we have been | ||
1225 | * handed has the 32-bit FCS CRC at the end... | ||
1226 | * we should react to that by snipping it off | ||
1227 | * because it will be recomputed and added | ||
1228 | * on transmission | ||
1229 | */ | ||
1230 | if (skb->len < (iterator.max_length + FCS_LEN)) | ||
1231 | return TXRX_DROP; | ||
1232 | |||
1233 | skb_trim(skb, skb->len - FCS_LEN); | ||
1234 | } | ||
1235 | break; | ||
1236 | |||
1237 | default: | ||
1238 | break; | ||
1239 | } | ||
1240 | } | ||
1241 | |||
1242 | if (ret != -ENOENT) /* ie, if we didn't simply run out of fields */ | ||
1243 | return TXRX_DROP; | ||
1244 | |||
1245 | /* | ||
1246 | * remove the radiotap header | ||
1247 | * iterator->max_length was sanity-checked against | ||
1248 | * skb->len by iterator init | ||
1249 | */ | ||
1250 | skb_pull(skb, iterator.max_length); | ||
1251 | |||
1252 | return TXRX_CONTINUE; | ||
1253 | } | ||
1254 | |||
1255 | |||
1256 | static ieee80211_txrx_result inline | ||
1257 | __ieee80211_tx_prepare(struct ieee80211_txrx_data *tx, | ||
1258 | struct sk_buff *skb, | ||
1259 | struct net_device *dev, | ||
1260 | struct ieee80211_tx_control *control) | ||
1261 | { | ||
1262 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1263 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
1264 | struct ieee80211_sub_if_data *sdata; | ||
1265 | ieee80211_txrx_result res = TXRX_CONTINUE; | ||
1266 | |||
1267 | int hdrlen; | ||
1268 | |||
1269 | memset(tx, 0, sizeof(*tx)); | ||
1270 | tx->skb = skb; | ||
1271 | tx->dev = dev; /* use original interface */ | ||
1272 | tx->local = local; | ||
1273 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
1274 | tx->sta = sta_info_get(local, hdr->addr1); | ||
1275 | tx->fc = le16_to_cpu(hdr->frame_control); | ||
1276 | |||
1277 | /* | ||
1278 | * set defaults for things that can be set by | ||
1279 | * injected radiotap headers | ||
1280 | */ | ||
1281 | control->power_level = local->hw.conf.power_level; | ||
1282 | control->antenna_sel_tx = local->hw.conf.antenna_sel_tx; | ||
1283 | if (local->sta_antenna_sel != STA_ANTENNA_SEL_AUTO && tx->sta) | ||
1284 | control->antenna_sel_tx = tx->sta->antenna_sel_tx; | ||
1285 | |||
1286 | /* process and remove the injection radiotap header */ | ||
1287 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
1288 | if (unlikely(sdata->type == IEEE80211_IF_TYPE_MNTR)) { | ||
1289 | if (__ieee80211_parse_tx_radiotap(tx, skb, control) == | ||
1290 | TXRX_DROP) { | ||
1291 | return TXRX_DROP; | ||
1292 | } | ||
1293 | /* | ||
1294 | * we removed the radiotap header after this point, | ||
1295 | * we filled control with what we could use | ||
1296 | * set to the actual ieee header now | ||
1297 | */ | ||
1298 | hdr = (struct ieee80211_hdr *) skb->data; | ||
1299 | res = TXRX_QUEUED; /* indication it was monitor packet */ | ||
1300 | } | ||
1301 | |||
1302 | tx->u.tx.control = control; | ||
1303 | tx->u.tx.unicast = !is_multicast_ether_addr(hdr->addr1); | ||
1304 | if (is_multicast_ether_addr(hdr->addr1)) | ||
1305 | control->flags |= IEEE80211_TXCTL_NO_ACK; | ||
1306 | else | ||
1307 | control->flags &= ~IEEE80211_TXCTL_NO_ACK; | ||
1308 | tx->fragmented = local->fragmentation_threshold < | ||
1309 | IEEE80211_MAX_FRAG_THRESHOLD && tx->u.tx.unicast && | ||
1310 | skb->len + FCS_LEN > local->fragmentation_threshold && | ||
1311 | (!local->ops->set_frag_threshold); | ||
1312 | if (!tx->sta) | ||
1313 | control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK; | ||
1314 | else if (tx->sta->clear_dst_mask) { | ||
1315 | control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK; | ||
1316 | tx->sta->clear_dst_mask = 0; | ||
1317 | } | ||
1318 | hdrlen = ieee80211_get_hdrlen(tx->fc); | ||
1319 | if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) { | ||
1320 | u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)]; | ||
1321 | tx->ethertype = (pos[0] << 8) | pos[1]; | ||
1322 | } | ||
1323 | control->flags |= IEEE80211_TXCTL_FIRST_FRAGMENT; | ||
1324 | |||
1325 | return res; | ||
1326 | } | ||
1327 | |||
1328 | static int inline is_ieee80211_device(struct net_device *dev, | ||
1329 | struct net_device *master) | ||
1330 | { | ||
1331 | return (wdev_priv(dev->ieee80211_ptr) == | ||
1332 | wdev_priv(master->ieee80211_ptr)); | ||
1333 | } | ||
1334 | |||
1335 | /* Device in tx->dev has a reference added; use dev_put(tx->dev) when | ||
1336 | * finished with it. */ | ||
1337 | static int inline ieee80211_tx_prepare(struct ieee80211_txrx_data *tx, | ||
1338 | struct sk_buff *skb, | ||
1339 | struct net_device *mdev, | ||
1340 | struct ieee80211_tx_control *control) | ||
1341 | { | ||
1342 | struct ieee80211_tx_packet_data *pkt_data; | ||
1343 | struct net_device *dev; | ||
1344 | |||
1345 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1346 | dev = dev_get_by_index(pkt_data->ifindex); | ||
1347 | if (unlikely(dev && !is_ieee80211_device(dev, mdev))) { | ||
1348 | dev_put(dev); | ||
1349 | dev = NULL; | ||
1350 | } | ||
1351 | if (unlikely(!dev)) | ||
1352 | return -ENODEV; | ||
1353 | __ieee80211_tx_prepare(tx, skb, dev, control); | ||
1354 | return 0; | ||
1355 | } | ||
1356 | |||
1357 | static inline int __ieee80211_queue_stopped(const struct ieee80211_local *local, | ||
1358 | int queue) | ||
1359 | { | ||
1360 | return test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]); | ||
1361 | } | ||
1362 | |||
1363 | static inline int __ieee80211_queue_pending(const struct ieee80211_local *local, | ||
1364 | int queue) | ||
1365 | { | ||
1366 | return test_bit(IEEE80211_LINK_STATE_PENDING, &local->state[queue]); | ||
1367 | } | ||
1368 | |||
1369 | #define IEEE80211_TX_OK 0 | ||
1370 | #define IEEE80211_TX_AGAIN 1 | ||
1371 | #define IEEE80211_TX_FRAG_AGAIN 2 | ||
1372 | |||
1373 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | ||
1374 | struct ieee80211_txrx_data *tx) | ||
1375 | { | ||
1376 | struct ieee80211_tx_control *control = tx->u.tx.control; | ||
1377 | int ret, i; | ||
1378 | |||
1379 | if (!ieee80211_qdisc_installed(local->mdev) && | ||
1380 | __ieee80211_queue_stopped(local, 0)) { | ||
1381 | netif_stop_queue(local->mdev); | ||
1382 | return IEEE80211_TX_AGAIN; | ||
1383 | } | ||
1384 | if (skb) { | ||
1385 | ieee80211_dump_frame(local->mdev->name, "TX to low-level driver", skb); | ||
1386 | ret = local->ops->tx(local_to_hw(local), skb, control); | ||
1387 | if (ret) | ||
1388 | return IEEE80211_TX_AGAIN; | ||
1389 | local->mdev->trans_start = jiffies; | ||
1390 | ieee80211_led_tx(local, 1); | ||
1391 | } | ||
1392 | if (tx->u.tx.extra_frag) { | ||
1393 | control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS | | ||
1394 | IEEE80211_TXCTL_USE_CTS_PROTECT | | ||
1395 | IEEE80211_TXCTL_CLEAR_DST_MASK | | ||
1396 | IEEE80211_TXCTL_FIRST_FRAGMENT); | ||
1397 | for (i = 0; i < tx->u.tx.num_extra_frag; i++) { | ||
1398 | if (!tx->u.tx.extra_frag[i]) | ||
1399 | continue; | ||
1400 | if (__ieee80211_queue_stopped(local, control->queue)) | ||
1401 | return IEEE80211_TX_FRAG_AGAIN; | ||
1402 | if (i == tx->u.tx.num_extra_frag) { | ||
1403 | control->tx_rate = tx->u.tx.last_frag_hwrate; | ||
1404 | control->rate = tx->u.tx.last_frag_rate; | ||
1405 | if (tx->u.tx.probe_last_frag) | ||
1406 | control->flags |= | ||
1407 | IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
1408 | else | ||
1409 | control->flags &= | ||
1410 | ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
1411 | } | ||
1412 | |||
1413 | ieee80211_dump_frame(local->mdev->name, | ||
1414 | "TX to low-level driver", | ||
1415 | tx->u.tx.extra_frag[i]); | ||
1416 | ret = local->ops->tx(local_to_hw(local), | ||
1417 | tx->u.tx.extra_frag[i], | ||
1418 | control); | ||
1419 | if (ret) | ||
1420 | return IEEE80211_TX_FRAG_AGAIN; | ||
1421 | local->mdev->trans_start = jiffies; | ||
1422 | ieee80211_led_tx(local, 1); | ||
1423 | tx->u.tx.extra_frag[i] = NULL; | ||
1424 | } | ||
1425 | kfree(tx->u.tx.extra_frag); | ||
1426 | tx->u.tx.extra_frag = NULL; | ||
1427 | } | ||
1428 | return IEEE80211_TX_OK; | ||
1429 | } | ||
1430 | |||
1431 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | ||
1432 | struct ieee80211_tx_control *control, int mgmt) | ||
1433 | { | ||
1434 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1435 | struct sta_info *sta; | ||
1436 | ieee80211_tx_handler *handler; | ||
1437 | struct ieee80211_txrx_data tx; | ||
1438 | ieee80211_txrx_result res = TXRX_DROP, res_prepare; | ||
1439 | int ret, i; | ||
1440 | |||
1441 | WARN_ON(__ieee80211_queue_pending(local, control->queue)); | ||
1442 | |||
1443 | if (unlikely(skb->len < 10)) { | ||
1444 | dev_kfree_skb(skb); | ||
1445 | return 0; | ||
1446 | } | ||
1447 | |||
1448 | res_prepare = __ieee80211_tx_prepare(&tx, skb, dev, control); | ||
1449 | |||
1450 | if (res_prepare == TXRX_DROP) { | ||
1451 | dev_kfree_skb(skb); | ||
1452 | return 0; | ||
1453 | } | ||
1454 | |||
1455 | sta = tx.sta; | ||
1456 | tx.u.tx.mgmt_interface = mgmt; | ||
1457 | tx.u.tx.mode = local->hw.conf.mode; | ||
1458 | |||
1459 | if (res_prepare == TXRX_QUEUED) { /* if it was an injected packet */ | ||
1460 | res = TXRX_CONTINUE; | ||
1461 | } else { | ||
1462 | for (handler = local->tx_handlers; *handler != NULL; | ||
1463 | handler++) { | ||
1464 | res = (*handler)(&tx); | ||
1465 | if (res != TXRX_CONTINUE) | ||
1466 | break; | ||
1467 | } | ||
1468 | } | ||
1469 | |||
1470 | skb = tx.skb; /* handlers are allowed to change skb */ | ||
1471 | |||
1472 | if (sta) | ||
1473 | sta_info_put(sta); | ||
1474 | |||
1475 | if (unlikely(res == TXRX_DROP)) { | ||
1476 | I802_DEBUG_INC(local->tx_handlers_drop); | ||
1477 | goto drop; | ||
1478 | } | ||
1479 | |||
1480 | if (unlikely(res == TXRX_QUEUED)) { | ||
1481 | I802_DEBUG_INC(local->tx_handlers_queued); | ||
1482 | return 0; | ||
1483 | } | ||
1484 | |||
1485 | if (tx.u.tx.extra_frag) { | ||
1486 | for (i = 0; i < tx.u.tx.num_extra_frag; i++) { | ||
1487 | int next_len, dur; | ||
1488 | struct ieee80211_hdr *hdr = | ||
1489 | (struct ieee80211_hdr *) | ||
1490 | tx.u.tx.extra_frag[i]->data; | ||
1491 | |||
1492 | if (i + 1 < tx.u.tx.num_extra_frag) { | ||
1493 | next_len = tx.u.tx.extra_frag[i + 1]->len; | ||
1494 | } else { | ||
1495 | next_len = 0; | ||
1496 | tx.u.tx.rate = tx.u.tx.last_frag_rate; | ||
1497 | tx.u.tx.last_frag_hwrate = tx.u.tx.rate->val; | ||
1498 | } | ||
1499 | dur = ieee80211_duration(&tx, 0, next_len); | ||
1500 | hdr->duration_id = cpu_to_le16(dur); | ||
1501 | } | ||
1502 | } | ||
1503 | |||
1504 | retry: | ||
1505 | ret = __ieee80211_tx(local, skb, &tx); | ||
1506 | if (ret) { | ||
1507 | struct ieee80211_tx_stored_packet *store = | ||
1508 | &local->pending_packet[control->queue]; | ||
1509 | |||
1510 | if (ret == IEEE80211_TX_FRAG_AGAIN) | ||
1511 | skb = NULL; | ||
1512 | set_bit(IEEE80211_LINK_STATE_PENDING, | ||
1513 | &local->state[control->queue]); | ||
1514 | smp_mb(); | ||
1515 | /* When the driver gets out of buffers during sending of | ||
1516 | * fragments and calls ieee80211_stop_queue, there is | ||
1517 | * a small window between IEEE80211_LINK_STATE_XOFF and | ||
1518 | * IEEE80211_LINK_STATE_PENDING flags are set. If a buffer | ||
1519 | * gets available in that window (i.e. driver calls | ||
1520 | * ieee80211_wake_queue), we would end up with ieee80211_tx | ||
1521 | * called with IEEE80211_LINK_STATE_PENDING. Prevent this by | ||
1522 | * continuing transmitting here when that situation is | ||
1523 | * possible to have happened. */ | ||
1524 | if (!__ieee80211_queue_stopped(local, control->queue)) { | ||
1525 | clear_bit(IEEE80211_LINK_STATE_PENDING, | ||
1526 | &local->state[control->queue]); | ||
1527 | goto retry; | ||
1528 | } | ||
1529 | memcpy(&store->control, control, | ||
1530 | sizeof(struct ieee80211_tx_control)); | ||
1531 | store->skb = skb; | ||
1532 | store->extra_frag = tx.u.tx.extra_frag; | ||
1533 | store->num_extra_frag = tx.u.tx.num_extra_frag; | ||
1534 | store->last_frag_hwrate = tx.u.tx.last_frag_hwrate; | ||
1535 | store->last_frag_rate = tx.u.tx.last_frag_rate; | ||
1536 | store->last_frag_rate_ctrl_probe = tx.u.tx.probe_last_frag; | ||
1537 | } | ||
1538 | return 0; | ||
1539 | |||
1540 | drop: | ||
1541 | if (skb) | ||
1542 | dev_kfree_skb(skb); | ||
1543 | for (i = 0; i < tx.u.tx.num_extra_frag; i++) | ||
1544 | if (tx.u.tx.extra_frag[i]) | ||
1545 | dev_kfree_skb(tx.u.tx.extra_frag[i]); | ||
1546 | kfree(tx.u.tx.extra_frag); | ||
1547 | return 0; | ||
1548 | } | ||
1549 | |||
1550 | static void ieee80211_tx_pending(unsigned long data) | ||
1551 | { | ||
1552 | struct ieee80211_local *local = (struct ieee80211_local *)data; | ||
1553 | struct net_device *dev = local->mdev; | ||
1554 | struct ieee80211_tx_stored_packet *store; | ||
1555 | struct ieee80211_txrx_data tx; | ||
1556 | int i, ret, reschedule = 0; | ||
1557 | |||
1558 | netif_tx_lock_bh(dev); | ||
1559 | for (i = 0; i < local->hw.queues; i++) { | ||
1560 | if (__ieee80211_queue_stopped(local, i)) | ||
1561 | continue; | ||
1562 | if (!__ieee80211_queue_pending(local, i)) { | ||
1563 | reschedule = 1; | ||
1564 | continue; | ||
1565 | } | ||
1566 | store = &local->pending_packet[i]; | ||
1567 | tx.u.tx.control = &store->control; | ||
1568 | tx.u.tx.extra_frag = store->extra_frag; | ||
1569 | tx.u.tx.num_extra_frag = store->num_extra_frag; | ||
1570 | tx.u.tx.last_frag_hwrate = store->last_frag_hwrate; | ||
1571 | tx.u.tx.last_frag_rate = store->last_frag_rate; | ||
1572 | tx.u.tx.probe_last_frag = store->last_frag_rate_ctrl_probe; | ||
1573 | ret = __ieee80211_tx(local, store->skb, &tx); | ||
1574 | if (ret) { | ||
1575 | if (ret == IEEE80211_TX_FRAG_AGAIN) | ||
1576 | store->skb = NULL; | ||
1577 | } else { | ||
1578 | clear_bit(IEEE80211_LINK_STATE_PENDING, | ||
1579 | &local->state[i]); | ||
1580 | reschedule = 1; | ||
1581 | } | ||
1582 | } | ||
1583 | netif_tx_unlock_bh(dev); | ||
1584 | if (reschedule) { | ||
1585 | if (!ieee80211_qdisc_installed(dev)) { | ||
1586 | if (!__ieee80211_queue_stopped(local, 0)) | ||
1587 | netif_wake_queue(dev); | ||
1588 | } else | ||
1589 | netif_schedule(dev); | ||
1590 | } | ||
1591 | } | ||
1592 | |||
1593 | static void ieee80211_clear_tx_pending(struct ieee80211_local *local) | ||
1594 | { | ||
1595 | int i, j; | ||
1596 | struct ieee80211_tx_stored_packet *store; | ||
1597 | |||
1598 | for (i = 0; i < local->hw.queues; i++) { | ||
1599 | if (!__ieee80211_queue_pending(local, i)) | ||
1600 | continue; | ||
1601 | store = &local->pending_packet[i]; | ||
1602 | kfree_skb(store->skb); | ||
1603 | for (j = 0; j < store->num_extra_frag; j++) | ||
1604 | kfree_skb(store->extra_frag[j]); | ||
1605 | kfree(store->extra_frag); | ||
1606 | clear_bit(IEEE80211_LINK_STATE_PENDING, &local->state[i]); | ||
1607 | } | ||
1608 | } | ||
1609 | |||
1610 | static int ieee80211_master_start_xmit(struct sk_buff *skb, | ||
1611 | struct net_device *dev) | ||
1612 | { | ||
1613 | struct ieee80211_tx_control control; | ||
1614 | struct ieee80211_tx_packet_data *pkt_data; | ||
1615 | struct net_device *odev = NULL; | ||
1616 | struct ieee80211_sub_if_data *osdata; | ||
1617 | int headroom; | ||
1618 | int ret; | ||
1619 | |||
1620 | /* | ||
1621 | * copy control out of the skb so other people can use skb->cb | ||
1622 | */ | ||
1623 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1624 | memset(&control, 0, sizeof(struct ieee80211_tx_control)); | ||
1625 | |||
1626 | if (pkt_data->ifindex) | ||
1627 | odev = dev_get_by_index(pkt_data->ifindex); | ||
1628 | if (unlikely(odev && !is_ieee80211_device(odev, dev))) { | ||
1629 | dev_put(odev); | ||
1630 | odev = NULL; | ||
1631 | } | ||
1632 | if (unlikely(!odev)) { | ||
1633 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
1634 | printk(KERN_DEBUG "%s: Discarded packet with nonexistent " | ||
1635 | "originating device\n", dev->name); | ||
1636 | #endif | ||
1637 | dev_kfree_skb(skb); | ||
1638 | return 0; | ||
1639 | } | ||
1640 | osdata = IEEE80211_DEV_TO_SUB_IF(odev); | ||
1641 | |||
1642 | headroom = osdata->local->tx_headroom + IEEE80211_ENCRYPT_HEADROOM; | ||
1643 | if (skb_headroom(skb) < headroom) { | ||
1644 | if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) { | ||
1645 | dev_kfree_skb(skb); | ||
1646 | dev_put(odev); | ||
1647 | return 0; | ||
1648 | } | ||
1649 | } | ||
1650 | |||
1651 | control.ifindex = odev->ifindex; | ||
1652 | control.type = osdata->type; | ||
1653 | if (pkt_data->req_tx_status) | ||
1654 | control.flags |= IEEE80211_TXCTL_REQ_TX_STATUS; | ||
1655 | if (pkt_data->do_not_encrypt) | ||
1656 | control.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | ||
1657 | if (pkt_data->requeue) | ||
1658 | control.flags |= IEEE80211_TXCTL_REQUEUE; | ||
1659 | control.queue = pkt_data->queue; | ||
1660 | |||
1661 | ret = ieee80211_tx(odev, skb, &control, | ||
1662 | control.type == IEEE80211_IF_TYPE_MGMT); | ||
1663 | dev_put(odev); | ||
1664 | |||
1665 | return ret; | ||
1666 | } | ||
1667 | |||
1668 | |||
1669 | int ieee80211_monitor_start_xmit(struct sk_buff *skb, | ||
1670 | struct net_device *dev) | ||
1671 | { | ||
1672 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1673 | struct ieee80211_tx_packet_data *pkt_data; | ||
1674 | struct ieee80211_radiotap_header *prthdr = | ||
1675 | (struct ieee80211_radiotap_header *)skb->data; | ||
1676 | u16 len; | ||
1677 | |||
1678 | /* | ||
1679 | * there must be a radiotap header at the | ||
1680 | * start in this case | ||
1681 | */ | ||
1682 | if (unlikely(prthdr->it_version)) { | ||
1683 | /* only version 0 is supported */ | ||
1684 | dev_kfree_skb(skb); | ||
1685 | return NETDEV_TX_OK; | ||
1686 | } | ||
1687 | |||
1688 | skb->dev = local->mdev; | ||
1689 | |||
1690 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1691 | memset(pkt_data, 0, sizeof(*pkt_data)); | ||
1692 | pkt_data->ifindex = dev->ifindex; | ||
1693 | pkt_data->mgmt_iface = 0; | ||
1694 | pkt_data->do_not_encrypt = 1; | ||
1695 | |||
1696 | /* above needed because we set skb device to master */ | ||
1697 | |||
1698 | /* | ||
1699 | * fix up the pointers accounting for the radiotap | ||
1700 | * header still being in there. We are being given | ||
1701 | * a precooked IEEE80211 header so no need for | ||
1702 | * normal processing | ||
1703 | */ | ||
1704 | len = le16_to_cpu(get_unaligned(&prthdr->it_len)); | ||
1705 | skb_set_mac_header(skb, len); | ||
1706 | skb_set_network_header(skb, len + sizeof(struct ieee80211_hdr)); | ||
1707 | skb_set_transport_header(skb, len + sizeof(struct ieee80211_hdr)); | ||
1708 | |||
1709 | /* | ||
1710 | * pass the radiotap header up to | ||
1711 | * the next stage intact | ||
1712 | */ | ||
1713 | dev_queue_xmit(skb); | ||
1714 | |||
1715 | return NETDEV_TX_OK; | ||
1716 | } | ||
1717 | |||
1718 | |||
1719 | /** | ||
1720 | * ieee80211_subif_start_xmit - netif start_xmit function for Ethernet-type | ||
1721 | * subinterfaces (wlan#, WDS, and VLAN interfaces) | ||
1722 | * @skb: packet to be sent | ||
1723 | * @dev: incoming interface | ||
1724 | * | ||
1725 | * Returns: 0 on success (and frees skb in this case) or 1 on failure (skb will | ||
1726 | * not be freed, and caller is responsible for either retrying later or freeing | ||
1727 | * skb). | ||
1728 | * | ||
1729 | * This function takes in an Ethernet header and encapsulates it with suitable | ||
1730 | * IEEE 802.11 header based on which interface the packet is coming in. The | ||
1731 | * encapsulated packet will then be passed to master interface, wlan#.11, for | ||
1732 | * transmission (through low-level driver). | ||
1733 | */ | ||
1734 | int ieee80211_subif_start_xmit(struct sk_buff *skb, | ||
1735 | struct net_device *dev) | ||
1736 | { | ||
1737 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
1738 | struct ieee80211_tx_packet_data *pkt_data; | ||
1739 | struct ieee80211_sub_if_data *sdata; | ||
1740 | int ret = 1, head_need; | ||
1741 | u16 ethertype, hdrlen, fc; | ||
1742 | struct ieee80211_hdr hdr; | ||
1743 | const u8 *encaps_data; | ||
1744 | int encaps_len, skip_header_bytes; | ||
1745 | int nh_pos, h_pos, no_encrypt = 0; | ||
1746 | struct sta_info *sta; | ||
1747 | |||
1748 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
1749 | if (unlikely(skb->len < ETH_HLEN)) { | ||
1750 | printk(KERN_DEBUG "%s: short skb (len=%d)\n", | ||
1751 | dev->name, skb->len); | ||
1752 | ret = 0; | ||
1753 | goto fail; | ||
1754 | } | ||
1755 | |||
1756 | nh_pos = skb_network_header(skb) - skb->data; | ||
1757 | h_pos = skb_transport_header(skb) - skb->data; | ||
1758 | |||
1759 | /* convert Ethernet header to proper 802.11 header (based on | ||
1760 | * operation mode) */ | ||
1761 | ethertype = (skb->data[12] << 8) | skb->data[13]; | ||
1762 | /* TODO: handling for 802.1x authorized/unauthorized port */ | ||
1763 | fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA; | ||
1764 | |||
1765 | if (likely(sdata->type == IEEE80211_IF_TYPE_AP || | ||
1766 | sdata->type == IEEE80211_IF_TYPE_VLAN)) { | ||
1767 | fc |= IEEE80211_FCTL_FROMDS; | ||
1768 | /* DA BSSID SA */ | ||
1769 | memcpy(hdr.addr1, skb->data, ETH_ALEN); | ||
1770 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); | ||
1771 | memcpy(hdr.addr3, skb->data + ETH_ALEN, ETH_ALEN); | ||
1772 | hdrlen = 24; | ||
1773 | } else if (sdata->type == IEEE80211_IF_TYPE_WDS) { | ||
1774 | fc |= IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS; | ||
1775 | /* RA TA DA SA */ | ||
1776 | memcpy(hdr.addr1, sdata->u.wds.remote_addr, ETH_ALEN); | ||
1777 | memcpy(hdr.addr2, dev->dev_addr, ETH_ALEN); | ||
1778 | memcpy(hdr.addr3, skb->data, ETH_ALEN); | ||
1779 | memcpy(hdr.addr4, skb->data + ETH_ALEN, ETH_ALEN); | ||
1780 | hdrlen = 30; | ||
1781 | } else if (sdata->type == IEEE80211_IF_TYPE_STA) { | ||
1782 | fc |= IEEE80211_FCTL_TODS; | ||
1783 | /* BSSID SA DA */ | ||
1784 | memcpy(hdr.addr1, sdata->u.sta.bssid, ETH_ALEN); | ||
1785 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); | ||
1786 | memcpy(hdr.addr3, skb->data, ETH_ALEN); | ||
1787 | hdrlen = 24; | ||
1788 | } else if (sdata->type == IEEE80211_IF_TYPE_IBSS) { | ||
1789 | /* DA SA BSSID */ | ||
1790 | memcpy(hdr.addr1, skb->data, ETH_ALEN); | ||
1791 | memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN); | ||
1792 | memcpy(hdr.addr3, sdata->u.sta.bssid, ETH_ALEN); | ||
1793 | hdrlen = 24; | ||
1794 | } else { | ||
1795 | ret = 0; | ||
1796 | goto fail; | ||
1797 | } | ||
1798 | |||
1799 | /* receiver is QoS enabled, use a QoS type frame */ | ||
1800 | sta = sta_info_get(local, hdr.addr1); | ||
1801 | if (sta) { | ||
1802 | if (sta->flags & WLAN_STA_WME) { | ||
1803 | fc |= IEEE80211_STYPE_QOS_DATA; | ||
1804 | hdrlen += 2; | ||
1805 | } | ||
1806 | sta_info_put(sta); | ||
1807 | } | ||
1808 | |||
1809 | hdr.frame_control = cpu_to_le16(fc); | ||
1810 | hdr.duration_id = 0; | ||
1811 | hdr.seq_ctrl = 0; | ||
1812 | |||
1813 | skip_header_bytes = ETH_HLEN; | ||
1814 | if (ethertype == ETH_P_AARP || ethertype == ETH_P_IPX) { | ||
1815 | encaps_data = bridge_tunnel_header; | ||
1816 | encaps_len = sizeof(bridge_tunnel_header); | ||
1817 | skip_header_bytes -= 2; | ||
1818 | } else if (ethertype >= 0x600) { | ||
1819 | encaps_data = rfc1042_header; | ||
1820 | encaps_len = sizeof(rfc1042_header); | ||
1821 | skip_header_bytes -= 2; | ||
1822 | } else { | ||
1823 | encaps_data = NULL; | ||
1824 | encaps_len = 0; | ||
1825 | } | ||
1826 | |||
1827 | skb_pull(skb, skip_header_bytes); | ||
1828 | nh_pos -= skip_header_bytes; | ||
1829 | h_pos -= skip_header_bytes; | ||
1830 | |||
1831 | /* TODO: implement support for fragments so that there is no need to | ||
1832 | * reallocate and copy payload; it might be enough to support one | ||
1833 | * extra fragment that would be copied in the beginning of the frame | ||
1834 | * data.. anyway, it would be nice to include this into skb structure | ||
1835 | * somehow | ||
1836 | * | ||
1837 | * There are few options for this: | ||
1838 | * use skb->cb as an extra space for 802.11 header | ||
1839 | * allocate new buffer if not enough headroom | ||
1840 | * make sure that there is enough headroom in every skb by increasing | ||
1841 | * build in headroom in __dev_alloc_skb() (linux/skbuff.h) and | ||
1842 | * alloc_skb() (net/core/skbuff.c) | ||
1843 | */ | ||
1844 | head_need = hdrlen + encaps_len + local->tx_headroom; | ||
1845 | head_need -= skb_headroom(skb); | ||
1846 | |||
1847 | /* We are going to modify skb data, so make a copy of it if happens to | ||
1848 | * be cloned. This could happen, e.g., with Linux bridge code passing | ||
1849 | * us broadcast frames. */ | ||
1850 | |||
1851 | if (head_need > 0 || skb_cloned(skb)) { | ||
1852 | #if 0 | ||
1853 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " | ||
1854 | "of headroom\n", dev->name, head_need); | ||
1855 | #endif | ||
1856 | |||
1857 | if (skb_cloned(skb)) | ||
1858 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | ||
1859 | else | ||
1860 | I802_DEBUG_INC(local->tx_expand_skb_head); | ||
1861 | /* Since we have to reallocate the buffer, make sure that there | ||
1862 | * is enough room for possible WEP IV/ICV and TKIP (8 bytes | ||
1863 | * before payload and 12 after). */ | ||
1864 | if (pskb_expand_head(skb, (head_need > 0 ? head_need + 8 : 8), | ||
1865 | 12, GFP_ATOMIC)) { | ||
1866 | printk(KERN_DEBUG "%s: failed to reallocate TX buffer" | ||
1867 | "\n", dev->name); | ||
1868 | goto fail; | ||
1869 | } | ||
1870 | } | ||
1871 | |||
1872 | if (encaps_data) { | ||
1873 | memcpy(skb_push(skb, encaps_len), encaps_data, encaps_len); | ||
1874 | nh_pos += encaps_len; | ||
1875 | h_pos += encaps_len; | ||
1876 | } | ||
1877 | memcpy(skb_push(skb, hdrlen), &hdr, hdrlen); | ||
1878 | nh_pos += hdrlen; | ||
1879 | h_pos += hdrlen; | ||
1880 | |||
1881 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1882 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | ||
1883 | pkt_data->ifindex = dev->ifindex; | ||
1884 | pkt_data->mgmt_iface = (sdata->type == IEEE80211_IF_TYPE_MGMT); | ||
1885 | pkt_data->do_not_encrypt = no_encrypt; | ||
1886 | |||
1887 | skb->dev = local->mdev; | ||
1888 | sdata->stats.tx_packets++; | ||
1889 | sdata->stats.tx_bytes += skb->len; | ||
1890 | |||
1891 | /* Update skb pointers to various headers since this modified frame | ||
1892 | * is going to go through Linux networking code that may potentially | ||
1893 | * need things like pointer to IP header. */ | ||
1894 | skb_set_mac_header(skb, 0); | ||
1895 | skb_set_network_header(skb, nh_pos); | ||
1896 | skb_set_transport_header(skb, h_pos); | ||
1897 | |||
1898 | dev->trans_start = jiffies; | ||
1899 | dev_queue_xmit(skb); | ||
1900 | |||
1901 | return 0; | ||
1902 | |||
1903 | fail: | ||
1904 | if (!ret) | ||
1905 | dev_kfree_skb(skb); | ||
1906 | |||
1907 | return ret; | ||
1908 | } | ||
1909 | |||
1910 | |||
1911 | /* | ||
1912 | * This is the transmit routine for the 802.11 type interfaces | ||
1913 | * called by upper layers of the linux networking | ||
1914 | * stack when it has a frame to transmit | ||
1915 | */ | ||
1916 | static int | ||
1917 | ieee80211_mgmt_start_xmit(struct sk_buff *skb, struct net_device *dev) | ||
1918 | { | ||
1919 | struct ieee80211_sub_if_data *sdata; | ||
1920 | struct ieee80211_tx_packet_data *pkt_data; | ||
1921 | struct ieee80211_hdr *hdr; | ||
1922 | u16 fc; | ||
1923 | |||
1924 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | ||
1925 | |||
1926 | if (skb->len < 10) { | ||
1927 | dev_kfree_skb(skb); | ||
1928 | return 0; | ||
1929 | } | ||
1930 | |||
1931 | if (skb_headroom(skb) < sdata->local->tx_headroom) { | ||
1932 | if (pskb_expand_head(skb, sdata->local->tx_headroom, | ||
1933 | 0, GFP_ATOMIC)) { | ||
1934 | dev_kfree_skb(skb); | ||
1935 | return 0; | ||
1936 | } | ||
1937 | } | ||
1938 | |||
1939 | hdr = (struct ieee80211_hdr *) skb->data; | ||
1940 | fc = le16_to_cpu(hdr->frame_control); | ||
1941 | |||
1942 | pkt_data = (struct ieee80211_tx_packet_data *) skb->cb; | ||
1943 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | ||
1944 | pkt_data->ifindex = sdata->dev->ifindex; | ||
1945 | pkt_data->mgmt_iface = (sdata->type == IEEE80211_IF_TYPE_MGMT); | ||
1946 | |||
1947 | skb->priority = 20; /* use hardcoded priority for mgmt TX queue */ | ||
1948 | skb->dev = sdata->local->mdev; | ||
1949 | |||
1950 | /* | ||
1951 | * We're using the protocol field of the the frame control header | ||
1952 | * to request TX callback for hostapd. BIT(1) is checked. | ||
1953 | */ | ||
1954 | if ((fc & BIT(1)) == BIT(1)) { | ||
1955 | pkt_data->req_tx_status = 1; | ||
1956 | fc &= ~BIT(1); | ||
1957 | hdr->frame_control = cpu_to_le16(fc); | ||
1958 | } | ||
1959 | |||
1960 | pkt_data->do_not_encrypt = !(fc & IEEE80211_FCTL_PROTECTED); | ||
1961 | |||
1962 | sdata->stats.tx_packets++; | ||
1963 | sdata->stats.tx_bytes += skb->len; | ||
1964 | |||
1965 | dev_queue_xmit(skb); | ||
1966 | |||
1967 | return 0; | ||
1968 | } | ||
1969 | |||
1970 | |||
1971 | static void ieee80211_beacon_add_tim(struct ieee80211_local *local, | ||
1972 | struct ieee80211_if_ap *bss, | ||
1973 | struct sk_buff *skb) | ||
1974 | { | ||
1975 | u8 *pos, *tim; | ||
1976 | int aid0 = 0; | ||
1977 | int i, have_bits = 0, n1, n2; | ||
1978 | |||
1979 | /* Generate bitmap for TIM only if there are any STAs in power save | ||
1980 | * mode. */ | ||
1981 | spin_lock_bh(&local->sta_lock); | ||
1982 | if (atomic_read(&bss->num_sta_ps) > 0) | ||
1983 | /* in the hope that this is faster than | ||
1984 | * checking byte-for-byte */ | ||
1985 | have_bits = !bitmap_empty((unsigned long*)bss->tim, | ||
1986 | IEEE80211_MAX_AID+1); | ||
1987 | |||
1988 | if (bss->dtim_count == 0) | ||
1989 | bss->dtim_count = bss->dtim_period - 1; | ||
1990 | else | ||
1991 | bss->dtim_count--; | ||
1992 | |||
1993 | tim = pos = (u8 *) skb_put(skb, 6); | ||
1994 | *pos++ = WLAN_EID_TIM; | ||
1995 | *pos++ = 4; | ||
1996 | *pos++ = bss->dtim_count; | ||
1997 | *pos++ = bss->dtim_period; | ||
1998 | |||
1999 | if (bss->dtim_count == 0 && !skb_queue_empty(&bss->ps_bc_buf)) | ||
2000 | aid0 = 1; | ||
2001 | |||
2002 | if (have_bits) { | ||
2003 | /* Find largest even number N1 so that bits numbered 1 through | ||
2004 | * (N1 x 8) - 1 in the bitmap are 0 and number N2 so that bits | ||
2005 | * (N2 + 1) x 8 through 2007 are 0. */ | ||
2006 | n1 = 0; | ||
2007 | for (i = 0; i < IEEE80211_MAX_TIM_LEN; i++) { | ||
2008 | if (bss->tim[i]) { | ||
2009 | n1 = i & 0xfe; | ||
2010 | break; | ||
2011 | } | ||
2012 | } | ||
2013 | n2 = n1; | ||
2014 | for (i = IEEE80211_MAX_TIM_LEN - 1; i >= n1; i--) { | ||
2015 | if (bss->tim[i]) { | ||
2016 | n2 = i; | ||
2017 | break; | ||
2018 | } | ||
2019 | } | ||
2020 | |||
2021 | /* Bitmap control */ | ||
2022 | *pos++ = n1 | aid0; | ||
2023 | /* Part Virt Bitmap */ | ||
2024 | memcpy(pos, bss->tim + n1, n2 - n1 + 1); | ||
2025 | |||
2026 | tim[1] = n2 - n1 + 4; | ||
2027 | skb_put(skb, n2 - n1); | ||
2028 | } else { | ||
2029 | *pos++ = aid0; /* Bitmap control */ | ||
2030 | *pos++ = 0; /* Part Virt Bitmap */ | ||
2031 | } | ||
2032 | spin_unlock_bh(&local->sta_lock); | ||
2033 | } | ||
2034 | |||
2035 | |||
2036 | struct sk_buff * ieee80211_beacon_get(struct ieee80211_hw *hw, int if_id, | ||
2037 | struct ieee80211_tx_control *control) | ||
2038 | { | ||
2039 | struct ieee80211_local *local = hw_to_local(hw); | ||
2040 | struct sk_buff *skb; | ||
2041 | struct net_device *bdev; | ||
2042 | struct ieee80211_sub_if_data *sdata = NULL; | ||
2043 | struct ieee80211_if_ap *ap = NULL; | ||
2044 | struct ieee80211_rate *rate; | ||
2045 | struct rate_control_extra extra; | ||
2046 | u8 *b_head, *b_tail; | ||
2047 | int bh_len, bt_len; | ||
2048 | |||
2049 | bdev = dev_get_by_index(if_id); | ||
2050 | if (bdev) { | ||
2051 | sdata = IEEE80211_DEV_TO_SUB_IF(bdev); | ||
2052 | ap = &sdata->u.ap; | ||
2053 | dev_put(bdev); | ||
2054 | } | ||
2055 | |||
2056 | if (!ap || sdata->type != IEEE80211_IF_TYPE_AP || | ||
2057 | !ap->beacon_head) { | ||
2058 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | ||
2059 | if (net_ratelimit()) | ||
2060 | printk(KERN_DEBUG "no beacon data avail for idx=%d " | ||
2061 | "(%s)\n", if_id, bdev ? bdev->name : "N/A"); | ||
2062 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | ||
2063 | return NULL; | ||
2064 | } | ||
2065 | |||
2066 | /* Assume we are generating the normal beacon locally */ | ||
2067 | b_head = ap->beacon_head; | ||
2068 | b_tail = ap->beacon_tail; | ||
2069 | bh_len = ap->beacon_head_len; | ||
2070 | bt_len = ap->beacon_tail_len; | ||
2071 | |||
2072 | skb = dev_alloc_skb(local->tx_headroom + | ||
2073 | bh_len + bt_len + 256 /* maximum TIM len */); | ||
2074 | if (!skb) | ||
2075 | return NULL; | ||
2076 | |||
2077 | skb_reserve(skb, local->tx_headroom); | ||
2078 | memcpy(skb_put(skb, bh_len), b_head, bh_len); | ||
2079 | |||
2080 | ieee80211_include_sequence(sdata, (struct ieee80211_hdr *)skb->data); | ||
2081 | |||
2082 | ieee80211_beacon_add_tim(local, ap, skb); | ||
2083 | |||
2084 | if (b_tail) { | ||
2085 | memcpy(skb_put(skb, bt_len), b_tail, bt_len); | ||
2086 | } | ||
2087 | |||
2088 | if (control) { | ||
2089 | memset(&extra, 0, sizeof(extra)); | ||
2090 | extra.mode = local->oper_hw_mode; | ||
2091 | |||
2092 | rate = rate_control_get_rate(local, local->mdev, skb, &extra); | ||
2093 | if (!rate) { | ||
2094 | if (net_ratelimit()) { | ||
2095 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: no rate " | ||
2096 | "found\n", local->mdev->name); | ||
2097 | } | ||
2098 | dev_kfree_skb(skb); | ||
2099 | return NULL; | ||
2100 | } | ||
2101 | |||
2102 | control->tx_rate = (local->short_preamble && | ||
2103 | (rate->flags & IEEE80211_RATE_PREAMBLE2)) ? | ||
2104 | rate->val2 : rate->val; | ||
2105 | control->antenna_sel_tx = local->hw.conf.antenna_sel_tx; | ||
2106 | control->power_level = local->hw.conf.power_level; | ||
2107 | control->flags |= IEEE80211_TXCTL_NO_ACK; | ||
2108 | control->retry_limit = 1; | ||
2109 | control->flags |= IEEE80211_TXCTL_CLEAR_DST_MASK; | ||
2110 | } | ||
2111 | |||
2112 | ap->num_beacons++; | ||
2113 | return skb; | ||
2114 | } | ||
2115 | EXPORT_SYMBOL(ieee80211_beacon_get); | ||
2116 | |||
2117 | __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, | 454 | __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, |
2118 | size_t frame_len, | 455 | size_t frame_len, |
2119 | const struct ieee80211_tx_control *frame_txctl) | 456 | const struct ieee80211_tx_control *frame_txctl) |
@@ -2168,110 +505,6 @@ __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, | |||
2168 | } | 505 | } |
2169 | EXPORT_SYMBOL(ieee80211_ctstoself_duration); | 506 | EXPORT_SYMBOL(ieee80211_ctstoself_duration); |
2170 | 507 | ||
2171 | void ieee80211_rts_get(struct ieee80211_hw *hw, | ||
2172 | const void *frame, size_t frame_len, | ||
2173 | const struct ieee80211_tx_control *frame_txctl, | ||
2174 | struct ieee80211_rts *rts) | ||
2175 | { | ||
2176 | const struct ieee80211_hdr *hdr = frame; | ||
2177 | u16 fctl; | ||
2178 | |||
2179 | fctl = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS; | ||
2180 | rts->frame_control = cpu_to_le16(fctl); | ||
2181 | rts->duration = ieee80211_rts_duration(hw, frame_len, frame_txctl); | ||
2182 | memcpy(rts->ra, hdr->addr1, sizeof(rts->ra)); | ||
2183 | memcpy(rts->ta, hdr->addr2, sizeof(rts->ta)); | ||
2184 | } | ||
2185 | EXPORT_SYMBOL(ieee80211_rts_get); | ||
2186 | |||
2187 | void ieee80211_ctstoself_get(struct ieee80211_hw *hw, | ||
2188 | const void *frame, size_t frame_len, | ||
2189 | const struct ieee80211_tx_control *frame_txctl, | ||
2190 | struct ieee80211_cts *cts) | ||
2191 | { | ||
2192 | const struct ieee80211_hdr *hdr = frame; | ||
2193 | u16 fctl; | ||
2194 | |||
2195 | fctl = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS; | ||
2196 | cts->frame_control = cpu_to_le16(fctl); | ||
2197 | cts->duration = ieee80211_ctstoself_duration(hw, frame_len, frame_txctl); | ||
2198 | memcpy(cts->ra, hdr->addr1, sizeof(cts->ra)); | ||
2199 | } | ||
2200 | EXPORT_SYMBOL(ieee80211_ctstoself_get); | ||
2201 | |||
2202 | struct sk_buff * | ||
2203 | ieee80211_get_buffered_bc(struct ieee80211_hw *hw, int if_id, | ||
2204 | struct ieee80211_tx_control *control) | ||
2205 | { | ||
2206 | struct ieee80211_local *local = hw_to_local(hw); | ||
2207 | struct sk_buff *skb; | ||
2208 | struct sta_info *sta; | ||
2209 | ieee80211_tx_handler *handler; | ||
2210 | struct ieee80211_txrx_data tx; | ||
2211 | ieee80211_txrx_result res = TXRX_DROP; | ||
2212 | struct net_device *bdev; | ||
2213 | struct ieee80211_sub_if_data *sdata; | ||
2214 | struct ieee80211_if_ap *bss = NULL; | ||
2215 | |||
2216 | bdev = dev_get_by_index(if_id); | ||
2217 | if (bdev) { | ||
2218 | sdata = IEEE80211_DEV_TO_SUB_IF(bdev); | ||
2219 | bss = &sdata->u.ap; | ||
2220 | dev_put(bdev); | ||
2221 | } | ||
2222 | if (!bss || sdata->type != IEEE80211_IF_TYPE_AP || !bss->beacon_head) | ||
2223 | return NULL; | ||
2224 | |||
2225 | if (bss->dtim_count != 0) | ||
2226 | return NULL; /* send buffered bc/mc only after DTIM beacon */ | ||
2227 | memset(control, 0, sizeof(*control)); | ||
2228 | while (1) { | ||
2229 | skb = skb_dequeue(&bss->ps_bc_buf); | ||
2230 | if (!skb) | ||
2231 | return NULL; | ||
2232 | local->total_ps_buffered--; | ||
2233 | |||
2234 | if (!skb_queue_empty(&bss->ps_bc_buf) && skb->len >= 2) { | ||
2235 | struct ieee80211_hdr *hdr = | ||
2236 | (struct ieee80211_hdr *) skb->data; | ||
2237 | /* more buffered multicast/broadcast frames ==> set | ||
2238 | * MoreData flag in IEEE 802.11 header to inform PS | ||
2239 | * STAs */ | ||
2240 | hdr->frame_control |= | ||
2241 | cpu_to_le16(IEEE80211_FCTL_MOREDATA); | ||
2242 | } | ||
2243 | |||
2244 | if (ieee80211_tx_prepare(&tx, skb, local->mdev, control) == 0) | ||
2245 | break; | ||
2246 | dev_kfree_skb_any(skb); | ||
2247 | } | ||
2248 | sta = tx.sta; | ||
2249 | tx.u.tx.ps_buffered = 1; | ||
2250 | |||
2251 | for (handler = local->tx_handlers; *handler != NULL; handler++) { | ||
2252 | res = (*handler)(&tx); | ||
2253 | if (res == TXRX_DROP || res == TXRX_QUEUED) | ||
2254 | break; | ||
2255 | } | ||
2256 | dev_put(tx.dev); | ||
2257 | skb = tx.skb; /* handlers are allowed to change skb */ | ||
2258 | |||
2259 | if (res == TXRX_DROP) { | ||
2260 | I802_DEBUG_INC(local->tx_handlers_drop); | ||
2261 | dev_kfree_skb(skb); | ||
2262 | skb = NULL; | ||
2263 | } else if (res == TXRX_QUEUED) { | ||
2264 | I802_DEBUG_INC(local->tx_handlers_queued); | ||
2265 | skb = NULL; | ||
2266 | } | ||
2267 | |||
2268 | if (sta) | ||
2269 | sta_info_put(sta); | ||
2270 | |||
2271 | return skb; | ||
2272 | } | ||
2273 | EXPORT_SYMBOL(ieee80211_get_buffered_bc); | ||
2274 | |||
2275 | static int __ieee80211_if_config(struct net_device *dev, | 508 | static int __ieee80211_if_config(struct net_device *dev, |
2276 | struct sk_buff *beacon, | 509 | struct sk_buff *beacon, |
2277 | struct ieee80211_tx_control *control) | 510 | struct ieee80211_tx_control *control) |
@@ -2912,64 +1145,6 @@ int ieee80211_radar_status(struct ieee80211_hw *hw, int channel, | |||
2912 | EXPORT_SYMBOL(ieee80211_radar_status); | 1145 | EXPORT_SYMBOL(ieee80211_radar_status); |
2913 | 1146 | ||
2914 | 1147 | ||
2915 | static ieee80211_txrx_result | ||
2916 | ieee80211_tx_h_load_stats(struct ieee80211_txrx_data *tx) | ||
2917 | { | ||
2918 | struct ieee80211_local *local = tx->local; | ||
2919 | struct ieee80211_hw_mode *mode = tx->u.tx.mode; | ||
2920 | struct sk_buff *skb = tx->skb; | ||
2921 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
2922 | u32 load = 0, hdrtime; | ||
2923 | |||
2924 | /* TODO: this could be part of tx_status handling, so that the number | ||
2925 | * of retries would be known; TX rate should in that case be stored | ||
2926 | * somewhere with the packet */ | ||
2927 | |||
2928 | /* Estimate total channel use caused by this frame */ | ||
2929 | |||
2930 | /* 1 bit at 1 Mbit/s takes 1 usec; in channel_use values, | ||
2931 | * 1 usec = 1/8 * (1080 / 10) = 13.5 */ | ||
2932 | |||
2933 | if (mode->mode == MODE_IEEE80211A || | ||
2934 | mode->mode == MODE_ATHEROS_TURBO || | ||
2935 | mode->mode == MODE_ATHEROS_TURBOG || | ||
2936 | (mode->mode == MODE_IEEE80211G && | ||
2937 | tx->u.tx.rate->flags & IEEE80211_RATE_ERP)) | ||
2938 | hdrtime = CHAN_UTIL_HDR_SHORT; | ||
2939 | else | ||
2940 | hdrtime = CHAN_UTIL_HDR_LONG; | ||
2941 | |||
2942 | load = hdrtime; | ||
2943 | if (!is_multicast_ether_addr(hdr->addr1)) | ||
2944 | load += hdrtime; | ||
2945 | |||
2946 | if (tx->u.tx.control->flags & IEEE80211_TXCTL_USE_RTS_CTS) | ||
2947 | load += 2 * hdrtime; | ||
2948 | else if (tx->u.tx.control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | ||
2949 | load += hdrtime; | ||
2950 | |||
2951 | load += skb->len * tx->u.tx.rate->rate_inv; | ||
2952 | |||
2953 | if (tx->u.tx.extra_frag) { | ||
2954 | int i; | ||
2955 | for (i = 0; i < tx->u.tx.num_extra_frag; i++) { | ||
2956 | load += 2 * hdrtime; | ||
2957 | load += tx->u.tx.extra_frag[i]->len * | ||
2958 | tx->u.tx.rate->rate; | ||
2959 | } | ||
2960 | } | ||
2961 | |||
2962 | /* Divide channel_use by 8 to avoid wrapping around the counter */ | ||
2963 | load >>= CHAN_UTIL_SHIFT; | ||
2964 | local->channel_use_raw += load; | ||
2965 | if (tx->sta) | ||
2966 | tx->sta->channel_use_raw += load; | ||
2967 | tx->sdata->channel_use_raw += load; | ||
2968 | |||
2969 | return TXRX_CONTINUE; | ||
2970 | } | ||
2971 | |||
2972 | |||
2973 | static void ieee80211_stat_refresh(unsigned long data) | 1148 | static void ieee80211_stat_refresh(unsigned long data) |
2974 | { | 1149 | { |
2975 | struct ieee80211_local *local = (struct ieee80211_local *) data; | 1150 | struct ieee80211_local *local = (struct ieee80211_local *) data; |
@@ -3365,26 +1540,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
3365 | } | 1540 | } |
3366 | EXPORT_SYMBOL(ieee80211_tx_status); | 1541 | EXPORT_SYMBOL(ieee80211_tx_status); |
3367 | 1542 | ||
3368 | /* TODO: implement register/unregister functions for adding TX/RX handlers | ||
3369 | * into ordered list */ | ||
3370 | |||
3371 | static ieee80211_tx_handler ieee80211_tx_handlers[] = | ||
3372 | { | ||
3373 | ieee80211_tx_h_check_assoc, | ||
3374 | ieee80211_tx_h_sequence, | ||
3375 | ieee80211_tx_h_ps_buf, | ||
3376 | ieee80211_tx_h_select_key, | ||
3377 | ieee80211_tx_h_michael_mic_add, | ||
3378 | ieee80211_tx_h_fragment, | ||
3379 | ieee80211_tx_h_tkip_encrypt, | ||
3380 | ieee80211_tx_h_ccmp_encrypt, | ||
3381 | ieee80211_tx_h_wep_encrypt, | ||
3382 | ieee80211_tx_h_rate_ctrl, | ||
3383 | ieee80211_tx_h_misc, | ||
3384 | ieee80211_tx_h_load_stats, | ||
3385 | NULL | ||
3386 | }; | ||
3387 | |||
3388 | 1543 | ||
3389 | int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr) | 1544 | int ieee80211_if_update_wds(struct net_device *dev, u8 *remote_addr) |
3390 | { | 1545 | { |