diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 378 |
1 files changed, 179 insertions, 199 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 6f3e4be97631..21951bac1ef7 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -46,13 +46,20 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | |||
46 | struct ieee80211_local *local = tx->local; | 46 | struct ieee80211_local *local = tx->local; |
47 | struct ieee80211_supported_band *sband; | 47 | struct ieee80211_supported_band *sband; |
48 | struct ieee80211_hdr *hdr; | 48 | struct ieee80211_hdr *hdr; |
49 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
50 | |||
51 | /* assume HW handles this */ | ||
52 | if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS) | ||
53 | return 0; | ||
54 | |||
55 | /* uh huh? */ | ||
56 | if (WARN_ON_ONCE(info->control.rates[0].idx < 0)) | ||
57 | return 0; | ||
49 | 58 | ||
50 | sband = local->hw.wiphy->bands[tx->channel->band]; | 59 | sband = local->hw.wiphy->bands[tx->channel->band]; |
51 | txrate = &sband->bitrates[tx->rate_idx]; | 60 | txrate = &sband->bitrates[info->control.rates[0].idx]; |
52 | 61 | ||
53 | erp = 0; | 62 | erp = txrate->flags & IEEE80211_RATE_ERP_G; |
54 | if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) | ||
55 | erp = txrate->flags & IEEE80211_RATE_ERP_G; | ||
56 | 63 | ||
57 | /* | 64 | /* |
58 | * data and mgmt (except PS Poll): | 65 | * data and mgmt (except PS Poll): |
@@ -437,140 +444,154 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | |||
437 | static ieee80211_tx_result debug_noinline | 444 | static ieee80211_tx_result debug_noinline |
438 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) | 445 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) |
439 | { | 446 | { |
440 | struct rate_selection rsel; | ||
441 | struct ieee80211_supported_band *sband; | ||
442 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | 447 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); |
448 | struct ieee80211_hdr *hdr = (void *)tx->skb->data; | ||
449 | struct ieee80211_supported_band *sband; | ||
450 | struct ieee80211_rate *rate; | ||
451 | int i, len; | ||
452 | bool inval = false, rts = false, short_preamble = false; | ||
453 | struct ieee80211_tx_rate_control txrc; | ||
443 | 454 | ||
444 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | 455 | memset(&txrc, 0, sizeof(txrc)); |
445 | 456 | ||
446 | if (likely(tx->rate_idx < 0)) { | 457 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; |
447 | rate_control_get_rate(tx->sdata, sband, tx->sta, | ||
448 | tx->skb, &rsel); | ||
449 | if (tx->sta) | ||
450 | tx->sta->last_txrate_idx = rsel.rate_idx; | ||
451 | tx->rate_idx = rsel.rate_idx; | ||
452 | if (unlikely(rsel.probe_idx >= 0)) { | ||
453 | info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
454 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
455 | info->control.retries[0].rate_idx = tx->rate_idx; | ||
456 | info->control.retries[0].limit = tx->local->hw.max_altrate_tries; | ||
457 | tx->rate_idx = rsel.probe_idx; | ||
458 | } else if (info->control.retries[0].limit == 0) | ||
459 | info->control.retries[0].rate_idx = -1; | ||
460 | |||
461 | if (unlikely(tx->rate_idx < 0)) | ||
462 | return TX_DROP; | ||
463 | } else | ||
464 | info->control.retries[0].rate_idx = -1; | ||
465 | 458 | ||
466 | if (tx->sdata->vif.bss_conf.use_cts_prot && | 459 | len = min_t(int, tx->skb->len + FCS_LEN, |
467 | (tx->flags & IEEE80211_TX_FRAGMENTED) && (rsel.nonerp_idx >= 0)) { | 460 | tx->local->fragmentation_threshold); |
468 | tx->last_frag_rate_idx = tx->rate_idx; | 461 | |
469 | if (rsel.probe_idx >= 0) | 462 | /* set up the tx rate control struct we give the RC algo */ |
470 | tx->flags &= ~IEEE80211_TX_PROBE_LAST_FRAG; | 463 | txrc.hw = local_to_hw(tx->local); |
471 | else | 464 | txrc.sband = sband; |
472 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | 465 | txrc.bss_conf = &tx->sdata->vif.bss_conf; |
473 | tx->rate_idx = rsel.nonerp_idx; | 466 | txrc.skb = tx->skb; |
474 | info->tx_rate_idx = rsel.nonerp_idx; | 467 | txrc.reported_rate.idx = -1; |
475 | info->flags &= ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; | 468 | txrc.max_rate_idx = tx->sdata->max_ratectrl_rateidx; |
476 | } else { | 469 | |
477 | tx->last_frag_rate_idx = tx->rate_idx; | 470 | /* set up RTS protection if desired */ |
478 | info->tx_rate_idx = tx->rate_idx; | 471 | if (tx->local->rts_threshold < IEEE80211_MAX_RTS_THRESHOLD && |
472 | len > tx->local->rts_threshold) { | ||
473 | txrc.rts = rts = true; | ||
479 | } | 474 | } |
480 | info->tx_rate_idx = tx->rate_idx; | ||
481 | 475 | ||
482 | return TX_CONTINUE; | 476 | /* |
483 | } | 477 | * Use short preamble if the BSS can handle it, but not for |
478 | * management frames unless we know the receiver can handle | ||
479 | * that -- the management frame might be to a station that | ||
480 | * just wants a probe response. | ||
481 | */ | ||
482 | if (tx->sdata->vif.bss_conf.use_short_preamble && | ||
483 | (ieee80211_is_data(hdr->frame_control) || | ||
484 | (tx->sta && test_sta_flags(tx->sta, WLAN_STA_SHORT_PREAMBLE)))) | ||
485 | txrc.short_preamble = short_preamble = true; | ||
484 | 486 | ||
485 | static ieee80211_tx_result debug_noinline | ||
486 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | ||
487 | { | ||
488 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | ||
489 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
490 | struct ieee80211_supported_band *sband; | ||
491 | 487 | ||
492 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | 488 | rate_control_get_rate(tx->sdata, tx->sta, &txrc); |
489 | |||
490 | if (unlikely(info->control.rates[0].idx < 0)) | ||
491 | return TX_DROP; | ||
492 | |||
493 | if (txrc.reported_rate.idx < 0) | ||
494 | txrc.reported_rate = info->control.rates[0]; | ||
493 | 495 | ||
494 | if (tx->sta) | 496 | if (tx->sta) |
495 | info->control.sta = &tx->sta->sta; | 497 | tx->sta->last_tx_rate = txrc.reported_rate; |
496 | 498 | ||
497 | if (!info->control.retry_limit) { | 499 | if (unlikely(!info->control.rates[0].count)) |
498 | if (!is_multicast_ether_addr(hdr->addr1)) { | 500 | info->control.rates[0].count = 1; |
499 | int len = min_t(int, tx->skb->len + FCS_LEN, | ||
500 | tx->local->fragmentation_threshold); | ||
501 | if (len > tx->local->rts_threshold | ||
502 | && tx->local->rts_threshold < | ||
503 | IEEE80211_MAX_RTS_THRESHOLD) { | ||
504 | info->flags |= IEEE80211_TX_CTL_USE_RTS_CTS; | ||
505 | info->flags |= | ||
506 | IEEE80211_TX_CTL_LONG_RETRY_LIMIT; | ||
507 | info->control.retry_limit = | ||
508 | tx->local->hw.conf.long_frame_max_tx_count - 1; | ||
509 | } else { | ||
510 | info->control.retry_limit = | ||
511 | tx->local->hw.conf.short_frame_max_tx_count - 1; | ||
512 | } | ||
513 | } else { | ||
514 | info->control.retry_limit = 1; | ||
515 | } | ||
516 | } | ||
517 | 501 | ||
518 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | 502 | if (is_multicast_ether_addr(hdr->addr1)) { |
519 | /* Do not use multiple retry rates when sending fragmented | 503 | /* |
520 | * frames. | 504 | * XXX: verify the rate is in the basic rateset |
521 | * TODO: The last fragment could still use multiple retry | 505 | */ |
522 | * rates. */ | 506 | return TX_CONTINUE; |
523 | info->control.retries[0].rate_idx = -1; | ||
524 | } | 507 | } |
525 | 508 | ||
526 | /* Use CTS protection for unicast frames sent using extended rates if | 509 | /* |
527 | * there are associated non-ERP stations and RTS/CTS is not configured | 510 | * set up the RTS/CTS rate as the fastest basic rate |
528 | * for the frame. */ | 511 | * that is not faster than the data rate |
529 | if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && | 512 | * |
530 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_ERP_G) && | 513 | * XXX: Should this check all retry rates? |
531 | (tx->flags & IEEE80211_TX_UNICAST) && | 514 | */ |
532 | tx->sdata->vif.bss_conf.use_cts_prot && | 515 | if (!(info->control.rates[0].flags & IEEE80211_TX_RC_MCS)) { |
533 | !(info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)) | 516 | s8 baserate = 0; |
534 | info->flags |= IEEE80211_TX_CTL_USE_CTS_PROTECT; | 517 | |
535 | 518 | rate = &sband->bitrates[info->control.rates[0].idx]; | |
536 | /* Transmit data frames using short preambles if the driver supports | 519 | |
537 | * short preambles at the selected rate and short preambles are | 520 | for (i = 0; i < sband->n_bitrates; i++) { |
538 | * available on the network at the current point in time. */ | 521 | /* must be a basic rate */ |
539 | if (ieee80211_is_data(hdr->frame_control) && | 522 | if (!(tx->sdata->vif.bss_conf.basic_rates & BIT(i))) |
540 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) && | 523 | continue; |
541 | tx->sdata->vif.bss_conf.use_short_preamble && | 524 | /* must not be faster than the data rate */ |
542 | (!tx->sta || test_sta_flags(tx->sta, WLAN_STA_SHORT_PREAMBLE))) { | 525 | if (sband->bitrates[i].bitrate > rate->bitrate) |
543 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; | 526 | continue; |
527 | /* maximum */ | ||
528 | if (sband->bitrates[baserate].bitrate < | ||
529 | sband->bitrates[i].bitrate) | ||
530 | baserate = i; | ||
531 | } | ||
532 | |||
533 | info->control.rts_cts_rate_idx = baserate; | ||
544 | } | 534 | } |
545 | 535 | ||
546 | if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) || | 536 | for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { |
547 | (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) { | 537 | /* |
548 | struct ieee80211_rate *rate; | 538 | * make sure there's no valid rate following |
549 | s8 baserate = -1; | 539 | * an invalid one, just in case drivers don't |
550 | int idx; | 540 | * take the API seriously to stop at -1. |
541 | */ | ||
542 | if (inval) { | ||
543 | info->control.rates[i].idx = -1; | ||
544 | continue; | ||
545 | } | ||
546 | if (info->control.rates[i].idx < 0) { | ||
547 | inval = true; | ||
548 | continue; | ||
549 | } | ||
551 | 550 | ||
552 | /* Do not use multiple retry rates when using RTS/CTS */ | 551 | /* |
553 | info->control.retries[0].rate_idx = -1; | 552 | * For now assume MCS is already set up correctly, this |
553 | * needs to be fixed. | ||
554 | */ | ||
555 | if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS) { | ||
556 | WARN_ON(info->control.rates[i].idx > 76); | ||
557 | continue; | ||
558 | } | ||
554 | 559 | ||
555 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | 560 | /* set up RTS protection if desired */ |
556 | rate = &sband->bitrates[tx->rate_idx]; | 561 | if (rts) |
562 | info->control.rates[i].flags |= | ||
563 | IEEE80211_TX_RC_USE_RTS_CTS; | ||
557 | 564 | ||
558 | for (idx = 0; idx < sband->n_bitrates; idx++) { | 565 | /* RC is busted */ |
559 | if (sband->bitrates[idx].bitrate > rate->bitrate) | 566 | if (WARN_ON(info->control.rates[i].idx >= |
560 | continue; | 567 | sband->n_bitrates)) { |
561 | if (tx->sdata->vif.bss_conf.basic_rates & BIT(idx) && | 568 | info->control.rates[i].idx = -1; |
562 | (baserate < 0 || | 569 | continue; |
563 | (sband->bitrates[baserate].bitrate | ||
564 | < sband->bitrates[idx].bitrate))) | ||
565 | baserate = idx; | ||
566 | } | 570 | } |
567 | 571 | ||
568 | if (baserate >= 0) | 572 | rate = &sband->bitrates[info->control.rates[i].idx]; |
569 | info->control.rts_cts_rate_idx = baserate; | 573 | |
570 | else | 574 | /* set up short preamble */ |
571 | info->control.rts_cts_rate_idx = 0; | 575 | if (short_preamble && |
576 | rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) | ||
577 | info->control.rates[i].flags |= | ||
578 | IEEE80211_TX_RC_USE_SHORT_PREAMBLE; | ||
579 | |||
580 | /* set up G protection */ | ||
581 | if (!rts && tx->sdata->vif.bss_conf.use_cts_prot && | ||
582 | rate->flags & IEEE80211_RATE_ERP_G) | ||
583 | info->control.rates[i].flags |= | ||
584 | IEEE80211_TX_RC_USE_CTS_PROTECT; | ||
572 | } | 585 | } |
573 | 586 | ||
587 | return TX_CONTINUE; | ||
588 | } | ||
589 | |||
590 | static ieee80211_tx_result debug_noinline | ||
591 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | ||
592 | { | ||
593 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
594 | |||
574 | if (tx->sta) | 595 | if (tx->sta) |
575 | info->control.sta = &tx->sta->sta; | 596 | info->control.sta = &tx->sta->sta; |
576 | 597 | ||
@@ -678,6 +699,7 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
678 | left = payload_len - per_fragm; | 699 | left = payload_len - per_fragm; |
679 | for (i = 0; i < num_fragm - 1; i++) { | 700 | for (i = 0; i < num_fragm - 1; i++) { |
680 | struct ieee80211_hdr *fhdr; | 701 | struct ieee80211_hdr *fhdr; |
702 | struct ieee80211_tx_info *info; | ||
681 | size_t copylen; | 703 | size_t copylen; |
682 | 704 | ||
683 | if (left <= 0) | 705 | if (left <= 0) |
@@ -692,20 +714,45 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
692 | IEEE80211_ENCRYPT_TAILROOM); | 714 | IEEE80211_ENCRYPT_TAILROOM); |
693 | if (!frag) | 715 | if (!frag) |
694 | goto fail; | 716 | goto fail; |
717 | |||
695 | /* Make sure that all fragments use the same priority so | 718 | /* Make sure that all fragments use the same priority so |
696 | * that they end up using the same TX queue */ | 719 | * that they end up using the same TX queue */ |
697 | frag->priority = first->priority; | 720 | frag->priority = first->priority; |
721 | |||
698 | skb_reserve(frag, tx->local->tx_headroom + | 722 | skb_reserve(frag, tx->local->tx_headroom + |
699 | IEEE80211_ENCRYPT_HEADROOM); | 723 | IEEE80211_ENCRYPT_HEADROOM); |
724 | |||
725 | /* copy TX information */ | ||
726 | info = IEEE80211_SKB_CB(frag); | ||
727 | memcpy(info, first->cb, sizeof(frag->cb)); | ||
728 | |||
729 | /* copy/fill in 802.11 header */ | ||
700 | fhdr = (struct ieee80211_hdr *) skb_put(frag, hdrlen); | 730 | fhdr = (struct ieee80211_hdr *) skb_put(frag, hdrlen); |
701 | memcpy(fhdr, first->data, hdrlen); | 731 | memcpy(fhdr, first->data, hdrlen); |
702 | if (i == num_fragm - 2) | ||
703 | fhdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREFRAGS); | ||
704 | fhdr->seq_ctrl = cpu_to_le16(seq | ((i + 1) & IEEE80211_SCTL_FRAG)); | 732 | fhdr->seq_ctrl = cpu_to_le16(seq | ((i + 1) & IEEE80211_SCTL_FRAG)); |
733 | |||
734 | if (i == num_fragm - 2) { | ||
735 | /* clear MOREFRAGS bit for the last fragment */ | ||
736 | fhdr->frame_control &= cpu_to_le16(~IEEE80211_FCTL_MOREFRAGS); | ||
737 | } else { | ||
738 | /* | ||
739 | * No multi-rate retries for fragmented frames, that | ||
740 | * would completely throw off the NAV at other STAs. | ||
741 | */ | ||
742 | info->control.rates[1].idx = -1; | ||
743 | info->control.rates[2].idx = -1; | ||
744 | info->control.rates[3].idx = -1; | ||
745 | info->control.rates[4].idx = -1; | ||
746 | BUILD_BUG_ON(IEEE80211_TX_MAX_RATES != 5); | ||
747 | info->flags &= ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
748 | } | ||
749 | |||
750 | /* copy data */ | ||
705 | copylen = left > per_fragm ? per_fragm : left; | 751 | copylen = left > per_fragm ? per_fragm : left; |
706 | memcpy(skb_put(frag, copylen), pos, copylen); | 752 | memcpy(skb_put(frag, copylen), pos, copylen); |
707 | memcpy(frag->cb, first->cb, sizeof(frag->cb)); | 753 | |
708 | skb_copy_queue_mapping(frag, first); | 754 | skb_copy_queue_mapping(frag, first); |
755 | |||
709 | frag->do_not_encrypt = first->do_not_encrypt; | 756 | frag->do_not_encrypt = first->do_not_encrypt; |
710 | 757 | ||
711 | pos += copylen; | 758 | pos += copylen; |
@@ -765,12 +812,10 @@ ieee80211_tx_h_calculate_duration(struct ieee80211_tx_data *tx) | |||
765 | tx->extra_frag[0]->len); | 812 | tx->extra_frag[0]->len); |
766 | 813 | ||
767 | for (i = 0; i < tx->num_extra_frag; i++) { | 814 | for (i = 0; i < tx->num_extra_frag; i++) { |
768 | if (i + 1 < tx->num_extra_frag) { | 815 | if (i + 1 < tx->num_extra_frag) |
769 | next_len = tx->extra_frag[i + 1]->len; | 816 | next_len = tx->extra_frag[i + 1]->len; |
770 | } else { | 817 | else |
771 | next_len = 0; | 818 | next_len = 0; |
772 | tx->rate_idx = tx->last_frag_rate_idx; | ||
773 | } | ||
774 | 819 | ||
775 | hdr = (struct ieee80211_hdr *)tx->extra_frag[i]->data; | 820 | hdr = (struct ieee80211_hdr *)tx->extra_frag[i]->data; |
776 | hdr->duration_id = ieee80211_duration(tx, 0, next_len); | 821 | hdr->duration_id = ieee80211_duration(tx, 0, next_len); |
@@ -823,7 +868,6 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
823 | (struct ieee80211_radiotap_header *) skb->data; | 868 | (struct ieee80211_radiotap_header *) skb->data; |
824 | struct ieee80211_supported_band *sband; | 869 | struct ieee80211_supported_band *sband; |
825 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); | 870 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); |
826 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
827 | 871 | ||
828 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | 872 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; |
829 | 873 | ||
@@ -837,8 +881,6 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
837 | */ | 881 | */ |
838 | 882 | ||
839 | while (!ret) { | 883 | while (!ret) { |
840 | int i, target_rate; | ||
841 | |||
842 | ret = ieee80211_radiotap_iterator_next(&iterator); | 884 | ret = ieee80211_radiotap_iterator_next(&iterator); |
843 | 885 | ||
844 | if (ret) | 886 | if (ret) |
@@ -852,38 +894,6 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
852 | * get_unaligned((type *)iterator.this_arg) to dereference | 894 | * get_unaligned((type *)iterator.this_arg) to dereference |
853 | * iterator.this_arg for type "type" safely on all arches. | 895 | * iterator.this_arg for type "type" safely on all arches. |
854 | */ | 896 | */ |
855 | case IEEE80211_RADIOTAP_RATE: | ||
856 | /* | ||
857 | * radiotap rate u8 is in 500kbps units eg, 0x02=1Mbps | ||
858 | * ieee80211 rate int is in 100kbps units eg, 0x0a=1Mbps | ||
859 | */ | ||
860 | target_rate = (*iterator.this_arg) * 5; | ||
861 | for (i = 0; i < sband->n_bitrates; i++) { | ||
862 | struct ieee80211_rate *r; | ||
863 | |||
864 | r = &sband->bitrates[i]; | ||
865 | |||
866 | if (r->bitrate == target_rate) { | ||
867 | tx->rate_idx = i; | ||
868 | break; | ||
869 | } | ||
870 | } | ||
871 | break; | ||
872 | |||
873 | case IEEE80211_RADIOTAP_ANTENNA: | ||
874 | /* | ||
875 | * radiotap uses 0 for 1st ant, mac80211 is 1 for | ||
876 | * 1st ant | ||
877 | */ | ||
878 | info->antenna_sel_tx = (*iterator.this_arg) + 1; | ||
879 | break; | ||
880 | |||
881 | #if 0 | ||
882 | case IEEE80211_RADIOTAP_DBM_TX_POWER: | ||
883 | control->power_level = *iterator.this_arg; | ||
884 | break; | ||
885 | #endif | ||
886 | |||
887 | case IEEE80211_RADIOTAP_FLAGS: | 897 | case IEEE80211_RADIOTAP_FLAGS: |
888 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FCS) { | 898 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FCS) { |
889 | /* | 899 | /* |
@@ -949,8 +959,6 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
949 | tx->local = local; | 959 | tx->local = local; |
950 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 960 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
951 | tx->channel = local->hw.conf.channel; | 961 | tx->channel = local->hw.conf.channel; |
952 | tx->rate_idx = -1; | ||
953 | tx->last_frag_rate_idx = -1; | ||
954 | /* | 962 | /* |
955 | * Set this flag (used below to indicate "automatic fragmentation"), | 963 | * Set this flag (used below to indicate "automatic fragmentation"), |
956 | * it will be cleared/left by radiotap as desired. | 964 | * it will be cleared/left by radiotap as desired. |
@@ -1051,23 +1059,11 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | |||
1051 | if (!tx->extra_frag[i]) | 1059 | if (!tx->extra_frag[i]) |
1052 | continue; | 1060 | continue; |
1053 | info = IEEE80211_SKB_CB(tx->extra_frag[i]); | 1061 | info = IEEE80211_SKB_CB(tx->extra_frag[i]); |
1054 | info->flags &= ~(IEEE80211_TX_CTL_USE_RTS_CTS | | 1062 | info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | |
1055 | IEEE80211_TX_CTL_USE_CTS_PROTECT | | ||
1056 | IEEE80211_TX_CTL_CLEAR_PS_FILT | | ||
1057 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | 1063 | IEEE80211_TX_CTL_FIRST_FRAGMENT); |
1058 | if (netif_subqueue_stopped(local->mdev, | 1064 | if (netif_subqueue_stopped(local->mdev, |
1059 | tx->extra_frag[i])) | 1065 | tx->extra_frag[i])) |
1060 | return IEEE80211_TX_FRAG_AGAIN; | 1066 | return IEEE80211_TX_FRAG_AGAIN; |
1061 | if (i == tx->num_extra_frag) { | ||
1062 | info->tx_rate_idx = tx->last_frag_rate_idx; | ||
1063 | |||
1064 | if (tx->flags & IEEE80211_TX_PROBE_LAST_FRAG) | ||
1065 | info->flags |= | ||
1066 | IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
1067 | else | ||
1068 | info->flags &= | ||
1069 | ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
1070 | } | ||
1071 | 1067 | ||
1072 | ret = local->ops->tx(local_to_hw(local), | 1068 | ret = local->ops->tx(local_to_hw(local), |
1073 | tx->extra_frag[i]); | 1069 | tx->extra_frag[i]); |
@@ -1204,9 +1200,6 @@ retry: | |||
1204 | store->skb = skb; | 1200 | store->skb = skb; |
1205 | store->extra_frag = tx.extra_frag; | 1201 | store->extra_frag = tx.extra_frag; |
1206 | store->num_extra_frag = tx.num_extra_frag; | 1202 | store->num_extra_frag = tx.num_extra_frag; |
1207 | store->last_frag_rate_idx = tx.last_frag_rate_idx; | ||
1208 | store->last_frag_rate_ctrl_probe = | ||
1209 | !!(tx.flags & IEEE80211_TX_PROBE_LAST_FRAG); | ||
1210 | } | 1203 | } |
1211 | out: | 1204 | out: |
1212 | rcu_read_unlock(); | 1205 | rcu_read_unlock(); |
@@ -1763,10 +1756,7 @@ void ieee80211_tx_pending(unsigned long data) | |||
1763 | store = &local->pending_packet[i]; | 1756 | store = &local->pending_packet[i]; |
1764 | tx.extra_frag = store->extra_frag; | 1757 | tx.extra_frag = store->extra_frag; |
1765 | tx.num_extra_frag = store->num_extra_frag; | 1758 | tx.num_extra_frag = store->num_extra_frag; |
1766 | tx.last_frag_rate_idx = store->last_frag_rate_idx; | ||
1767 | tx.flags = 0; | 1759 | tx.flags = 0; |
1768 | if (store->last_frag_rate_ctrl_probe) | ||
1769 | tx.flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
1770 | ret = __ieee80211_tx(local, store->skb, &tx); | 1760 | ret = __ieee80211_tx(local, store->skb, &tx); |
1771 | if (ret) { | 1761 | if (ret) { |
1772 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1762 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
@@ -1854,7 +1844,6 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1854 | struct ieee80211_sub_if_data *sdata = NULL; | 1844 | struct ieee80211_sub_if_data *sdata = NULL; |
1855 | struct ieee80211_if_ap *ap = NULL; | 1845 | struct ieee80211_if_ap *ap = NULL; |
1856 | struct ieee80211_if_sta *ifsta = NULL; | 1846 | struct ieee80211_if_sta *ifsta = NULL; |
1857 | struct rate_selection rsel; | ||
1858 | struct beacon_data *beacon; | 1847 | struct beacon_data *beacon; |
1859 | struct ieee80211_supported_band *sband; | 1848 | struct ieee80211_supported_band *sband; |
1860 | enum ieee80211_band band = local->hw.conf.channel->band; | 1849 | enum ieee80211_band band = local->hw.conf.channel->band; |
@@ -1958,32 +1947,23 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1958 | skb->do_not_encrypt = 1; | 1947 | skb->do_not_encrypt = 1; |
1959 | 1948 | ||
1960 | info->band = band; | 1949 | info->band = band; |
1961 | rate_control_get_rate(sdata, sband, NULL, skb, &rsel); | 1950 | /* |
1962 | 1951 | * XXX: For now, always use the lowest rate | |
1963 | if (unlikely(rsel.rate_idx < 0)) { | 1952 | */ |
1964 | if (net_ratelimit()) { | 1953 | info->control.rates[0].idx = 0; |
1965 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: " | 1954 | info->control.rates[0].count = 1; |
1966 | "no rate found\n", | 1955 | info->control.rates[1].idx = -1; |
1967 | wiphy_name(local->hw.wiphy)); | 1956 | info->control.rates[2].idx = -1; |
1968 | } | 1957 | info->control.rates[3].idx = -1; |
1969 | dev_kfree_skb_any(skb); | 1958 | info->control.rates[4].idx = -1; |
1970 | skb = NULL; | 1959 | BUILD_BUG_ON(IEEE80211_TX_MAX_RATES != 5); |
1971 | goto out; | ||
1972 | } | ||
1973 | 1960 | ||
1974 | info->control.vif = vif; | 1961 | info->control.vif = vif; |
1975 | info->tx_rate_idx = rsel.rate_idx; | ||
1976 | 1962 | ||
1977 | info->flags |= IEEE80211_TX_CTL_NO_ACK; | 1963 | info->flags |= IEEE80211_TX_CTL_NO_ACK; |
1978 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; | 1964 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1979 | info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; | 1965 | info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; |
1980 | if (sdata->vif.bss_conf.use_short_preamble && | 1966 | out: |
1981 | sband->bitrates[rsel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) | ||
1982 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; | ||
1983 | |||
1984 | info->control.retry_limit = 1; | ||
1985 | |||
1986 | out: | ||
1987 | rcu_read_unlock(); | 1967 | rcu_read_unlock(); |
1988 | return skb; | 1968 | return skb; |
1989 | } | 1969 | } |