diff options
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 874 |
1 files changed, 435 insertions, 439 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index c80d5899f279..ce06e791bf43 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -91,11 +91,12 @@ static u16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | |||
91 | int next_frag_len) | 91 | int next_frag_len) |
92 | { | 92 | { |
93 | int rate, mrate, erp, dur, i; | 93 | int rate, mrate, erp, dur, i; |
94 | struct ieee80211_rate *txrate = tx->rate; | 94 | struct ieee80211_rate *txrate; |
95 | struct ieee80211_local *local = tx->local; | 95 | struct ieee80211_local *local = tx->local; |
96 | struct ieee80211_supported_band *sband; | 96 | struct ieee80211_supported_band *sband; |
97 | 97 | ||
98 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 98 | sband = local->hw.wiphy->bands[tx->channel->band]; |
99 | txrate = &sband->bitrates[tx->rate_idx]; | ||
99 | 100 | ||
100 | erp = 0; | 101 | erp = 0; |
101 | if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) | 102 | if (tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) |
@@ -212,18 +213,6 @@ static u16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, | |||
212 | return dur; | 213 | return dur; |
213 | } | 214 | } |
214 | 215 | ||
215 | static inline int __ieee80211_queue_stopped(const struct ieee80211_local *local, | ||
216 | int queue) | ||
217 | { | ||
218 | return test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]); | ||
219 | } | ||
220 | |||
221 | static inline int __ieee80211_queue_pending(const struct ieee80211_local *local, | ||
222 | int queue) | ||
223 | { | ||
224 | return test_bit(IEEE80211_LINK_STATE_PENDING, &local->state[queue]); | ||
225 | } | ||
226 | |||
227 | static int inline is_ieee80211_device(struct net_device *dev, | 216 | static int inline is_ieee80211_device(struct net_device *dev, |
228 | struct net_device *master) | 217 | struct net_device *master) |
229 | { | 218 | { |
@@ -237,12 +226,12 @@ static ieee80211_tx_result | |||
237 | ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) | 226 | ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) |
238 | { | 227 | { |
239 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 228 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
240 | struct sk_buff *skb = tx->skb; | 229 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; |
241 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
242 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ | 230 | #endif /* CONFIG_MAC80211_VERBOSE_DEBUG */ |
231 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
243 | u32 sta_flags; | 232 | u32 sta_flags; |
244 | 233 | ||
245 | if (unlikely(tx->flags & IEEE80211_TX_INJECTED)) | 234 | if (unlikely(info->flags & IEEE80211_TX_CTL_INJECTED)) |
246 | return TX_CONTINUE; | 235 | return TX_CONTINUE; |
247 | 236 | ||
248 | if (unlikely(tx->local->sta_sw_scanning) && | 237 | if (unlikely(tx->local->sta_sw_scanning) && |
@@ -256,7 +245,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) | |||
256 | if (tx->flags & IEEE80211_TX_PS_BUFFERED) | 245 | if (tx->flags & IEEE80211_TX_PS_BUFFERED) |
257 | return TX_CONTINUE; | 246 | return TX_CONTINUE; |
258 | 247 | ||
259 | sta_flags = tx->sta ? tx->sta->flags : 0; | 248 | sta_flags = tx->sta ? get_sta_flags(tx->sta) : 0; |
260 | 249 | ||
261 | if (likely(tx->flags & IEEE80211_TX_UNICAST)) { | 250 | if (likely(tx->flags & IEEE80211_TX_UNICAST)) { |
262 | if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && | 251 | if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && |
@@ -347,6 +336,8 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
347 | static ieee80211_tx_result | 336 | static ieee80211_tx_result |
348 | ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | 337 | ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) |
349 | { | 338 | { |
339 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
340 | |||
350 | /* | 341 | /* |
351 | * broadcast/multicast frame | 342 | * broadcast/multicast frame |
352 | * | 343 | * |
@@ -382,7 +373,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) | |||
382 | } | 373 | } |
383 | 374 | ||
384 | /* buffered in hardware */ | 375 | /* buffered in hardware */ |
385 | tx->control->flags |= IEEE80211_TXCTL_SEND_AFTER_DTIM; | 376 | info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM; |
386 | 377 | ||
387 | return TX_CONTINUE; | 378 | return TX_CONTINUE; |
388 | } | 379 | } |
@@ -391,6 +382,8 @@ static ieee80211_tx_result | |||
391 | ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | 382 | ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) |
392 | { | 383 | { |
393 | struct sta_info *sta = tx->sta; | 384 | struct sta_info *sta = tx->sta; |
385 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
386 | u32 staflags; | ||
394 | DECLARE_MAC_BUF(mac); | 387 | DECLARE_MAC_BUF(mac); |
395 | 388 | ||
396 | if (unlikely(!sta || | 389 | if (unlikely(!sta || |
@@ -398,9 +391,10 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
398 | (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP))) | 391 | (tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP))) |
399 | return TX_CONTINUE; | 392 | return TX_CONTINUE; |
400 | 393 | ||
401 | if (unlikely((sta->flags & WLAN_STA_PS) && | 394 | staflags = get_sta_flags(sta); |
402 | !(sta->flags & WLAN_STA_PSPOLL))) { | 395 | |
403 | struct ieee80211_tx_packet_data *pkt_data; | 396 | if (unlikely((staflags & WLAN_STA_PS) && |
397 | !(staflags & WLAN_STA_PSPOLL))) { | ||
404 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 398 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
405 | printk(KERN_DEBUG "STA %s aid %d: PS buffer (entries " | 399 | printk(KERN_DEBUG "STA %s aid %d: PS buffer (entries " |
406 | "before %d)\n", | 400 | "before %d)\n", |
@@ -424,19 +418,18 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
424 | if (skb_queue_empty(&sta->ps_tx_buf)) | 418 | if (skb_queue_empty(&sta->ps_tx_buf)) |
425 | sta_info_set_tim_bit(sta); | 419 | sta_info_set_tim_bit(sta); |
426 | 420 | ||
427 | pkt_data = (struct ieee80211_tx_packet_data *)tx->skb->cb; | 421 | info->control.jiffies = jiffies; |
428 | pkt_data->jiffies = jiffies; | ||
429 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); | 422 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); |
430 | return TX_QUEUED; | 423 | return TX_QUEUED; |
431 | } | 424 | } |
432 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 425 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
433 | else if (unlikely(sta->flags & WLAN_STA_PS)) { | 426 | else if (unlikely(test_sta_flags(sta, WLAN_STA_PS))) { |
434 | printk(KERN_DEBUG "%s: STA %s in PS mode, but pspoll " | 427 | printk(KERN_DEBUG "%s: STA %s in PS mode, but pspoll " |
435 | "set -> send frame\n", tx->dev->name, | 428 | "set -> send frame\n", tx->dev->name, |
436 | print_mac(mac, sta->addr)); | 429 | print_mac(mac, sta->addr)); |
437 | } | 430 | } |
438 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ | 431 | #endif /* CONFIG_MAC80211_VERBOSE_PS_DEBUG */ |
439 | sta->flags &= ~WLAN_STA_PSPOLL; | 432 | clear_sta_flags(sta, WLAN_STA_PSPOLL); |
440 | 433 | ||
441 | return TX_CONTINUE; | 434 | return TX_CONTINUE; |
442 | } | 435 | } |
@@ -457,17 +450,18 @@ static ieee80211_tx_result | |||
457 | ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | 450 | ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) |
458 | { | 451 | { |
459 | struct ieee80211_key *key; | 452 | struct ieee80211_key *key; |
453 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
460 | u16 fc = tx->fc; | 454 | u16 fc = tx->fc; |
461 | 455 | ||
462 | if (unlikely(tx->control->flags & IEEE80211_TXCTL_DO_NOT_ENCRYPT)) | 456 | if (unlikely(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT)) |
463 | tx->key = NULL; | 457 | tx->key = NULL; |
464 | else if (tx->sta && (key = rcu_dereference(tx->sta->key))) | 458 | else if (tx->sta && (key = rcu_dereference(tx->sta->key))) |
465 | tx->key = key; | 459 | tx->key = key; |
466 | else if ((key = rcu_dereference(tx->sdata->default_key))) | 460 | else if ((key = rcu_dereference(tx->sdata->default_key))) |
467 | tx->key = key; | 461 | tx->key = key; |
468 | else if (tx->sdata->drop_unencrypted && | 462 | else if (tx->sdata->drop_unencrypted && |
469 | !(tx->control->flags & IEEE80211_TXCTL_EAPOL_FRAME) && | 463 | !(info->flags & IEEE80211_TX_CTL_EAPOL_FRAME) && |
470 | !(tx->flags & IEEE80211_TX_INJECTED)) { | 464 | !(info->flags & IEEE80211_TX_CTL_INJECTED)) { |
471 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); | 465 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); |
472 | return TX_DROP; | 466 | return TX_DROP; |
473 | } else | 467 | } else |
@@ -496,7 +490,156 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | |||
496 | } | 490 | } |
497 | 491 | ||
498 | if (!tx->key || !(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) | 492 | if (!tx->key || !(tx->key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)) |
499 | tx->control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 493 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
494 | |||
495 | return TX_CONTINUE; | ||
496 | } | ||
497 | |||
498 | static ieee80211_tx_result | ||
499 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) | ||
500 | { | ||
501 | struct rate_selection rsel; | ||
502 | struct ieee80211_supported_band *sband; | ||
503 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
504 | |||
505 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | ||
506 | |||
507 | if (likely(tx->rate_idx < 0)) { | ||
508 | rate_control_get_rate(tx->dev, sband, tx->skb, &rsel); | ||
509 | tx->rate_idx = rsel.rate_idx; | ||
510 | if (unlikely(rsel.probe_idx >= 0)) { | ||
511 | info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
512 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
513 | info->control.alt_retry_rate_idx = tx->rate_idx; | ||
514 | tx->rate_idx = rsel.probe_idx; | ||
515 | } else | ||
516 | info->control.alt_retry_rate_idx = -1; | ||
517 | |||
518 | if (unlikely(tx->rate_idx < 0)) | ||
519 | return TX_DROP; | ||
520 | } else | ||
521 | info->control.alt_retry_rate_idx = -1; | ||
522 | |||
523 | if (tx->sdata->bss_conf.use_cts_prot && | ||
524 | (tx->flags & IEEE80211_TX_FRAGMENTED) && (rsel.nonerp_idx >= 0)) { | ||
525 | tx->last_frag_rate_idx = tx->rate_idx; | ||
526 | if (rsel.probe_idx >= 0) | ||
527 | tx->flags &= ~IEEE80211_TX_PROBE_LAST_FRAG; | ||
528 | else | ||
529 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
530 | tx->rate_idx = rsel.nonerp_idx; | ||
531 | info->tx_rate_idx = rsel.nonerp_idx; | ||
532 | info->flags &= ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; | ||
533 | } else { | ||
534 | tx->last_frag_rate_idx = tx->rate_idx; | ||
535 | info->tx_rate_idx = tx->rate_idx; | ||
536 | } | ||
537 | info->tx_rate_idx = tx->rate_idx; | ||
538 | |||
539 | return TX_CONTINUE; | ||
540 | } | ||
541 | |||
542 | static ieee80211_tx_result | ||
543 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | ||
544 | { | ||
545 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
546 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
547 | u16 dur; | ||
548 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | ||
549 | struct ieee80211_supported_band *sband; | ||
550 | |||
551 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; | ||
552 | |||
553 | if (tx->sta) | ||
554 | info->control.aid = tx->sta->aid; | ||
555 | |||
556 | if (!info->control.retry_limit) { | ||
557 | if (!is_multicast_ether_addr(hdr->addr1)) { | ||
558 | int len = min_t(int, tx->skb->len + FCS_LEN, | ||
559 | tx->local->fragmentation_threshold); | ||
560 | if (len > tx->local->rts_threshold | ||
561 | && tx->local->rts_threshold < | ||
562 | IEEE80211_MAX_RTS_THRESHOLD) { | ||
563 | info->flags |= IEEE80211_TX_CTL_USE_RTS_CTS; | ||
564 | info->flags |= | ||
565 | IEEE80211_TX_CTL_LONG_RETRY_LIMIT; | ||
566 | info->control.retry_limit = | ||
567 | tx->local->long_retry_limit; | ||
568 | } else { | ||
569 | info->control.retry_limit = | ||
570 | tx->local->short_retry_limit; | ||
571 | } | ||
572 | } else { | ||
573 | info->control.retry_limit = 1; | ||
574 | } | ||
575 | } | ||
576 | |||
577 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | ||
578 | /* Do not use multiple retry rates when sending fragmented | ||
579 | * frames. | ||
580 | * TODO: The last fragment could still use multiple retry | ||
581 | * rates. */ | ||
582 | info->control.alt_retry_rate_idx = -1; | ||
583 | } | ||
584 | |||
585 | /* Use CTS protection for unicast frames sent using extended rates if | ||
586 | * there are associated non-ERP stations and RTS/CTS is not configured | ||
587 | * for the frame. */ | ||
588 | if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && | ||
589 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_ERP_G) && | ||
590 | (tx->flags & IEEE80211_TX_UNICAST) && | ||
591 | tx->sdata->bss_conf.use_cts_prot && | ||
592 | !(info->flags & IEEE80211_TX_CTL_USE_RTS_CTS)) | ||
593 | info->flags |= IEEE80211_TX_CTL_USE_CTS_PROTECT; | ||
594 | |||
595 | /* Transmit data frames using short preambles if the driver supports | ||
596 | * short preambles at the selected rate and short preambles are | ||
597 | * available on the network at the current point in time. */ | ||
598 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | ||
599 | (sband->bitrates[tx->rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) && | ||
600 | tx->sdata->bss_conf.use_short_preamble && | ||
601 | (!tx->sta || test_sta_flags(tx->sta, WLAN_STA_SHORT_PREAMBLE))) { | ||
602 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; | ||
603 | } | ||
604 | |||
605 | /* Setup duration field for the first fragment of the frame. Duration | ||
606 | * for remaining fragments will be updated when they are being sent | ||
607 | * to low-level driver in ieee80211_tx(). */ | ||
608 | dur = ieee80211_duration(tx, is_multicast_ether_addr(hdr->addr1), | ||
609 | (tx->flags & IEEE80211_TX_FRAGMENTED) ? | ||
610 | tx->extra_frag[0]->len : 0); | ||
611 | hdr->duration_id = cpu_to_le16(dur); | ||
612 | |||
613 | if ((info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) || | ||
614 | (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT)) { | ||
615 | struct ieee80211_rate *rate; | ||
616 | s8 baserate = -1; | ||
617 | int idx; | ||
618 | |||
619 | /* Do not use multiple retry rates when using RTS/CTS */ | ||
620 | info->control.alt_retry_rate_idx = -1; | ||
621 | |||
622 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | ||
623 | rate = &sband->bitrates[tx->rate_idx]; | ||
624 | |||
625 | for (idx = 0; idx < sband->n_bitrates; idx++) { | ||
626 | if (sband->bitrates[idx].bitrate > rate->bitrate) | ||
627 | continue; | ||
628 | if (tx->sdata->basic_rates & BIT(idx) && | ||
629 | (baserate < 0 || | ||
630 | (sband->bitrates[baserate].bitrate | ||
631 | < sband->bitrates[idx].bitrate))) | ||
632 | baserate = idx; | ||
633 | } | ||
634 | |||
635 | if (baserate >= 0) | ||
636 | info->control.rts_cts_rate_idx = baserate; | ||
637 | else | ||
638 | info->control.rts_cts_rate_idx = 0; | ||
639 | } | ||
640 | |||
641 | if (tx->sta) | ||
642 | info->control.aid = tx->sta->aid; | ||
500 | 643 | ||
501 | return TX_CONTINUE; | 644 | return TX_CONTINUE; |
502 | } | 645 | } |
@@ -515,6 +658,16 @@ ieee80211_tx_h_fragment(struct ieee80211_tx_data *tx) | |||
515 | if (!(tx->flags & IEEE80211_TX_FRAGMENTED)) | 658 | if (!(tx->flags & IEEE80211_TX_FRAGMENTED)) |
516 | return TX_CONTINUE; | 659 | return TX_CONTINUE; |
517 | 660 | ||
661 | /* | ||
662 | * Warn when submitting a fragmented A-MPDU frame and drop it. | ||
663 | * This scenario is handled in __ieee80211_tx_prepare but extra | ||
664 | * caution taken here as fragmented ampdu may cause Tx stop. | ||
665 | */ | ||
666 | if (WARN_ON(tx->flags & IEEE80211_TX_CTL_AMPDU || | ||
667 | skb_get_queue_mapping(tx->skb) >= | ||
668 | ieee80211_num_regular_queues(&tx->local->hw))) | ||
669 | return TX_DROP; | ||
670 | |||
518 | first = tx->skb; | 671 | first = tx->skb; |
519 | 672 | ||
520 | hdrlen = ieee80211_get_hdrlen(tx->fc); | 673 | hdrlen = ieee80211_get_hdrlen(tx->fc); |
@@ -602,215 +755,22 @@ ieee80211_tx_h_encrypt(struct ieee80211_tx_data *tx) | |||
602 | } | 755 | } |
603 | 756 | ||
604 | static ieee80211_tx_result | 757 | static ieee80211_tx_result |
605 | ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) | 758 | ieee80211_tx_h_stats(struct ieee80211_tx_data *tx) |
606 | { | ||
607 | struct rate_selection rsel; | ||
608 | struct ieee80211_supported_band *sband; | ||
609 | |||
610 | sband = tx->local->hw.wiphy->bands[tx->local->hw.conf.channel->band]; | ||
611 | |||
612 | if (likely(!tx->rate)) { | ||
613 | rate_control_get_rate(tx->dev, sband, tx->skb, &rsel); | ||
614 | tx->rate = rsel.rate; | ||
615 | if (unlikely(rsel.probe)) { | ||
616 | tx->control->flags |= | ||
617 | IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
618 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
619 | tx->control->alt_retry_rate = tx->rate; | ||
620 | tx->rate = rsel.probe; | ||
621 | } else | ||
622 | tx->control->alt_retry_rate = NULL; | ||
623 | |||
624 | if (!tx->rate) | ||
625 | return TX_DROP; | ||
626 | } else | ||
627 | tx->control->alt_retry_rate = NULL; | ||
628 | |||
629 | if (tx->sdata->bss_conf.use_cts_prot && | ||
630 | (tx->flags & IEEE80211_TX_FRAGMENTED) && rsel.nonerp) { | ||
631 | tx->last_frag_rate = tx->rate; | ||
632 | if (rsel.probe) | ||
633 | tx->flags &= ~IEEE80211_TX_PROBE_LAST_FRAG; | ||
634 | else | ||
635 | tx->flags |= IEEE80211_TX_PROBE_LAST_FRAG; | ||
636 | tx->rate = rsel.nonerp; | ||
637 | tx->control->tx_rate = rsel.nonerp; | ||
638 | tx->control->flags &= ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | ||
639 | } else { | ||
640 | tx->last_frag_rate = tx->rate; | ||
641 | tx->control->tx_rate = tx->rate; | ||
642 | } | ||
643 | tx->control->tx_rate = tx->rate; | ||
644 | |||
645 | return TX_CONTINUE; | ||
646 | } | ||
647 | |||
648 | static ieee80211_tx_result | ||
649 | ieee80211_tx_h_misc(struct ieee80211_tx_data *tx) | ||
650 | { | ||
651 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data; | ||
652 | u16 fc = le16_to_cpu(hdr->frame_control); | ||
653 | u16 dur; | ||
654 | struct ieee80211_tx_control *control = tx->control; | ||
655 | |||
656 | if (!control->retry_limit) { | ||
657 | if (!is_multicast_ether_addr(hdr->addr1)) { | ||
658 | if (tx->skb->len + FCS_LEN > tx->local->rts_threshold | ||
659 | && tx->local->rts_threshold < | ||
660 | IEEE80211_MAX_RTS_THRESHOLD) { | ||
661 | control->flags |= | ||
662 | IEEE80211_TXCTL_USE_RTS_CTS; | ||
663 | control->flags |= | ||
664 | IEEE80211_TXCTL_LONG_RETRY_LIMIT; | ||
665 | control->retry_limit = | ||
666 | tx->local->long_retry_limit; | ||
667 | } else { | ||
668 | control->retry_limit = | ||
669 | tx->local->short_retry_limit; | ||
670 | } | ||
671 | } else { | ||
672 | control->retry_limit = 1; | ||
673 | } | ||
674 | } | ||
675 | |||
676 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | ||
677 | /* Do not use multiple retry rates when sending fragmented | ||
678 | * frames. | ||
679 | * TODO: The last fragment could still use multiple retry | ||
680 | * rates. */ | ||
681 | control->alt_retry_rate = NULL; | ||
682 | } | ||
683 | |||
684 | /* Use CTS protection for unicast frames sent using extended rates if | ||
685 | * there are associated non-ERP stations and RTS/CTS is not configured | ||
686 | * for the frame. */ | ||
687 | if ((tx->sdata->flags & IEEE80211_SDATA_OPERATING_GMODE) && | ||
688 | (tx->rate->flags & IEEE80211_RATE_ERP_G) && | ||
689 | (tx->flags & IEEE80211_TX_UNICAST) && | ||
690 | tx->sdata->bss_conf.use_cts_prot && | ||
691 | !(control->flags & IEEE80211_TXCTL_USE_RTS_CTS)) | ||
692 | control->flags |= IEEE80211_TXCTL_USE_CTS_PROTECT; | ||
693 | |||
694 | /* Transmit data frames using short preambles if the driver supports | ||
695 | * short preambles at the selected rate and short preambles are | ||
696 | * available on the network at the current point in time. */ | ||
697 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && | ||
698 | (tx->rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) && | ||
699 | tx->sdata->bss_conf.use_short_preamble && | ||
700 | (!tx->sta || (tx->sta->flags & WLAN_STA_SHORT_PREAMBLE))) { | ||
701 | tx->control->flags |= IEEE80211_TXCTL_SHORT_PREAMBLE; | ||
702 | } | ||
703 | |||
704 | /* Setup duration field for the first fragment of the frame. Duration | ||
705 | * for remaining fragments will be updated when they are being sent | ||
706 | * to low-level driver in ieee80211_tx(). */ | ||
707 | dur = ieee80211_duration(tx, is_multicast_ether_addr(hdr->addr1), | ||
708 | (tx->flags & IEEE80211_TX_FRAGMENTED) ? | ||
709 | tx->extra_frag[0]->len : 0); | ||
710 | hdr->duration_id = cpu_to_le16(dur); | ||
711 | |||
712 | if ((control->flags & IEEE80211_TXCTL_USE_RTS_CTS) || | ||
713 | (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)) { | ||
714 | struct ieee80211_supported_band *sband; | ||
715 | struct ieee80211_rate *rate, *baserate; | ||
716 | int idx; | ||
717 | |||
718 | sband = tx->local->hw.wiphy->bands[ | ||
719 | tx->local->hw.conf.channel->band]; | ||
720 | |||
721 | /* Do not use multiple retry rates when using RTS/CTS */ | ||
722 | control->alt_retry_rate = NULL; | ||
723 | |||
724 | /* Use min(data rate, max base rate) as CTS/RTS rate */ | ||
725 | rate = tx->rate; | ||
726 | baserate = NULL; | ||
727 | |||
728 | for (idx = 0; idx < sband->n_bitrates; idx++) { | ||
729 | if (sband->bitrates[idx].bitrate > rate->bitrate) | ||
730 | continue; | ||
731 | if (tx->sdata->basic_rates & BIT(idx) && | ||
732 | (!baserate || | ||
733 | (baserate->bitrate < sband->bitrates[idx].bitrate))) | ||
734 | baserate = &sband->bitrates[idx]; | ||
735 | } | ||
736 | |||
737 | if (baserate) | ||
738 | control->rts_cts_rate = baserate; | ||
739 | else | ||
740 | control->rts_cts_rate = &sband->bitrates[0]; | ||
741 | } | ||
742 | |||
743 | if (tx->sta) { | ||
744 | control->aid = tx->sta->aid; | ||
745 | tx->sta->tx_packets++; | ||
746 | tx->sta->tx_fragments++; | ||
747 | tx->sta->tx_bytes += tx->skb->len; | ||
748 | if (tx->extra_frag) { | ||
749 | int i; | ||
750 | tx->sta->tx_fragments += tx->num_extra_frag; | ||
751 | for (i = 0; i < tx->num_extra_frag; i++) { | ||
752 | tx->sta->tx_bytes += | ||
753 | tx->extra_frag[i]->len; | ||
754 | } | ||
755 | } | ||
756 | } | ||
757 | |||
758 | return TX_CONTINUE; | ||
759 | } | ||
760 | |||
761 | static ieee80211_tx_result | ||
762 | ieee80211_tx_h_load_stats(struct ieee80211_tx_data *tx) | ||
763 | { | 759 | { |
764 | struct ieee80211_local *local = tx->local; | 760 | int i; |
765 | struct sk_buff *skb = tx->skb; | ||
766 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||
767 | u32 load = 0, hdrtime; | ||
768 | struct ieee80211_rate *rate = tx->rate; | ||
769 | |||
770 | /* TODO: this could be part of tx_status handling, so that the number | ||
771 | * of retries would be known; TX rate should in that case be stored | ||
772 | * somewhere with the packet */ | ||
773 | |||
774 | /* Estimate total channel use caused by this frame */ | ||
775 | |||
776 | /* 1 bit at 1 Mbit/s takes 1 usec; in channel_use values, | ||
777 | * 1 usec = 1/8 * (1080 / 10) = 13.5 */ | ||
778 | |||
779 | if (tx->channel->band == IEEE80211_BAND_5GHZ || | ||
780 | (tx->channel->band == IEEE80211_BAND_2GHZ && | ||
781 | rate->flags & IEEE80211_RATE_ERP_G)) | ||
782 | hdrtime = CHAN_UTIL_HDR_SHORT; | ||
783 | else | ||
784 | hdrtime = CHAN_UTIL_HDR_LONG; | ||
785 | |||
786 | load = hdrtime; | ||
787 | if (!is_multicast_ether_addr(hdr->addr1)) | ||
788 | load += hdrtime; | ||
789 | |||
790 | if (tx->control->flags & IEEE80211_TXCTL_USE_RTS_CTS) | ||
791 | load += 2 * hdrtime; | ||
792 | else if (tx->control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | ||
793 | load += hdrtime; | ||
794 | 761 | ||
795 | /* TODO: optimise again */ | 762 | if (!tx->sta) |
796 | load += skb->len * CHAN_UTIL_RATE_LCM / rate->bitrate; | 763 | return TX_CONTINUE; |
797 | 764 | ||
765 | tx->sta->tx_packets++; | ||
766 | tx->sta->tx_fragments++; | ||
767 | tx->sta->tx_bytes += tx->skb->len; | ||
798 | if (tx->extra_frag) { | 768 | if (tx->extra_frag) { |
799 | int i; | 769 | tx->sta->tx_fragments += tx->num_extra_frag; |
800 | for (i = 0; i < tx->num_extra_frag; i++) { | 770 | for (i = 0; i < tx->num_extra_frag; i++) |
801 | load += 2 * hdrtime; | 771 | tx->sta->tx_bytes += tx->extra_frag[i]->len; |
802 | load += tx->extra_frag[i]->len * | ||
803 | tx->rate->bitrate; | ||
804 | } | ||
805 | } | 772 | } |
806 | 773 | ||
807 | /* Divide channel_use by 8 to avoid wrapping around the counter */ | ||
808 | load >>= CHAN_UTIL_SHIFT; | ||
809 | local->channel_use_raw += load; | ||
810 | if (tx->sta) | ||
811 | tx->sta->channel_use_raw += load; | ||
812 | tx->sdata->channel_use_raw += load; | ||
813 | |||
814 | return TX_CONTINUE; | 774 | return TX_CONTINUE; |
815 | } | 775 | } |
816 | 776 | ||
@@ -823,11 +783,12 @@ static ieee80211_tx_handler ieee80211_tx_handlers[] = | |||
823 | ieee80211_tx_h_ps_buf, | 783 | ieee80211_tx_h_ps_buf, |
824 | ieee80211_tx_h_select_key, | 784 | ieee80211_tx_h_select_key, |
825 | ieee80211_tx_h_michael_mic_add, | 785 | ieee80211_tx_h_michael_mic_add, |
826 | ieee80211_tx_h_fragment, | ||
827 | ieee80211_tx_h_encrypt, | ||
828 | ieee80211_tx_h_rate_ctrl, | 786 | ieee80211_tx_h_rate_ctrl, |
829 | ieee80211_tx_h_misc, | 787 | ieee80211_tx_h_misc, |
830 | ieee80211_tx_h_load_stats, | 788 | ieee80211_tx_h_fragment, |
789 | /* handlers after fragment must be aware of tx info fragmentation! */ | ||
790 | ieee80211_tx_h_encrypt, | ||
791 | ieee80211_tx_h_stats, | ||
831 | NULL | 792 | NULL |
832 | }; | 793 | }; |
833 | 794 | ||
@@ -854,12 +815,12 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
854 | (struct ieee80211_radiotap_header *) skb->data; | 815 | (struct ieee80211_radiotap_header *) skb->data; |
855 | struct ieee80211_supported_band *sband; | 816 | struct ieee80211_supported_band *sband; |
856 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); | 817 | int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len); |
857 | struct ieee80211_tx_control *control = tx->control; | 818 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
858 | 819 | ||
859 | sband = tx->local->hw.wiphy->bands[tx->local->hw.conf.channel->band]; | 820 | sband = tx->local->hw.wiphy->bands[tx->channel->band]; |
860 | 821 | ||
861 | control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 822 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
862 | tx->flags |= IEEE80211_TX_INJECTED; | 823 | info->flags |= IEEE80211_TX_CTL_INJECTED; |
863 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; | 824 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; |
864 | 825 | ||
865 | /* | 826 | /* |
@@ -896,7 +857,7 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
896 | r = &sband->bitrates[i]; | 857 | r = &sband->bitrates[i]; |
897 | 858 | ||
898 | if (r->bitrate == target_rate) { | 859 | if (r->bitrate == target_rate) { |
899 | tx->rate = r; | 860 | tx->rate_idx = i; |
900 | break; | 861 | break; |
901 | } | 862 | } |
902 | } | 863 | } |
@@ -907,7 +868,7 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
907 | * radiotap uses 0 for 1st ant, mac80211 is 1 for | 868 | * radiotap uses 0 for 1st ant, mac80211 is 1 for |
908 | * 1st ant | 869 | * 1st ant |
909 | */ | 870 | */ |
910 | control->antenna_sel_tx = (*iterator.this_arg) + 1; | 871 | info->antenna_sel_tx = (*iterator.this_arg) + 1; |
911 | break; | 872 | break; |
912 | 873 | ||
913 | #if 0 | 874 | #if 0 |
@@ -931,8 +892,8 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
931 | skb_trim(skb, skb->len - FCS_LEN); | 892 | skb_trim(skb, skb->len - FCS_LEN); |
932 | } | 893 | } |
933 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_WEP) | 894 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_WEP) |
934 | control->flags &= | 895 | info->flags &= |
935 | ~IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 896 | ~IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
936 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) | 897 | if (*iterator.this_arg & IEEE80211_RADIOTAP_F_FRAG) |
937 | tx->flags |= IEEE80211_TX_FRAGMENTED; | 898 | tx->flags |= IEEE80211_TX_FRAGMENTED; |
938 | break; | 899 | break; |
@@ -967,12 +928,12 @@ __ieee80211_parse_tx_radiotap(struct ieee80211_tx_data *tx, | |||
967 | static ieee80211_tx_result | 928 | static ieee80211_tx_result |
968 | __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | 929 | __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, |
969 | struct sk_buff *skb, | 930 | struct sk_buff *skb, |
970 | struct net_device *dev, | 931 | struct net_device *dev) |
971 | struct ieee80211_tx_control *control) | ||
972 | { | 932 | { |
973 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 933 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
974 | struct ieee80211_hdr *hdr; | 934 | struct ieee80211_hdr *hdr; |
975 | struct ieee80211_sub_if_data *sdata; | 935 | struct ieee80211_sub_if_data *sdata; |
936 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
976 | 937 | ||
977 | int hdrlen; | 938 | int hdrlen; |
978 | 939 | ||
@@ -981,7 +942,9 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
981 | tx->dev = dev; /* use original interface */ | 942 | tx->dev = dev; /* use original interface */ |
982 | tx->local = local; | 943 | tx->local = local; |
983 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 944 | tx->sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
984 | tx->control = control; | 945 | tx->channel = local->hw.conf.channel; |
946 | tx->rate_idx = -1; | ||
947 | tx->last_frag_rate_idx = -1; | ||
985 | /* | 948 | /* |
986 | * Set this flag (used below to indicate "automatic fragmentation"), | 949 | * Set this flag (used below to indicate "automatic fragmentation"), |
987 | * it will be cleared/left by radiotap as desired. | 950 | * it will be cleared/left by radiotap as desired. |
@@ -1008,34 +971,33 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1008 | 971 | ||
1009 | if (is_multicast_ether_addr(hdr->addr1)) { | 972 | if (is_multicast_ether_addr(hdr->addr1)) { |
1010 | tx->flags &= ~IEEE80211_TX_UNICAST; | 973 | tx->flags &= ~IEEE80211_TX_UNICAST; |
1011 | control->flags |= IEEE80211_TXCTL_NO_ACK; | 974 | info->flags |= IEEE80211_TX_CTL_NO_ACK; |
1012 | } else { | 975 | } else { |
1013 | tx->flags |= IEEE80211_TX_UNICAST; | 976 | tx->flags |= IEEE80211_TX_UNICAST; |
1014 | control->flags &= ~IEEE80211_TXCTL_NO_ACK; | 977 | info->flags &= ~IEEE80211_TX_CTL_NO_ACK; |
1015 | } | 978 | } |
1016 | 979 | ||
1017 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { | 980 | if (tx->flags & IEEE80211_TX_FRAGMENTED) { |
1018 | if ((tx->flags & IEEE80211_TX_UNICAST) && | 981 | if ((tx->flags & IEEE80211_TX_UNICAST) && |
1019 | skb->len + FCS_LEN > local->fragmentation_threshold && | 982 | skb->len + FCS_LEN > local->fragmentation_threshold && |
1020 | !local->ops->set_frag_threshold) | 983 | !local->ops->set_frag_threshold && |
984 | !(info->flags & IEEE80211_TX_CTL_AMPDU)) | ||
1021 | tx->flags |= IEEE80211_TX_FRAGMENTED; | 985 | tx->flags |= IEEE80211_TX_FRAGMENTED; |
1022 | else | 986 | else |
1023 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; | 987 | tx->flags &= ~IEEE80211_TX_FRAGMENTED; |
1024 | } | 988 | } |
1025 | 989 | ||
1026 | if (!tx->sta) | 990 | if (!tx->sta) |
1027 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | 991 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1028 | else if (tx->sta->flags & WLAN_STA_CLEAR_PS_FILT) { | 992 | else if (test_and_clear_sta_flags(tx->sta, WLAN_STA_CLEAR_PS_FILT)) |
1029 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | 993 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; |
1030 | tx->sta->flags &= ~WLAN_STA_CLEAR_PS_FILT; | ||
1031 | } | ||
1032 | 994 | ||
1033 | hdrlen = ieee80211_get_hdrlen(tx->fc); | 995 | hdrlen = ieee80211_get_hdrlen(tx->fc); |
1034 | if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) { | 996 | if (skb->len > hdrlen + sizeof(rfc1042_header) + 2) { |
1035 | u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)]; | 997 | u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)]; |
1036 | tx->ethertype = (pos[0] << 8) | pos[1]; | 998 | tx->ethertype = (pos[0] << 8) | pos[1]; |
1037 | } | 999 | } |
1038 | control->flags |= IEEE80211_TXCTL_FIRST_FRAGMENT; | 1000 | info->flags |= IEEE80211_TX_CTL_FIRST_FRAGMENT; |
1039 | 1001 | ||
1040 | return TX_CONTINUE; | 1002 | return TX_CONTINUE; |
1041 | } | 1003 | } |
@@ -1045,14 +1007,12 @@ __ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1045 | */ | 1007 | */ |
1046 | static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | 1008 | static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, |
1047 | struct sk_buff *skb, | 1009 | struct sk_buff *skb, |
1048 | struct net_device *mdev, | 1010 | struct net_device *mdev) |
1049 | struct ieee80211_tx_control *control) | ||
1050 | { | 1011 | { |
1051 | struct ieee80211_tx_packet_data *pkt_data; | 1012 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1052 | struct net_device *dev; | 1013 | struct net_device *dev; |
1053 | 1014 | ||
1054 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | 1015 | dev = dev_get_by_index(&init_net, info->control.ifindex); |
1055 | dev = dev_get_by_index(&init_net, pkt_data->ifindex); | ||
1056 | if (unlikely(dev && !is_ieee80211_device(dev, mdev))) { | 1016 | if (unlikely(dev && !is_ieee80211_device(dev, mdev))) { |
1057 | dev_put(dev); | 1017 | dev_put(dev); |
1058 | dev = NULL; | 1018 | dev = NULL; |
@@ -1060,7 +1020,7 @@ static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1060 | if (unlikely(!dev)) | 1020 | if (unlikely(!dev)) |
1061 | return -ENODEV; | 1021 | return -ENODEV; |
1062 | /* initialises tx with control */ | 1022 | /* initialises tx with control */ |
1063 | __ieee80211_tx_prepare(tx, skb, dev, control); | 1023 | __ieee80211_tx_prepare(tx, skb, dev); |
1064 | dev_put(dev); | 1024 | dev_put(dev); |
1065 | return 0; | 1025 | return 0; |
1066 | } | 1026 | } |
@@ -1068,50 +1028,49 @@ static int ieee80211_tx_prepare(struct ieee80211_tx_data *tx, | |||
1068 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | 1028 | static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, |
1069 | struct ieee80211_tx_data *tx) | 1029 | struct ieee80211_tx_data *tx) |
1070 | { | 1030 | { |
1071 | struct ieee80211_tx_control *control = tx->control; | 1031 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1072 | int ret, i; | 1032 | int ret, i; |
1073 | 1033 | ||
1074 | if (!ieee80211_qdisc_installed(local->mdev) && | 1034 | if (netif_subqueue_stopped(local->mdev, skb)) |
1075 | __ieee80211_queue_stopped(local, 0)) { | ||
1076 | netif_stop_queue(local->mdev); | ||
1077 | return IEEE80211_TX_AGAIN; | 1035 | return IEEE80211_TX_AGAIN; |
1078 | } | 1036 | |
1079 | if (skb) { | 1037 | if (skb) { |
1080 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), | 1038 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), |
1081 | "TX to low-level driver", skb); | 1039 | "TX to low-level driver", skb); |
1082 | ret = local->ops->tx(local_to_hw(local), skb, control); | 1040 | ret = local->ops->tx(local_to_hw(local), skb); |
1083 | if (ret) | 1041 | if (ret) |
1084 | return IEEE80211_TX_AGAIN; | 1042 | return IEEE80211_TX_AGAIN; |
1085 | local->mdev->trans_start = jiffies; | 1043 | local->mdev->trans_start = jiffies; |
1086 | ieee80211_led_tx(local, 1); | 1044 | ieee80211_led_tx(local, 1); |
1087 | } | 1045 | } |
1088 | if (tx->extra_frag) { | 1046 | if (tx->extra_frag) { |
1089 | control->flags &= ~(IEEE80211_TXCTL_USE_RTS_CTS | | ||
1090 | IEEE80211_TXCTL_USE_CTS_PROTECT | | ||
1091 | IEEE80211_TXCTL_CLEAR_PS_FILT | | ||
1092 | IEEE80211_TXCTL_FIRST_FRAGMENT); | ||
1093 | for (i = 0; i < tx->num_extra_frag; i++) { | 1047 | for (i = 0; i < tx->num_extra_frag; i++) { |
1094 | if (!tx->extra_frag[i]) | 1048 | if (!tx->extra_frag[i]) |
1095 | continue; | 1049 | continue; |
1096 | if (__ieee80211_queue_stopped(local, control->queue)) | 1050 | info = IEEE80211_SKB_CB(tx->extra_frag[i]); |
1051 | info->flags &= ~(IEEE80211_TX_CTL_USE_RTS_CTS | | ||
1052 | IEEE80211_TX_CTL_USE_CTS_PROTECT | | ||
1053 | IEEE80211_TX_CTL_CLEAR_PS_FILT | | ||
1054 | IEEE80211_TX_CTL_FIRST_FRAGMENT); | ||
1055 | if (netif_subqueue_stopped(local->mdev, | ||
1056 | tx->extra_frag[i])) | ||
1097 | return IEEE80211_TX_FRAG_AGAIN; | 1057 | return IEEE80211_TX_FRAG_AGAIN; |
1098 | if (i == tx->num_extra_frag) { | 1058 | if (i == tx->num_extra_frag) { |
1099 | control->tx_rate = tx->last_frag_rate; | 1059 | info->tx_rate_idx = tx->last_frag_rate_idx; |
1100 | 1060 | ||
1101 | if (tx->flags & IEEE80211_TX_PROBE_LAST_FRAG) | 1061 | if (tx->flags & IEEE80211_TX_PROBE_LAST_FRAG) |
1102 | control->flags |= | 1062 | info->flags |= |
1103 | IEEE80211_TXCTL_RATE_CTRL_PROBE; | 1063 | IEEE80211_TX_CTL_RATE_CTRL_PROBE; |
1104 | else | 1064 | else |
1105 | control->flags &= | 1065 | info->flags &= |
1106 | ~IEEE80211_TXCTL_RATE_CTRL_PROBE; | 1066 | ~IEEE80211_TX_CTL_RATE_CTRL_PROBE; |
1107 | } | 1067 | } |
1108 | 1068 | ||
1109 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), | 1069 | ieee80211_dump_frame(wiphy_name(local->hw.wiphy), |
1110 | "TX to low-level driver", | 1070 | "TX to low-level driver", |
1111 | tx->extra_frag[i]); | 1071 | tx->extra_frag[i]); |
1112 | ret = local->ops->tx(local_to_hw(local), | 1072 | ret = local->ops->tx(local_to_hw(local), |
1113 | tx->extra_frag[i], | 1073 | tx->extra_frag[i]); |
1114 | control); | ||
1115 | if (ret) | 1074 | if (ret) |
1116 | return IEEE80211_TX_FRAG_AGAIN; | 1075 | return IEEE80211_TX_FRAG_AGAIN; |
1117 | local->mdev->trans_start = jiffies; | 1076 | local->mdev->trans_start = jiffies; |
@@ -1124,17 +1083,20 @@ static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb, | |||
1124 | return IEEE80211_TX_OK; | 1083 | return IEEE80211_TX_OK; |
1125 | } | 1084 | } |
1126 | 1085 | ||
1127 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | 1086 | static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb) |
1128 | struct ieee80211_tx_control *control) | ||
1129 | { | 1087 | { |
1130 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1088 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1131 | struct sta_info *sta; | 1089 | struct sta_info *sta; |
1132 | ieee80211_tx_handler *handler; | 1090 | ieee80211_tx_handler *handler; |
1133 | struct ieee80211_tx_data tx; | 1091 | struct ieee80211_tx_data tx; |
1134 | ieee80211_tx_result res = TX_DROP, res_prepare; | 1092 | ieee80211_tx_result res = TX_DROP, res_prepare; |
1135 | int ret, i, retries = 0; | 1093 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1094 | int ret, i; | ||
1095 | u16 queue; | ||
1136 | 1096 | ||
1137 | WARN_ON(__ieee80211_queue_pending(local, control->queue)); | 1097 | queue = skb_get_queue_mapping(skb); |
1098 | |||
1099 | WARN_ON(test_bit(queue, local->queues_pending)); | ||
1138 | 1100 | ||
1139 | if (unlikely(skb->len < 10)) { | 1101 | if (unlikely(skb->len < 10)) { |
1140 | dev_kfree_skb(skb); | 1102 | dev_kfree_skb(skb); |
@@ -1144,7 +1106,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1144 | rcu_read_lock(); | 1106 | rcu_read_lock(); |
1145 | 1107 | ||
1146 | /* initialises tx */ | 1108 | /* initialises tx */ |
1147 | res_prepare = __ieee80211_tx_prepare(&tx, skb, dev, control); | 1109 | res_prepare = __ieee80211_tx_prepare(&tx, skb, dev); |
1148 | 1110 | ||
1149 | if (res_prepare == TX_DROP) { | 1111 | if (res_prepare == TX_DROP) { |
1150 | dev_kfree_skb(skb); | 1112 | dev_kfree_skb(skb); |
@@ -1154,6 +1116,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1154 | 1116 | ||
1155 | sta = tx.sta; | 1117 | sta = tx.sta; |
1156 | tx.channel = local->hw.conf.channel; | 1118 | tx.channel = local->hw.conf.channel; |
1119 | info->band = tx.channel->band; | ||
1157 | 1120 | ||
1158 | for (handler = ieee80211_tx_handlers; *handler != NULL; | 1121 | for (handler = ieee80211_tx_handlers; *handler != NULL; |
1159 | handler++) { | 1122 | handler++) { |
@@ -1162,7 +1125,8 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1162 | break; | 1125 | break; |
1163 | } | 1126 | } |
1164 | 1127 | ||
1165 | skb = tx.skb; /* handlers are allowed to change skb */ | 1128 | if (WARN_ON(tx.skb != skb)) |
1129 | goto drop; | ||
1166 | 1130 | ||
1167 | if (unlikely(res == TX_DROP)) { | 1131 | if (unlikely(res == TX_DROP)) { |
1168 | I802_DEBUG_INC(local->tx_handlers_drop); | 1132 | I802_DEBUG_INC(local->tx_handlers_drop); |
@@ -1186,7 +1150,7 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1186 | next_len = tx.extra_frag[i + 1]->len; | 1150 | next_len = tx.extra_frag[i + 1]->len; |
1187 | } else { | 1151 | } else { |
1188 | next_len = 0; | 1152 | next_len = 0; |
1189 | tx.rate = tx.last_frag_rate; | 1153 | tx.rate_idx = tx.last_frag_rate_idx; |
1190 | } | 1154 | } |
1191 | dur = ieee80211_duration(&tx, 0, next_len); | 1155 | dur = ieee80211_duration(&tx, 0, next_len); |
1192 | hdr->duration_id = cpu_to_le16(dur); | 1156 | hdr->duration_id = cpu_to_le16(dur); |
@@ -1196,41 +1160,41 @@ static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb, | |||
1196 | retry: | 1160 | retry: |
1197 | ret = __ieee80211_tx(local, skb, &tx); | 1161 | ret = __ieee80211_tx(local, skb, &tx); |
1198 | if (ret) { | 1162 | if (ret) { |
1199 | struct ieee80211_tx_stored_packet *store = | 1163 | struct ieee80211_tx_stored_packet *store; |
1200 | &local->pending_packet[control->queue]; | 1164 | |
1165 | /* | ||
1166 | * Since there are no fragmented frames on A-MPDU | ||
1167 | * queues, there's no reason for a driver to reject | ||
1168 | * a frame there, warn and drop it. | ||
1169 | */ | ||
1170 | if (WARN_ON(queue >= ieee80211_num_regular_queues(&local->hw))) | ||
1171 | goto drop; | ||
1172 | |||
1173 | store = &local->pending_packet[queue]; | ||
1201 | 1174 | ||
1202 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1175 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
1203 | skb = NULL; | 1176 | skb = NULL; |
1204 | set_bit(IEEE80211_LINK_STATE_PENDING, | 1177 | set_bit(queue, local->queues_pending); |
1205 | &local->state[control->queue]); | ||
1206 | smp_mb(); | 1178 | smp_mb(); |
1207 | /* When the driver gets out of buffers during sending of | 1179 | /* |
1208 | * fragments and calls ieee80211_stop_queue, there is | 1180 | * When the driver gets out of buffers during sending of |
1209 | * a small window between IEEE80211_LINK_STATE_XOFF and | 1181 | * fragments and calls ieee80211_stop_queue, the netif |
1210 | * IEEE80211_LINK_STATE_PENDING flags are set. If a buffer | 1182 | * subqueue is stopped. There is, however, a small window |
1183 | * in which the PENDING bit is not yet set. If a buffer | ||
1211 | * gets available in that window (i.e. driver calls | 1184 | * gets available in that window (i.e. driver calls |
1212 | * ieee80211_wake_queue), we would end up with ieee80211_tx | 1185 | * ieee80211_wake_queue), we would end up with ieee80211_tx |
1213 | * called with IEEE80211_LINK_STATE_PENDING. Prevent this by | 1186 | * called with the PENDING bit still set. Prevent this by |
1214 | * continuing transmitting here when that situation is | 1187 | * continuing transmitting here when that situation is |
1215 | * possible to have happened. */ | 1188 | * possible to have happened. |
1216 | if (!__ieee80211_queue_stopped(local, control->queue)) { | 1189 | */ |
1217 | clear_bit(IEEE80211_LINK_STATE_PENDING, | 1190 | if (!__netif_subqueue_stopped(local->mdev, queue)) { |
1218 | &local->state[control->queue]); | 1191 | clear_bit(queue, local->queues_pending); |
1219 | retries++; | ||
1220 | /* | ||
1221 | * Driver bug, it's rejecting packets but | ||
1222 | * not stopping queues. | ||
1223 | */ | ||
1224 | if (WARN_ON_ONCE(retries > 5)) | ||
1225 | goto drop; | ||
1226 | goto retry; | 1192 | goto retry; |
1227 | } | 1193 | } |
1228 | memcpy(&store->control, control, | ||
1229 | sizeof(struct ieee80211_tx_control)); | ||
1230 | store->skb = skb; | 1194 | store->skb = skb; |
1231 | store->extra_frag = tx.extra_frag; | 1195 | store->extra_frag = tx.extra_frag; |
1232 | store->num_extra_frag = tx.num_extra_frag; | 1196 | store->num_extra_frag = tx.num_extra_frag; |
1233 | store->last_frag_rate = tx.last_frag_rate; | 1197 | store->last_frag_rate_idx = tx.last_frag_rate_idx; |
1234 | store->last_frag_rate_ctrl_probe = | 1198 | store->last_frag_rate_ctrl_probe = |
1235 | !!(tx.flags & IEEE80211_TX_PROBE_LAST_FRAG); | 1199 | !!(tx.flags & IEEE80211_TX_PROBE_LAST_FRAG); |
1236 | } | 1200 | } |
@@ -1250,24 +1214,57 @@ retry: | |||
1250 | 1214 | ||
1251 | /* device xmit handlers */ | 1215 | /* device xmit handlers */ |
1252 | 1216 | ||
1217 | static int ieee80211_skb_resize(struct ieee80211_local *local, | ||
1218 | struct sk_buff *skb, | ||
1219 | int head_need, bool may_encrypt) | ||
1220 | { | ||
1221 | int tail_need = 0; | ||
1222 | |||
1223 | /* | ||
1224 | * This could be optimised, devices that do full hardware | ||
1225 | * crypto (including TKIP MMIC) need no tailroom... But we | ||
1226 | * have no drivers for such devices currently. | ||
1227 | */ | ||
1228 | if (may_encrypt) { | ||
1229 | tail_need = IEEE80211_ENCRYPT_TAILROOM; | ||
1230 | tail_need -= skb_tailroom(skb); | ||
1231 | tail_need = max_t(int, tail_need, 0); | ||
1232 | } | ||
1233 | |||
1234 | if (head_need || tail_need) { | ||
1235 | /* Sorry. Can't account for this any more */ | ||
1236 | skb_orphan(skb); | ||
1237 | } | ||
1238 | |||
1239 | if (skb_header_cloned(skb)) | ||
1240 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | ||
1241 | else | ||
1242 | I802_DEBUG_INC(local->tx_expand_skb_head); | ||
1243 | |||
1244 | if (pskb_expand_head(skb, head_need, tail_need, GFP_ATOMIC)) { | ||
1245 | printk(KERN_DEBUG "%s: failed to reallocate TX buffer\n", | ||
1246 | wiphy_name(local->hw.wiphy)); | ||
1247 | return -ENOMEM; | ||
1248 | } | ||
1249 | |||
1250 | /* update truesize too */ | ||
1251 | skb->truesize += head_need + tail_need; | ||
1252 | |||
1253 | return 0; | ||
1254 | } | ||
1255 | |||
1253 | int ieee80211_master_start_xmit(struct sk_buff *skb, | 1256 | int ieee80211_master_start_xmit(struct sk_buff *skb, |
1254 | struct net_device *dev) | 1257 | struct net_device *dev) |
1255 | { | 1258 | { |
1256 | struct ieee80211_tx_control control; | 1259 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1257 | struct ieee80211_tx_packet_data *pkt_data; | ||
1258 | struct net_device *odev = NULL; | 1260 | struct net_device *odev = NULL; |
1259 | struct ieee80211_sub_if_data *osdata; | 1261 | struct ieee80211_sub_if_data *osdata; |
1260 | int headroom; | 1262 | int headroom; |
1263 | bool may_encrypt; | ||
1261 | int ret; | 1264 | int ret; |
1262 | 1265 | ||
1263 | /* | 1266 | if (info->control.ifindex) |
1264 | * copy control out of the skb so other people can use skb->cb | 1267 | odev = dev_get_by_index(&init_net, info->control.ifindex); |
1265 | */ | ||
1266 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1267 | memset(&control, 0, sizeof(struct ieee80211_tx_control)); | ||
1268 | |||
1269 | if (pkt_data->ifindex) | ||
1270 | odev = dev_get_by_index(&init_net, pkt_data->ifindex); | ||
1271 | if (unlikely(odev && !is_ieee80211_device(odev, dev))) { | 1268 | if (unlikely(odev && !is_ieee80211_device(odev, dev))) { |
1272 | dev_put(odev); | 1269 | dev_put(odev); |
1273 | odev = NULL; | 1270 | odev = NULL; |
@@ -1280,32 +1277,25 @@ int ieee80211_master_start_xmit(struct sk_buff *skb, | |||
1280 | dev_kfree_skb(skb); | 1277 | dev_kfree_skb(skb); |
1281 | return 0; | 1278 | return 0; |
1282 | } | 1279 | } |
1280 | |||
1283 | osdata = IEEE80211_DEV_TO_SUB_IF(odev); | 1281 | osdata = IEEE80211_DEV_TO_SUB_IF(odev); |
1284 | 1282 | ||
1285 | headroom = osdata->local->tx_headroom + IEEE80211_ENCRYPT_HEADROOM; | 1283 | may_encrypt = !(info->flags & IEEE80211_TX_CTL_DO_NOT_ENCRYPT); |
1286 | if (skb_headroom(skb) < headroom) { | 1284 | |
1287 | if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) { | 1285 | headroom = osdata->local->tx_headroom; |
1288 | dev_kfree_skb(skb); | 1286 | if (may_encrypt) |
1289 | dev_put(odev); | 1287 | headroom += IEEE80211_ENCRYPT_HEADROOM; |
1290 | return 0; | 1288 | headroom -= skb_headroom(skb); |
1291 | } | 1289 | headroom = max_t(int, 0, headroom); |
1290 | |||
1291 | if (ieee80211_skb_resize(osdata->local, skb, headroom, may_encrypt)) { | ||
1292 | dev_kfree_skb(skb); | ||
1293 | dev_put(odev); | ||
1294 | return 0; | ||
1292 | } | 1295 | } |
1293 | 1296 | ||
1294 | control.vif = &osdata->vif; | 1297 | info->control.vif = &osdata->vif; |
1295 | control.type = osdata->vif.type; | 1298 | ret = ieee80211_tx(odev, skb); |
1296 | if (pkt_data->flags & IEEE80211_TXPD_REQ_TX_STATUS) | ||
1297 | control.flags |= IEEE80211_TXCTL_REQ_TX_STATUS; | ||
1298 | if (pkt_data->flags & IEEE80211_TXPD_DO_NOT_ENCRYPT) | ||
1299 | control.flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | ||
1300 | if (pkt_data->flags & IEEE80211_TXPD_REQUEUE) | ||
1301 | control.flags |= IEEE80211_TXCTL_REQUEUE; | ||
1302 | if (pkt_data->flags & IEEE80211_TXPD_EAPOL_FRAME) | ||
1303 | control.flags |= IEEE80211_TXCTL_EAPOL_FRAME; | ||
1304 | if (pkt_data->flags & IEEE80211_TXPD_AMPDU) | ||
1305 | control.flags |= IEEE80211_TXCTL_AMPDU; | ||
1306 | control.queue = pkt_data->queue; | ||
1307 | |||
1308 | ret = ieee80211_tx(odev, skb, &control); | ||
1309 | dev_put(odev); | 1299 | dev_put(odev); |
1310 | 1300 | ||
1311 | return ret; | 1301 | return ret; |
@@ -1315,7 +1305,7 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
1315 | struct net_device *dev) | 1305 | struct net_device *dev) |
1316 | { | 1306 | { |
1317 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1307 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1318 | struct ieee80211_tx_packet_data *pkt_data; | 1308 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1319 | struct ieee80211_radiotap_header *prthdr = | 1309 | struct ieee80211_radiotap_header *prthdr = |
1320 | (struct ieee80211_radiotap_header *)skb->data; | 1310 | (struct ieee80211_radiotap_header *)skb->data; |
1321 | u16 len_rthdr; | 1311 | u16 len_rthdr; |
@@ -1337,12 +1327,12 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb, | |||
1337 | 1327 | ||
1338 | skb->dev = local->mdev; | 1328 | skb->dev = local->mdev; |
1339 | 1329 | ||
1340 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | ||
1341 | memset(pkt_data, 0, sizeof(*pkt_data)); | ||
1342 | /* needed because we set skb device to master */ | 1330 | /* needed because we set skb device to master */ |
1343 | pkt_data->ifindex = dev->ifindex; | 1331 | info->control.ifindex = dev->ifindex; |
1344 | 1332 | ||
1345 | pkt_data->flags |= IEEE80211_TXPD_DO_NOT_ENCRYPT; | 1333 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; |
1334 | /* Interfaces should always request a status report */ | ||
1335 | info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; | ||
1346 | 1336 | ||
1347 | /* | 1337 | /* |
1348 | * fix up the pointers accounting for the radiotap | 1338 | * fix up the pointers accounting for the radiotap |
@@ -1386,7 +1376,7 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1386 | struct net_device *dev) | 1376 | struct net_device *dev) |
1387 | { | 1377 | { |
1388 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | 1378 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
1389 | struct ieee80211_tx_packet_data *pkt_data; | 1379 | struct ieee80211_tx_info *info; |
1390 | struct ieee80211_sub_if_data *sdata; | 1380 | struct ieee80211_sub_if_data *sdata; |
1391 | int ret = 1, head_need; | 1381 | int ret = 1, head_need; |
1392 | u16 ethertype, hdrlen, meshhdrlen = 0, fc; | 1382 | u16 ethertype, hdrlen, meshhdrlen = 0, fc; |
@@ -1493,12 +1483,13 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1493 | rcu_read_lock(); | 1483 | rcu_read_lock(); |
1494 | sta = sta_info_get(local, hdr.addr1); | 1484 | sta = sta_info_get(local, hdr.addr1); |
1495 | if (sta) | 1485 | if (sta) |
1496 | sta_flags = sta->flags; | 1486 | sta_flags = get_sta_flags(sta); |
1497 | rcu_read_unlock(); | 1487 | rcu_read_unlock(); |
1498 | } | 1488 | } |
1499 | 1489 | ||
1500 | /* receiver is QoS enabled, use a QoS type frame */ | 1490 | /* receiver and we are QoS enabled, use a QoS type frame */ |
1501 | if (sta_flags & WLAN_STA_WME) { | 1491 | if (sta_flags & WLAN_STA_WME && |
1492 | ieee80211_num_regular_queues(&local->hw) >= 4) { | ||
1502 | fc |= IEEE80211_STYPE_QOS_DATA; | 1493 | fc |= IEEE80211_STYPE_QOS_DATA; |
1503 | hdrlen += 2; | 1494 | hdrlen += 2; |
1504 | } | 1495 | } |
@@ -1562,32 +1553,26 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1562 | * build in headroom in __dev_alloc_skb() (linux/skbuff.h) and | 1553 | * build in headroom in __dev_alloc_skb() (linux/skbuff.h) and |
1563 | * alloc_skb() (net/core/skbuff.c) | 1554 | * alloc_skb() (net/core/skbuff.c) |
1564 | */ | 1555 | */ |
1565 | head_need = hdrlen + encaps_len + meshhdrlen + local->tx_headroom; | 1556 | head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); |
1566 | head_need -= skb_headroom(skb); | ||
1567 | 1557 | ||
1568 | /* We are going to modify skb data, so make a copy of it if happens to | 1558 | /* |
1569 | * be cloned. This could happen, e.g., with Linux bridge code passing | 1559 | * So we need to modify the skb header and hence need a copy of |
1570 | * us broadcast frames. */ | 1560 | * that. The head_need variable above doesn't, so far, include |
1561 | * the needed header space that we don't need right away. If we | ||
1562 | * can, then we don't reallocate right now but only after the | ||
1563 | * frame arrives at the master device (if it does...) | ||
1564 | * | ||
1565 | * If we cannot, however, then we will reallocate to include all | ||
1566 | * the ever needed space. Also, if we need to reallocate it anyway, | ||
1567 | * make it big enough for everything we may ever need. | ||
1568 | */ | ||
1571 | 1569 | ||
1572 | if (head_need > 0 || skb_cloned(skb)) { | 1570 | if (head_need > 0 || skb_cloned(skb)) { |
1573 | #if 0 | 1571 | head_need += IEEE80211_ENCRYPT_HEADROOM; |
1574 | printk(KERN_DEBUG "%s: need to reallocate buffer for %d bytes " | 1572 | head_need += local->tx_headroom; |
1575 | "of headroom\n", dev->name, head_need); | 1573 | head_need = max_t(int, 0, head_need); |
1576 | #endif | 1574 | if (ieee80211_skb_resize(local, skb, head_need, true)) |
1577 | |||
1578 | if (skb_cloned(skb)) | ||
1579 | I802_DEBUG_INC(local->tx_expand_skb_head_cloned); | ||
1580 | else | ||
1581 | I802_DEBUG_INC(local->tx_expand_skb_head); | ||
1582 | /* Since we have to reallocate the buffer, make sure that there | ||
1583 | * is enough room for possible WEP IV/ICV and TKIP (8 bytes | ||
1584 | * before payload and 12 after). */ | ||
1585 | if (pskb_expand_head(skb, (head_need > 0 ? head_need + 8 : 8), | ||
1586 | 12, GFP_ATOMIC)) { | ||
1587 | printk(KERN_DEBUG "%s: failed to reallocate TX buffer" | ||
1588 | "\n", dev->name); | ||
1589 | goto fail; | 1575 | goto fail; |
1590 | } | ||
1591 | } | 1576 | } |
1592 | 1577 | ||
1593 | if (encaps_data) { | 1578 | if (encaps_data) { |
@@ -1618,11 +1603,14 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1618 | nh_pos += hdrlen; | 1603 | nh_pos += hdrlen; |
1619 | h_pos += hdrlen; | 1604 | h_pos += hdrlen; |
1620 | 1605 | ||
1621 | pkt_data = (struct ieee80211_tx_packet_data *)skb->cb; | 1606 | info = IEEE80211_SKB_CB(skb); |
1622 | memset(pkt_data, 0, sizeof(struct ieee80211_tx_packet_data)); | 1607 | memset(info, 0, sizeof(*info)); |
1623 | pkt_data->ifindex = dev->ifindex; | 1608 | info->control.ifindex = dev->ifindex; |
1624 | if (ethertype == ETH_P_PAE) | 1609 | if (ethertype == ETH_P_PAE) |
1625 | pkt_data->flags |= IEEE80211_TXPD_EAPOL_FRAME; | 1610 | info->flags |= IEEE80211_TX_CTL_EAPOL_FRAME; |
1611 | |||
1612 | /* Interfaces should always request a status report */ | ||
1613 | info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS; | ||
1626 | 1614 | ||
1627 | skb->dev = local->mdev; | 1615 | skb->dev = local->mdev; |
1628 | dev->stats.tx_packets++; | 1616 | dev->stats.tx_packets++; |
@@ -1647,46 +1635,55 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1647 | return ret; | 1635 | return ret; |
1648 | } | 1636 | } |
1649 | 1637 | ||
1650 | /* helper functions for pending packets for when queues are stopped */ | ||
1651 | 1638 | ||
1639 | /* | ||
1640 | * ieee80211_clear_tx_pending may not be called in a context where | ||
1641 | * it is possible that it packets could come in again. | ||
1642 | */ | ||
1652 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) | 1643 | void ieee80211_clear_tx_pending(struct ieee80211_local *local) |
1653 | { | 1644 | { |
1654 | int i, j; | 1645 | int i, j; |
1655 | struct ieee80211_tx_stored_packet *store; | 1646 | struct ieee80211_tx_stored_packet *store; |
1656 | 1647 | ||
1657 | for (i = 0; i < local->hw.queues; i++) { | 1648 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { |
1658 | if (!__ieee80211_queue_pending(local, i)) | 1649 | if (!test_bit(i, local->queues_pending)) |
1659 | continue; | 1650 | continue; |
1660 | store = &local->pending_packet[i]; | 1651 | store = &local->pending_packet[i]; |
1661 | kfree_skb(store->skb); | 1652 | kfree_skb(store->skb); |
1662 | for (j = 0; j < store->num_extra_frag; j++) | 1653 | for (j = 0; j < store->num_extra_frag; j++) |
1663 | kfree_skb(store->extra_frag[j]); | 1654 | kfree_skb(store->extra_frag[j]); |
1664 | kfree(store->extra_frag); | 1655 | kfree(store->extra_frag); |
1665 | clear_bit(IEEE80211_LINK_STATE_PENDING, &local->state[i]); | 1656 | clear_bit(i, local->queues_pending); |
1666 | } | 1657 | } |
1667 | } | 1658 | } |
1668 | 1659 | ||
1660 | /* | ||
1661 | * Transmit all pending packets. Called from tasklet, locks master device | ||
1662 | * TX lock so that no new packets can come in. | ||
1663 | */ | ||
1669 | void ieee80211_tx_pending(unsigned long data) | 1664 | void ieee80211_tx_pending(unsigned long data) |
1670 | { | 1665 | { |
1671 | struct ieee80211_local *local = (struct ieee80211_local *)data; | 1666 | struct ieee80211_local *local = (struct ieee80211_local *)data; |
1672 | struct net_device *dev = local->mdev; | 1667 | struct net_device *dev = local->mdev; |
1673 | struct ieee80211_tx_stored_packet *store; | 1668 | struct ieee80211_tx_stored_packet *store; |
1674 | struct ieee80211_tx_data tx; | 1669 | struct ieee80211_tx_data tx; |
1675 | int i, ret, reschedule = 0; | 1670 | int i, ret; |
1676 | 1671 | ||
1677 | netif_tx_lock_bh(dev); | 1672 | netif_tx_lock_bh(dev); |
1678 | for (i = 0; i < local->hw.queues; i++) { | 1673 | for (i = 0; i < ieee80211_num_regular_queues(&local->hw); i++) { |
1679 | if (__ieee80211_queue_stopped(local, i)) | 1674 | /* Check that this queue is ok */ |
1675 | if (__netif_subqueue_stopped(local->mdev, i)) | ||
1680 | continue; | 1676 | continue; |
1681 | if (!__ieee80211_queue_pending(local, i)) { | 1677 | |
1682 | reschedule = 1; | 1678 | if (!test_bit(i, local->queues_pending)) { |
1679 | ieee80211_wake_queue(&local->hw, i); | ||
1683 | continue; | 1680 | continue; |
1684 | } | 1681 | } |
1682 | |||
1685 | store = &local->pending_packet[i]; | 1683 | store = &local->pending_packet[i]; |
1686 | tx.control = &store->control; | ||
1687 | tx.extra_frag = store->extra_frag; | 1684 | tx.extra_frag = store->extra_frag; |
1688 | tx.num_extra_frag = store->num_extra_frag; | 1685 | tx.num_extra_frag = store->num_extra_frag; |
1689 | tx.last_frag_rate = store->last_frag_rate; | 1686 | tx.last_frag_rate_idx = store->last_frag_rate_idx; |
1690 | tx.flags = 0; | 1687 | tx.flags = 0; |
1691 | if (store->last_frag_rate_ctrl_probe) | 1688 | if (store->last_frag_rate_ctrl_probe) |
1692 | tx.flags |= IEEE80211_TX_PROBE_LAST_FRAG; | 1689 | tx.flags |= IEEE80211_TX_PROBE_LAST_FRAG; |
@@ -1695,19 +1692,11 @@ void ieee80211_tx_pending(unsigned long data) | |||
1695 | if (ret == IEEE80211_TX_FRAG_AGAIN) | 1692 | if (ret == IEEE80211_TX_FRAG_AGAIN) |
1696 | store->skb = NULL; | 1693 | store->skb = NULL; |
1697 | } else { | 1694 | } else { |
1698 | clear_bit(IEEE80211_LINK_STATE_PENDING, | 1695 | clear_bit(i, local->queues_pending); |
1699 | &local->state[i]); | 1696 | ieee80211_wake_queue(&local->hw, i); |
1700 | reschedule = 1; | ||
1701 | } | 1697 | } |
1702 | } | 1698 | } |
1703 | netif_tx_unlock_bh(dev); | 1699 | netif_tx_unlock_bh(dev); |
1704 | if (reschedule) { | ||
1705 | if (!ieee80211_qdisc_installed(dev)) { | ||
1706 | if (!__ieee80211_queue_stopped(local, 0)) | ||
1707 | netif_wake_queue(dev); | ||
1708 | } else | ||
1709 | netif_schedule(dev); | ||
1710 | } | ||
1711 | } | 1700 | } |
1712 | 1701 | ||
1713 | /* functions for drivers to get certain frames */ | 1702 | /* functions for drivers to get certain frames */ |
@@ -1776,11 +1765,11 @@ static void ieee80211_beacon_add_tim(struct ieee80211_local *local, | |||
1776 | } | 1765 | } |
1777 | 1766 | ||
1778 | struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | 1767 | struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, |
1779 | struct ieee80211_vif *vif, | 1768 | struct ieee80211_vif *vif) |
1780 | struct ieee80211_tx_control *control) | ||
1781 | { | 1769 | { |
1782 | struct ieee80211_local *local = hw_to_local(hw); | 1770 | struct ieee80211_local *local = hw_to_local(hw); |
1783 | struct sk_buff *skb; | 1771 | struct sk_buff *skb; |
1772 | struct ieee80211_tx_info *info; | ||
1784 | struct net_device *bdev; | 1773 | struct net_device *bdev; |
1785 | struct ieee80211_sub_if_data *sdata = NULL; | 1774 | struct ieee80211_sub_if_data *sdata = NULL; |
1786 | struct ieee80211_if_ap *ap = NULL; | 1775 | struct ieee80211_if_ap *ap = NULL; |
@@ -1790,9 +1779,10 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1790 | struct ieee80211_mgmt *mgmt; | 1779 | struct ieee80211_mgmt *mgmt; |
1791 | int *num_beacons; | 1780 | int *num_beacons; |
1792 | bool err = true; | 1781 | bool err = true; |
1782 | enum ieee80211_band band = local->hw.conf.channel->band; | ||
1793 | u8 *pos; | 1783 | u8 *pos; |
1794 | 1784 | ||
1795 | sband = local->hw.wiphy->bands[local->hw.conf.channel->band]; | 1785 | sband = local->hw.wiphy->bands[band]; |
1796 | 1786 | ||
1797 | rcu_read_lock(); | 1787 | rcu_read_lock(); |
1798 | 1788 | ||
@@ -1885,30 +1875,32 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw, | |||
1885 | goto out; | 1875 | goto out; |
1886 | } | 1876 | } |
1887 | 1877 | ||
1888 | if (control) { | 1878 | info = IEEE80211_SKB_CB(skb); |
1889 | rate_control_get_rate(local->mdev, sband, skb, &rsel); | ||
1890 | if (!rsel.rate) { | ||
1891 | if (net_ratelimit()) { | ||
1892 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: " | ||
1893 | "no rate found\n", | ||
1894 | wiphy_name(local->hw.wiphy)); | ||
1895 | } | ||
1896 | dev_kfree_skb(skb); | ||
1897 | skb = NULL; | ||
1898 | goto out; | ||
1899 | } | ||
1900 | 1879 | ||
1901 | control->vif = vif; | 1880 | info->band = band; |
1902 | control->tx_rate = rsel.rate; | 1881 | rate_control_get_rate(local->mdev, sband, skb, &rsel); |
1903 | if (sdata->bss_conf.use_short_preamble && | 1882 | |
1904 | rsel.rate->flags & IEEE80211_RATE_SHORT_PREAMBLE) | 1883 | if (unlikely(rsel.rate_idx < 0)) { |
1905 | control->flags |= IEEE80211_TXCTL_SHORT_PREAMBLE; | 1884 | if (net_ratelimit()) { |
1906 | control->antenna_sel_tx = local->hw.conf.antenna_sel_tx; | 1885 | printk(KERN_DEBUG "%s: ieee80211_beacon_get: " |
1907 | control->flags |= IEEE80211_TXCTL_NO_ACK; | 1886 | "no rate found\n", |
1908 | control->flags |= IEEE80211_TXCTL_DO_NOT_ENCRYPT; | 1887 | wiphy_name(local->hw.wiphy)); |
1909 | control->retry_limit = 1; | 1888 | } |
1910 | control->flags |= IEEE80211_TXCTL_CLEAR_PS_FILT; | 1889 | dev_kfree_skb(skb); |
1890 | skb = NULL; | ||
1891 | goto out; | ||
1911 | } | 1892 | } |
1893 | |||
1894 | info->control.vif = vif; | ||
1895 | info->tx_rate_idx = rsel.rate_idx; | ||
1896 | if (sdata->bss_conf.use_short_preamble && | ||
1897 | sband->bitrates[rsel.rate_idx].flags & IEEE80211_RATE_SHORT_PREAMBLE) | ||
1898 | info->flags |= IEEE80211_TX_CTL_SHORT_PREAMBLE; | ||
1899 | info->antenna_sel_tx = local->hw.conf.antenna_sel_tx; | ||
1900 | info->flags |= IEEE80211_TX_CTL_NO_ACK; | ||
1901 | info->flags |= IEEE80211_TX_CTL_DO_NOT_ENCRYPT; | ||
1902 | info->control.retry_limit = 1; | ||
1903 | info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; | ||
1912 | (*num_beacons)++; | 1904 | (*num_beacons)++; |
1913 | out: | 1905 | out: |
1914 | rcu_read_unlock(); | 1906 | rcu_read_unlock(); |
@@ -1918,7 +1910,7 @@ EXPORT_SYMBOL(ieee80211_beacon_get); | |||
1918 | 1910 | ||
1919 | void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 1911 | void ieee80211_rts_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1920 | const void *frame, size_t frame_len, | 1912 | const void *frame, size_t frame_len, |
1921 | const struct ieee80211_tx_control *frame_txctl, | 1913 | const struct ieee80211_tx_info *frame_txctl, |
1922 | struct ieee80211_rts *rts) | 1914 | struct ieee80211_rts *rts) |
1923 | { | 1915 | { |
1924 | const struct ieee80211_hdr *hdr = frame; | 1916 | const struct ieee80211_hdr *hdr = frame; |
@@ -1935,7 +1927,7 @@ EXPORT_SYMBOL(ieee80211_rts_get); | |||
1935 | 1927 | ||
1936 | void ieee80211_ctstoself_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | 1928 | void ieee80211_ctstoself_get(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
1937 | const void *frame, size_t frame_len, | 1929 | const void *frame, size_t frame_len, |
1938 | const struct ieee80211_tx_control *frame_txctl, | 1930 | const struct ieee80211_tx_info *frame_txctl, |
1939 | struct ieee80211_cts *cts) | 1931 | struct ieee80211_cts *cts) |
1940 | { | 1932 | { |
1941 | const struct ieee80211_hdr *hdr = frame; | 1933 | const struct ieee80211_hdr *hdr = frame; |
@@ -1951,11 +1943,10 @@ EXPORT_SYMBOL(ieee80211_ctstoself_get); | |||
1951 | 1943 | ||
1952 | struct sk_buff * | 1944 | struct sk_buff * |
1953 | ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | 1945 | ieee80211_get_buffered_bc(struct ieee80211_hw *hw, |
1954 | struct ieee80211_vif *vif, | 1946 | struct ieee80211_vif *vif) |
1955 | struct ieee80211_tx_control *control) | ||
1956 | { | 1947 | { |
1957 | struct ieee80211_local *local = hw_to_local(hw); | 1948 | struct ieee80211_local *local = hw_to_local(hw); |
1958 | struct sk_buff *skb; | 1949 | struct sk_buff *skb = NULL; |
1959 | struct sta_info *sta; | 1950 | struct sta_info *sta; |
1960 | ieee80211_tx_handler *handler; | 1951 | ieee80211_tx_handler *handler; |
1961 | struct ieee80211_tx_data tx; | 1952 | struct ieee80211_tx_data tx; |
@@ -1964,10 +1955,11 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
1964 | struct ieee80211_sub_if_data *sdata; | 1955 | struct ieee80211_sub_if_data *sdata; |
1965 | struct ieee80211_if_ap *bss = NULL; | 1956 | struct ieee80211_if_ap *bss = NULL; |
1966 | struct beacon_data *beacon; | 1957 | struct beacon_data *beacon; |
1958 | struct ieee80211_tx_info *info; | ||
1967 | 1959 | ||
1968 | sdata = vif_to_sdata(vif); | 1960 | sdata = vif_to_sdata(vif); |
1969 | bdev = sdata->dev; | 1961 | bdev = sdata->dev; |
1970 | 1962 | bss = &sdata->u.ap; | |
1971 | 1963 | ||
1972 | if (!bss) | 1964 | if (!bss) |
1973 | return NULL; | 1965 | return NULL; |
@@ -1975,19 +1967,16 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
1975 | rcu_read_lock(); | 1967 | rcu_read_lock(); |
1976 | beacon = rcu_dereference(bss->beacon); | 1968 | beacon = rcu_dereference(bss->beacon); |
1977 | 1969 | ||
1978 | if (sdata->vif.type != IEEE80211_IF_TYPE_AP || !beacon || | 1970 | if (sdata->vif.type != IEEE80211_IF_TYPE_AP || !beacon || !beacon->head) |
1979 | !beacon->head) { | 1971 | goto out; |
1980 | rcu_read_unlock(); | ||
1981 | return NULL; | ||
1982 | } | ||
1983 | 1972 | ||
1984 | if (bss->dtim_count != 0) | 1973 | if (bss->dtim_count != 0) |
1985 | return NULL; /* send buffered bc/mc only after DTIM beacon */ | 1974 | goto out; /* send buffered bc/mc only after DTIM beacon */ |
1986 | memset(control, 0, sizeof(*control)); | 1975 | |
1987 | while (1) { | 1976 | while (1) { |
1988 | skb = skb_dequeue(&bss->ps_bc_buf); | 1977 | skb = skb_dequeue(&bss->ps_bc_buf); |
1989 | if (!skb) | 1978 | if (!skb) |
1990 | return NULL; | 1979 | goto out; |
1991 | local->total_ps_buffered--; | 1980 | local->total_ps_buffered--; |
1992 | 1981 | ||
1993 | if (!skb_queue_empty(&bss->ps_bc_buf) && skb->len >= 2) { | 1982 | if (!skb_queue_empty(&bss->ps_bc_buf) && skb->len >= 2) { |
@@ -2000,20 +1989,26 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
2000 | cpu_to_le16(IEEE80211_FCTL_MOREDATA); | 1989 | cpu_to_le16(IEEE80211_FCTL_MOREDATA); |
2001 | } | 1990 | } |
2002 | 1991 | ||
2003 | if (!ieee80211_tx_prepare(&tx, skb, local->mdev, control)) | 1992 | if (!ieee80211_tx_prepare(&tx, skb, local->mdev)) |
2004 | break; | 1993 | break; |
2005 | dev_kfree_skb_any(skb); | 1994 | dev_kfree_skb_any(skb); |
2006 | } | 1995 | } |
1996 | |||
1997 | info = IEEE80211_SKB_CB(skb); | ||
1998 | |||
2007 | sta = tx.sta; | 1999 | sta = tx.sta; |
2008 | tx.flags |= IEEE80211_TX_PS_BUFFERED; | 2000 | tx.flags |= IEEE80211_TX_PS_BUFFERED; |
2009 | tx.channel = local->hw.conf.channel; | 2001 | tx.channel = local->hw.conf.channel; |
2002 | info->band = tx.channel->band; | ||
2010 | 2003 | ||
2011 | for (handler = ieee80211_tx_handlers; *handler != NULL; handler++) { | 2004 | for (handler = ieee80211_tx_handlers; *handler != NULL; handler++) { |
2012 | res = (*handler)(&tx); | 2005 | res = (*handler)(&tx); |
2013 | if (res == TX_DROP || res == TX_QUEUED) | 2006 | if (res == TX_DROP || res == TX_QUEUED) |
2014 | break; | 2007 | break; |
2015 | } | 2008 | } |
2016 | skb = tx.skb; /* handlers are allowed to change skb */ | 2009 | |
2010 | if (WARN_ON(tx.skb != skb)) | ||
2011 | res = TX_DROP; | ||
2017 | 2012 | ||
2018 | if (res == TX_DROP) { | 2013 | if (res == TX_DROP) { |
2019 | I802_DEBUG_INC(local->tx_handlers_drop); | 2014 | I802_DEBUG_INC(local->tx_handlers_drop); |
@@ -2024,6 +2019,7 @@ ieee80211_get_buffered_bc(struct ieee80211_hw *hw, | |||
2024 | skb = NULL; | 2019 | skb = NULL; |
2025 | } | 2020 | } |
2026 | 2021 | ||
2022 | out: | ||
2027 | rcu_read_unlock(); | 2023 | rcu_read_unlock(); |
2028 | 2024 | ||
2029 | return skb; | 2025 | return skb; |