diff options
author | David S. Miller <davem@davemloft.net> | 2011-01-27 19:00:37 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-01-27 19:00:37 -0500 |
commit | 8571a19c4ac140f1a507f3e7eb716892afa27109 (patch) | |
tree | 55ef6a0ab68d6388177d3290a7fd6bc3f12a381f /net/mac80211 | |
parent | aae7c47311659e5150b740d61c4be418198239fa (diff) | |
parent | 8d8d3fdc0d42be0ba75be227465773a54bb48a0b (diff) |
Merge branch 'master' of ssh://master.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/agg-rx.c | 7 | ||||
-rw-r--r-- | net/mac80211/agg-tx.c | 23 | ||||
-rw-r--r-- | net/mac80211/driver-ops.h | 6 | ||||
-rw-r--r-- | net/mac80211/driver-trace.h | 213 | ||||
-rw-r--r-- | net/mac80211/ibss.c | 3 | ||||
-rw-r--r-- | net/mac80211/main.c | 1 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 4 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 16 | ||||
-rw-r--r-- | net/mac80211/rx.c | 27 | ||||
-rw-r--r-- | net/mac80211/scan.c | 3 | ||||
-rw-r--r-- | net/mac80211/sta_info.h | 2 | ||||
-rw-r--r-- | net/mac80211/tx.c | 17 |
12 files changed, 119 insertions, 203 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 227ca82eef7..0c9d0c07eae 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -76,7 +76,7 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | |||
76 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 76 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
77 | 77 | ||
78 | if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP, | 78 | if (drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_STOP, |
79 | &sta->sta, tid, NULL)) | 79 | &sta->sta, tid, NULL, 0)) |
80 | printk(KERN_DEBUG "HW problem - can not stop rx " | 80 | printk(KERN_DEBUG "HW problem - can not stop rx " |
81 | "aggregation for tid %d\n", tid); | 81 | "aggregation for tid %d\n", tid); |
82 | 82 | ||
@@ -232,6 +232,9 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
232 | if (buf_size == 0) | 232 | if (buf_size == 0) |
233 | buf_size = IEEE80211_MAX_AMPDU_BUF; | 233 | buf_size = IEEE80211_MAX_AMPDU_BUF; |
234 | 234 | ||
235 | /* make sure the size doesn't exceed the maximum supported by the hw */ | ||
236 | if (buf_size > local->hw.max_rx_aggregation_subframes) | ||
237 | buf_size = local->hw.max_rx_aggregation_subframes; | ||
235 | 238 | ||
236 | /* examine state machine */ | 239 | /* examine state machine */ |
237 | mutex_lock(&sta->ampdu_mlme.mtx); | 240 | mutex_lock(&sta->ampdu_mlme.mtx); |
@@ -287,7 +290,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
287 | } | 290 | } |
288 | 291 | ||
289 | ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START, | 292 | ret = drv_ampdu_action(local, sta->sdata, IEEE80211_AMPDU_RX_START, |
290 | &sta->sta, tid, &start_seq_num); | 293 | &sta->sta, tid, &start_seq_num, 0); |
291 | #ifdef CONFIG_MAC80211_HT_DEBUG | 294 | #ifdef CONFIG_MAC80211_HT_DEBUG |
292 | printk(KERN_DEBUG "Rx A-MPDU request on tid %d result %d\n", tid, ret); | 295 | printk(KERN_DEBUG "Rx A-MPDU request on tid %d result %d\n", tid, ret); |
293 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 296 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 9cc472c6a6a..63d852cb4ca 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -190,7 +190,7 @@ int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
190 | 190 | ||
191 | ret = drv_ampdu_action(local, sta->sdata, | 191 | ret = drv_ampdu_action(local, sta->sdata, |
192 | IEEE80211_AMPDU_TX_STOP, | 192 | IEEE80211_AMPDU_TX_STOP, |
193 | &sta->sta, tid, NULL); | 193 | &sta->sta, tid, NULL, 0); |
194 | 194 | ||
195 | /* HW shall not deny going back to legacy */ | 195 | /* HW shall not deny going back to legacy */ |
196 | if (WARN_ON(ret)) { | 196 | if (WARN_ON(ret)) { |
@@ -311,7 +311,7 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
311 | start_seq_num = sta->tid_seq[tid] >> 4; | 311 | start_seq_num = sta->tid_seq[tid] >> 4; |
312 | 312 | ||
313 | ret = drv_ampdu_action(local, sdata, IEEE80211_AMPDU_TX_START, | 313 | ret = drv_ampdu_action(local, sdata, IEEE80211_AMPDU_TX_START, |
314 | &sta->sta, tid, &start_seq_num); | 314 | &sta->sta, tid, &start_seq_num, 0); |
315 | if (ret) { | 315 | if (ret) { |
316 | #ifdef CONFIG_MAC80211_HT_DEBUG | 316 | #ifdef CONFIG_MAC80211_HT_DEBUG |
317 | printk(KERN_DEBUG "BA request denied - HW unavailable for" | 317 | printk(KERN_DEBUG "BA request denied - HW unavailable for" |
@@ -342,7 +342,8 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
342 | /* send AddBA request */ | 342 | /* send AddBA request */ |
343 | ieee80211_send_addba_request(sdata, sta->sta.addr, tid, | 343 | ieee80211_send_addba_request(sdata, sta->sta.addr, tid, |
344 | tid_tx->dialog_token, start_seq_num, | 344 | tid_tx->dialog_token, start_seq_num, |
345 | 0x40, tid_tx->timeout); | 345 | local->hw.max_tx_aggregation_subframes, |
346 | tid_tx->timeout); | ||
346 | } | 347 | } |
347 | 348 | ||
348 | int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, | 349 | int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, |
@@ -487,7 +488,8 @@ static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | |||
487 | 488 | ||
488 | drv_ampdu_action(local, sta->sdata, | 489 | drv_ampdu_action(local, sta->sdata, |
489 | IEEE80211_AMPDU_TX_OPERATIONAL, | 490 | IEEE80211_AMPDU_TX_OPERATIONAL, |
490 | &sta->sta, tid, NULL); | 491 | &sta->sta, tid, NULL, |
492 | sta->ampdu_mlme.tid_tx[tid]->buf_size); | ||
491 | 493 | ||
492 | /* | 494 | /* |
493 | * synchronize with TX path, while splicing the TX path | 495 | * synchronize with TX path, while splicing the TX path |
@@ -742,9 +744,11 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
742 | { | 744 | { |
743 | struct tid_ampdu_tx *tid_tx; | 745 | struct tid_ampdu_tx *tid_tx; |
744 | u16 capab, tid; | 746 | u16 capab, tid; |
747 | u8 buf_size; | ||
745 | 748 | ||
746 | capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); | 749 | capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); |
747 | tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; | 750 | tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; |
751 | buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6; | ||
748 | 752 | ||
749 | mutex_lock(&sta->ampdu_mlme.mtx); | 753 | mutex_lock(&sta->ampdu_mlme.mtx); |
750 | 754 | ||
@@ -767,12 +771,23 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, | |||
767 | 771 | ||
768 | if (le16_to_cpu(mgmt->u.action.u.addba_resp.status) | 772 | if (le16_to_cpu(mgmt->u.action.u.addba_resp.status) |
769 | == WLAN_STATUS_SUCCESS) { | 773 | == WLAN_STATUS_SUCCESS) { |
774 | /* | ||
775 | * IEEE 802.11-2007 7.3.1.14: | ||
776 | * In an ADDBA Response frame, when the Status Code field | ||
777 | * is set to 0, the Buffer Size subfield is set to a value | ||
778 | * of at least 1. | ||
779 | */ | ||
780 | if (!buf_size) | ||
781 | goto out; | ||
782 | |||
770 | if (test_and_set_bit(HT_AGG_STATE_RESPONSE_RECEIVED, | 783 | if (test_and_set_bit(HT_AGG_STATE_RESPONSE_RECEIVED, |
771 | &tid_tx->state)) { | 784 | &tid_tx->state)) { |
772 | /* ignore duplicate response */ | 785 | /* ignore duplicate response */ |
773 | goto out; | 786 | goto out; |
774 | } | 787 | } |
775 | 788 | ||
789 | tid_tx->buf_size = buf_size; | ||
790 | |||
776 | if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state)) | 791 | if (test_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state)) |
777 | ieee80211_agg_tx_operational(local, sta, tid); | 792 | ieee80211_agg_tx_operational(local, sta, tid); |
778 | 793 | ||
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 98d589960a4..78af32d4bc5 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -382,17 +382,17 @@ static inline int drv_ampdu_action(struct ieee80211_local *local, | |||
382 | struct ieee80211_sub_if_data *sdata, | 382 | struct ieee80211_sub_if_data *sdata, |
383 | enum ieee80211_ampdu_mlme_action action, | 383 | enum ieee80211_ampdu_mlme_action action, |
384 | struct ieee80211_sta *sta, u16 tid, | 384 | struct ieee80211_sta *sta, u16 tid, |
385 | u16 *ssn) | 385 | u16 *ssn, u8 buf_size) |
386 | { | 386 | { |
387 | int ret = -EOPNOTSUPP; | 387 | int ret = -EOPNOTSUPP; |
388 | 388 | ||
389 | might_sleep(); | 389 | might_sleep(); |
390 | 390 | ||
391 | trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn); | 391 | trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size); |
392 | 392 | ||
393 | if (local->ops->ampdu_action) | 393 | if (local->ops->ampdu_action) |
394 | ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, | 394 | ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, |
395 | sta, tid, ssn); | 395 | sta, tid, ssn, buf_size); |
396 | 396 | ||
397 | trace_drv_return_int(local, ret); | 397 | trace_drv_return_int(local, ret); |
398 | 398 | ||
diff --git a/net/mac80211/driver-trace.h b/net/mac80211/driver-trace.h index 49c84218b2f..e5cce19a7d6 100644 --- a/net/mac80211/driver-trace.h +++ b/net/mac80211/driver-trace.h | |||
@@ -9,6 +9,11 @@ | |||
9 | #undef TRACE_EVENT | 9 | #undef TRACE_EVENT |
10 | #define TRACE_EVENT(name, proto, ...) \ | 10 | #define TRACE_EVENT(name, proto, ...) \ |
11 | static inline void trace_ ## name(proto) {} | 11 | static inline void trace_ ## name(proto) {} |
12 | #undef DECLARE_EVENT_CLASS | ||
13 | #define DECLARE_EVENT_CLASS(...) | ||
14 | #undef DEFINE_EVENT | ||
15 | #define DEFINE_EVENT(evt_class, name, proto, ...) \ | ||
16 | static inline void trace_ ## name(proto) {} | ||
12 | #endif | 17 | #endif |
13 | 18 | ||
14 | #undef TRACE_SYSTEM | 19 | #undef TRACE_SYSTEM |
@@ -38,7 +43,7 @@ static inline void trace_ ## name(proto) {} | |||
38 | * Tracing for driver callbacks. | 43 | * Tracing for driver callbacks. |
39 | */ | 44 | */ |
40 | 45 | ||
41 | TRACE_EVENT(drv_return_void, | 46 | DECLARE_EVENT_CLASS(local_only_evt, |
42 | TP_PROTO(struct ieee80211_local *local), | 47 | TP_PROTO(struct ieee80211_local *local), |
43 | TP_ARGS(local), | 48 | TP_ARGS(local), |
44 | TP_STRUCT__entry( | 49 | TP_STRUCT__entry( |
@@ -50,6 +55,11 @@ TRACE_EVENT(drv_return_void, | |||
50 | TP_printk(LOCAL_PR_FMT, LOCAL_PR_ARG) | 55 | TP_printk(LOCAL_PR_FMT, LOCAL_PR_ARG) |
51 | ); | 56 | ); |
52 | 57 | ||
58 | DEFINE_EVENT(local_only_evt, drv_return_void, | ||
59 | TP_PROTO(struct ieee80211_local *local), | ||
60 | TP_ARGS(local) | ||
61 | ); | ||
62 | |||
53 | TRACE_EVENT(drv_return_int, | 63 | TRACE_EVENT(drv_return_int, |
54 | TP_PROTO(struct ieee80211_local *local, int ret), | 64 | TP_PROTO(struct ieee80211_local *local, int ret), |
55 | TP_ARGS(local, ret), | 65 | TP_ARGS(local, ret), |
@@ -78,40 +88,14 @@ TRACE_EVENT(drv_return_u64, | |||
78 | TP_printk(LOCAL_PR_FMT " - %llu", LOCAL_PR_ARG, __entry->ret) | 88 | TP_printk(LOCAL_PR_FMT " - %llu", LOCAL_PR_ARG, __entry->ret) |
79 | ); | 89 | ); |
80 | 90 | ||
81 | TRACE_EVENT(drv_start, | 91 | DEFINE_EVENT(local_only_evt, drv_start, |
82 | TP_PROTO(struct ieee80211_local *local), | 92 | TP_PROTO(struct ieee80211_local *local), |
83 | 93 | TP_ARGS(local) | |
84 | TP_ARGS(local), | ||
85 | |||
86 | TP_STRUCT__entry( | ||
87 | LOCAL_ENTRY | ||
88 | ), | ||
89 | |||
90 | TP_fast_assign( | ||
91 | LOCAL_ASSIGN; | ||
92 | ), | ||
93 | |||
94 | TP_printk( | ||
95 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
96 | ) | ||
97 | ); | 94 | ); |
98 | 95 | ||
99 | TRACE_EVENT(drv_stop, | 96 | DEFINE_EVENT(local_only_evt, drv_stop, |
100 | TP_PROTO(struct ieee80211_local *local), | 97 | TP_PROTO(struct ieee80211_local *local), |
101 | 98 | TP_ARGS(local) | |
102 | TP_ARGS(local), | ||
103 | |||
104 | TP_STRUCT__entry( | ||
105 | LOCAL_ENTRY | ||
106 | ), | ||
107 | |||
108 | TP_fast_assign( | ||
109 | LOCAL_ASSIGN; | ||
110 | ), | ||
111 | |||
112 | TP_printk( | ||
113 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
114 | ) | ||
115 | ); | 99 | ); |
116 | 100 | ||
117 | TRACE_EVENT(drv_add_interface, | 101 | TRACE_EVENT(drv_add_interface, |
@@ -439,40 +423,14 @@ TRACE_EVENT(drv_hw_scan, | |||
439 | ) | 423 | ) |
440 | ); | 424 | ); |
441 | 425 | ||
442 | TRACE_EVENT(drv_sw_scan_start, | 426 | DEFINE_EVENT(local_only_evt, drv_sw_scan_start, |
443 | TP_PROTO(struct ieee80211_local *local), | 427 | TP_PROTO(struct ieee80211_local *local), |
444 | 428 | TP_ARGS(local) | |
445 | TP_ARGS(local), | ||
446 | |||
447 | TP_STRUCT__entry( | ||
448 | LOCAL_ENTRY | ||
449 | ), | ||
450 | |||
451 | TP_fast_assign( | ||
452 | LOCAL_ASSIGN; | ||
453 | ), | ||
454 | |||
455 | TP_printk( | ||
456 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
457 | ) | ||
458 | ); | 429 | ); |
459 | 430 | ||
460 | TRACE_EVENT(drv_sw_scan_complete, | 431 | DEFINE_EVENT(local_only_evt, drv_sw_scan_complete, |
461 | TP_PROTO(struct ieee80211_local *local), | 432 | TP_PROTO(struct ieee80211_local *local), |
462 | 433 | TP_ARGS(local) | |
463 | TP_ARGS(local), | ||
464 | |||
465 | TP_STRUCT__entry( | ||
466 | LOCAL_ENTRY | ||
467 | ), | ||
468 | |||
469 | TP_fast_assign( | ||
470 | LOCAL_ASSIGN; | ||
471 | ), | ||
472 | |||
473 | TP_printk( | ||
474 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
475 | ) | ||
476 | ); | 434 | ); |
477 | 435 | ||
478 | TRACE_EVENT(drv_get_stats, | 436 | TRACE_EVENT(drv_get_stats, |
@@ -702,23 +660,9 @@ TRACE_EVENT(drv_conf_tx, | |||
702 | ) | 660 | ) |
703 | ); | 661 | ); |
704 | 662 | ||
705 | TRACE_EVENT(drv_get_tsf, | 663 | DEFINE_EVENT(local_only_evt, drv_get_tsf, |
706 | TP_PROTO(struct ieee80211_local *local), | 664 | TP_PROTO(struct ieee80211_local *local), |
707 | 665 | TP_ARGS(local) | |
708 | TP_ARGS(local), | ||
709 | |||
710 | TP_STRUCT__entry( | ||
711 | LOCAL_ENTRY | ||
712 | ), | ||
713 | |||
714 | TP_fast_assign( | ||
715 | LOCAL_ASSIGN; | ||
716 | ), | ||
717 | |||
718 | TP_printk( | ||
719 | LOCAL_PR_FMT, | ||
720 | LOCAL_PR_ARG | ||
721 | ) | ||
722 | ); | 666 | ); |
723 | 667 | ||
724 | TRACE_EVENT(drv_set_tsf, | 668 | TRACE_EVENT(drv_set_tsf, |
@@ -742,41 +686,14 @@ TRACE_EVENT(drv_set_tsf, | |||
742 | ) | 686 | ) |
743 | ); | 687 | ); |
744 | 688 | ||
745 | TRACE_EVENT(drv_reset_tsf, | 689 | DEFINE_EVENT(local_only_evt, drv_reset_tsf, |
746 | TP_PROTO(struct ieee80211_local *local), | 690 | TP_PROTO(struct ieee80211_local *local), |
747 | 691 | TP_ARGS(local) | |
748 | TP_ARGS(local), | ||
749 | |||
750 | TP_STRUCT__entry( | ||
751 | LOCAL_ENTRY | ||
752 | ), | ||
753 | |||
754 | TP_fast_assign( | ||
755 | LOCAL_ASSIGN; | ||
756 | ), | ||
757 | |||
758 | TP_printk( | ||
759 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
760 | ) | ||
761 | ); | 692 | ); |
762 | 693 | ||
763 | TRACE_EVENT(drv_tx_last_beacon, | 694 | DEFINE_EVENT(local_only_evt, drv_tx_last_beacon, |
764 | TP_PROTO(struct ieee80211_local *local), | 695 | TP_PROTO(struct ieee80211_local *local), |
765 | 696 | TP_ARGS(local) | |
766 | TP_ARGS(local), | ||
767 | |||
768 | TP_STRUCT__entry( | ||
769 | LOCAL_ENTRY | ||
770 | ), | ||
771 | |||
772 | TP_fast_assign( | ||
773 | LOCAL_ASSIGN; | ||
774 | ), | ||
775 | |||
776 | TP_printk( | ||
777 | LOCAL_PR_FMT, | ||
778 | LOCAL_PR_ARG | ||
779 | ) | ||
780 | ); | 697 | ); |
781 | 698 | ||
782 | TRACE_EVENT(drv_ampdu_action, | 699 | TRACE_EVENT(drv_ampdu_action, |
@@ -784,9 +701,9 @@ TRACE_EVENT(drv_ampdu_action, | |||
784 | struct ieee80211_sub_if_data *sdata, | 701 | struct ieee80211_sub_if_data *sdata, |
785 | enum ieee80211_ampdu_mlme_action action, | 702 | enum ieee80211_ampdu_mlme_action action, |
786 | struct ieee80211_sta *sta, u16 tid, | 703 | struct ieee80211_sta *sta, u16 tid, |
787 | u16 *ssn), | 704 | u16 *ssn, u8 buf_size), |
788 | 705 | ||
789 | TP_ARGS(local, sdata, action, sta, tid, ssn), | 706 | TP_ARGS(local, sdata, action, sta, tid, ssn, buf_size), |
790 | 707 | ||
791 | TP_STRUCT__entry( | 708 | TP_STRUCT__entry( |
792 | LOCAL_ENTRY | 709 | LOCAL_ENTRY |
@@ -794,6 +711,7 @@ TRACE_EVENT(drv_ampdu_action, | |||
794 | __field(u32, action) | 711 | __field(u32, action) |
795 | __field(u16, tid) | 712 | __field(u16, tid) |
796 | __field(u16, ssn) | 713 | __field(u16, ssn) |
714 | __field(u8, buf_size) | ||
797 | VIF_ENTRY | 715 | VIF_ENTRY |
798 | ), | 716 | ), |
799 | 717 | ||
@@ -804,11 +722,13 @@ TRACE_EVENT(drv_ampdu_action, | |||
804 | __entry->action = action; | 722 | __entry->action = action; |
805 | __entry->tid = tid; | 723 | __entry->tid = tid; |
806 | __entry->ssn = ssn ? *ssn : 0; | 724 | __entry->ssn = ssn ? *ssn : 0; |
725 | __entry->buf_size = buf_size; | ||
807 | ), | 726 | ), |
808 | 727 | ||
809 | TP_printk( | 728 | TP_printk( |
810 | LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d", | 729 | LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT " action:%d tid:%d buf:%d", |
811 | LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action, __entry->tid | 730 | LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->action, |
731 | __entry->tid, __entry->buf_size | ||
812 | ) | 732 | ) |
813 | ); | 733 | ); |
814 | 734 | ||
@@ -959,22 +879,9 @@ TRACE_EVENT(drv_remain_on_channel, | |||
959 | ) | 879 | ) |
960 | ); | 880 | ); |
961 | 881 | ||
962 | TRACE_EVENT(drv_cancel_remain_on_channel, | 882 | DEFINE_EVENT(local_only_evt, drv_cancel_remain_on_channel, |
963 | TP_PROTO(struct ieee80211_local *local), | 883 | TP_PROTO(struct ieee80211_local *local), |
964 | 884 | TP_ARGS(local) | |
965 | TP_ARGS(local), | ||
966 | |||
967 | TP_STRUCT__entry( | ||
968 | LOCAL_ENTRY | ||
969 | ), | ||
970 | |||
971 | TP_fast_assign( | ||
972 | LOCAL_ASSIGN; | ||
973 | ), | ||
974 | |||
975 | TP_printk( | ||
976 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
977 | ) | ||
978 | ); | 885 | ); |
979 | 886 | ||
980 | /* | 887 | /* |
@@ -1069,23 +976,9 @@ TRACE_EVENT(api_stop_tx_ba_cb, | |||
1069 | ) | 976 | ) |
1070 | ); | 977 | ); |
1071 | 978 | ||
1072 | TRACE_EVENT(api_restart_hw, | 979 | DEFINE_EVENT(local_only_evt, api_restart_hw, |
1073 | TP_PROTO(struct ieee80211_local *local), | 980 | TP_PROTO(struct ieee80211_local *local), |
1074 | 981 | TP_ARGS(local) | |
1075 | TP_ARGS(local), | ||
1076 | |||
1077 | TP_STRUCT__entry( | ||
1078 | LOCAL_ENTRY | ||
1079 | ), | ||
1080 | |||
1081 | TP_fast_assign( | ||
1082 | LOCAL_ASSIGN; | ||
1083 | ), | ||
1084 | |||
1085 | TP_printk( | ||
1086 | LOCAL_PR_FMT, | ||
1087 | LOCAL_PR_ARG | ||
1088 | ) | ||
1089 | ); | 982 | ); |
1090 | 983 | ||
1091 | TRACE_EVENT(api_beacon_loss, | 984 | TRACE_EVENT(api_beacon_loss, |
@@ -1214,40 +1107,14 @@ TRACE_EVENT(api_chswitch_done, | |||
1214 | ) | 1107 | ) |
1215 | ); | 1108 | ); |
1216 | 1109 | ||
1217 | TRACE_EVENT(api_ready_on_channel, | 1110 | DEFINE_EVENT(local_only_evt, api_ready_on_channel, |
1218 | TP_PROTO(struct ieee80211_local *local), | 1111 | TP_PROTO(struct ieee80211_local *local), |
1219 | 1112 | TP_ARGS(local) | |
1220 | TP_ARGS(local), | ||
1221 | |||
1222 | TP_STRUCT__entry( | ||
1223 | LOCAL_ENTRY | ||
1224 | ), | ||
1225 | |||
1226 | TP_fast_assign( | ||
1227 | LOCAL_ASSIGN; | ||
1228 | ), | ||
1229 | |||
1230 | TP_printk( | ||
1231 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
1232 | ) | ||
1233 | ); | 1113 | ); |
1234 | 1114 | ||
1235 | TRACE_EVENT(api_remain_on_channel_expired, | 1115 | DEFINE_EVENT(local_only_evt, api_remain_on_channel_expired, |
1236 | TP_PROTO(struct ieee80211_local *local), | 1116 | TP_PROTO(struct ieee80211_local *local), |
1237 | 1117 | TP_ARGS(local) | |
1238 | TP_ARGS(local), | ||
1239 | |||
1240 | TP_STRUCT__entry( | ||
1241 | LOCAL_ENTRY | ||
1242 | ), | ||
1243 | |||
1244 | TP_fast_assign( | ||
1245 | LOCAL_ASSIGN; | ||
1246 | ), | ||
1247 | |||
1248 | TP_printk( | ||
1249 | LOCAL_PR_FMT, LOCAL_PR_ARG | ||
1250 | ) | ||
1251 | ); | 1118 | ); |
1252 | 1119 | ||
1253 | /* | 1120 | /* |
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index 53c7077ffd4..775fb63471c 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -270,7 +270,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
270 | enum ieee80211_band band = rx_status->band; | 270 | enum ieee80211_band band = rx_status->band; |
271 | 271 | ||
272 | if (elems->ds_params && elems->ds_params_len == 1) | 272 | if (elems->ds_params && elems->ds_params_len == 1) |
273 | freq = ieee80211_channel_to_frequency(elems->ds_params[0]); | 273 | freq = ieee80211_channel_to_frequency(elems->ds_params[0], |
274 | band); | ||
274 | else | 275 | else |
275 | freq = rx_status->freq; | 276 | freq = rx_status->freq; |
276 | 277 | ||
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index a46ff06d7cb..09a27449f3f 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -554,6 +554,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(size_t priv_data_len, | |||
554 | local->hw.queues = 1; | 554 | local->hw.queues = 1; |
555 | local->hw.max_rates = 1; | 555 | local->hw.max_rates = 1; |
556 | local->hw.max_report_rates = 0; | 556 | local->hw.max_report_rates = 0; |
557 | local->hw.max_rx_aggregation_subframes = IEEE80211_MAX_AMPDU_BUF; | ||
557 | local->hw.conf.long_frame_max_tx_count = wiphy->retry_long; | 558 | local->hw.conf.long_frame_max_tx_count = wiphy->retry_long; |
558 | local->hw.conf.short_frame_max_tx_count = wiphy->retry_short; | 559 | local->hw.conf.short_frame_max_tx_count = wiphy->retry_short; |
559 | local->user_power_level = -1; | 560 | local->user_power_level = -1; |
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index ca3af4685b0..2a57cc02c61 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -574,7 +574,7 @@ static void ieee80211_mesh_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | |||
574 | &elems); | 574 | &elems); |
575 | 575 | ||
576 | if (elems.ds_params && elems.ds_params_len == 1) | 576 | if (elems.ds_params && elems.ds_params_len == 1) |
577 | freq = ieee80211_channel_to_frequency(elems.ds_params[0]); | 577 | freq = ieee80211_channel_to_frequency(elems.ds_params[0], band); |
578 | else | 578 | else |
579 | freq = rx_status->freq; | 579 | freq = rx_status->freq; |
580 | 580 | ||
@@ -645,7 +645,7 @@ void ieee80211_mesh_work(struct ieee80211_sub_if_data *sdata) | |||
645 | if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags)) | 645 | if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags)) |
646 | mesh_mpath_table_grow(); | 646 | mesh_mpath_table_grow(); |
647 | 647 | ||
648 | if (test_and_clear_bit(MESH_WORK_GROW_MPATH_TABLE, &ifmsh->wrkq_flags)) | 648 | if (test_and_clear_bit(MESH_WORK_GROW_MPP_TABLE, &ifmsh->wrkq_flags)) |
649 | mesh_mpp_table_grow(); | 649 | mesh_mpp_table_grow(); |
650 | 650 | ||
651 | if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags)) | 651 | if (test_and_clear_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags)) |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 45fbb9e3374..32210695b8b 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -176,7 +176,7 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata, | |||
176 | 176 | ||
177 | /* check that channel matches the right operating channel */ | 177 | /* check that channel matches the right operating channel */ |
178 | if (local->hw.conf.channel->center_freq != | 178 | if (local->hw.conf.channel->center_freq != |
179 | ieee80211_channel_to_frequency(hti->control_chan)) | 179 | ieee80211_channel_to_frequency(hti->control_chan, sband->band)) |
180 | enable_ht = false; | 180 | enable_ht = false; |
181 | 181 | ||
182 | if (enable_ht) { | 182 | if (enable_ht) { |
@@ -429,7 +429,8 @@ void ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, | |||
429 | container_of((void *)bss, struct cfg80211_bss, priv); | 429 | container_of((void *)bss, struct cfg80211_bss, priv); |
430 | struct ieee80211_channel *new_ch; | 430 | struct ieee80211_channel *new_ch; |
431 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 431 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
432 | int new_freq = ieee80211_channel_to_frequency(sw_elem->new_ch_num); | 432 | int new_freq = ieee80211_channel_to_frequency(sw_elem->new_ch_num, |
433 | cbss->channel->band); | ||
433 | 434 | ||
434 | ASSERT_MGD_MTX(ifmgd); | 435 | ASSERT_MGD_MTX(ifmgd); |
435 | 436 | ||
@@ -1519,7 +1520,8 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
1519 | } | 1520 | } |
1520 | 1521 | ||
1521 | if (elems->ds_params && elems->ds_params_len == 1) | 1522 | if (elems->ds_params && elems->ds_params_len == 1) |
1522 | freq = ieee80211_channel_to_frequency(elems->ds_params[0]); | 1523 | freq = ieee80211_channel_to_frequency(elems->ds_params[0], |
1524 | rx_status->band); | ||
1523 | else | 1525 | else |
1524 | freq = rx_status->freq; | 1526 | freq = rx_status->freq; |
1525 | 1527 | ||
@@ -1972,9 +1974,9 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) | |||
1972 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 1974 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
1973 | wiphy_debug(local->hw.wiphy, | 1975 | wiphy_debug(local->hw.wiphy, |
1974 | "%s: No ack for nullfunc frame to" | 1976 | "%s: No ack for nullfunc frame to" |
1975 | " AP %pM, try %d\n", | 1977 | " AP %pM, try %d/%i\n", |
1976 | sdata->name, bssid, | 1978 | sdata->name, bssid, |
1977 | ifmgd->probe_send_count); | 1979 | ifmgd->probe_send_count, max_tries); |
1978 | #endif | 1980 | #endif |
1979 | ieee80211_mgd_probe_ap_send(sdata); | 1981 | ieee80211_mgd_probe_ap_send(sdata); |
1980 | } else { | 1982 | } else { |
@@ -2001,10 +2003,10 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata) | |||
2001 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 2003 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
2002 | wiphy_debug(local->hw.wiphy, | 2004 | wiphy_debug(local->hw.wiphy, |
2003 | "%s: No probe response from AP %pM" | 2005 | "%s: No probe response from AP %pM" |
2004 | " after %dms, try %d\n", | 2006 | " after %dms, try %d/%i\n", |
2005 | sdata->name, | 2007 | sdata->name, |
2006 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ, | 2008 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ, |
2007 | ifmgd->probe_send_count); | 2009 | ifmgd->probe_send_count, max_tries); |
2008 | #endif | 2010 | #endif |
2009 | ieee80211_mgd_probe_ap_send(sdata); | 2011 | ieee80211_mgd_probe_ap_send(sdata); |
2010 | } else { | 2012 | } else { |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index a6701ed87f0..f36d70f5b06 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1556,17 +1556,36 @@ __ieee80211_data_to_8023(struct ieee80211_rx_data *rx) | |||
1556 | { | 1556 | { |
1557 | struct ieee80211_sub_if_data *sdata = rx->sdata; | 1557 | struct ieee80211_sub_if_data *sdata = rx->sdata; |
1558 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; | 1558 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data; |
1559 | bool check_port_control = false; | ||
1560 | struct ethhdr *ehdr; | ||
1561 | int ret; | ||
1559 | 1562 | ||
1560 | if (ieee80211_has_a4(hdr->frame_control) && | 1563 | if (ieee80211_has_a4(hdr->frame_control) && |
1561 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta) | 1564 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN && !sdata->u.vlan.sta) |
1562 | return -1; | 1565 | return -1; |
1563 | 1566 | ||
1567 | if (sdata->vif.type == NL80211_IFTYPE_STATION && | ||
1568 | !!sdata->u.mgd.use_4addr != !!ieee80211_has_a4(hdr->frame_control)) { | ||
1569 | |||
1570 | if (!sdata->u.mgd.use_4addr) | ||
1571 | return -1; | ||
1572 | else | ||
1573 | check_port_control = true; | ||
1574 | } | ||
1575 | |||
1564 | if (is_multicast_ether_addr(hdr->addr1) && | 1576 | if (is_multicast_ether_addr(hdr->addr1) && |
1565 | ((sdata->vif.type == NL80211_IFTYPE_AP_VLAN && sdata->u.vlan.sta) || | 1577 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN && sdata->u.vlan.sta) |
1566 | (sdata->vif.type == NL80211_IFTYPE_STATION && sdata->u.mgd.use_4addr))) | ||
1567 | return -1; | 1578 | return -1; |
1568 | 1579 | ||
1569 | return ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); | 1580 | ret = ieee80211_data_to_8023(rx->skb, sdata->vif.addr, sdata->vif.type); |
1581 | if (ret < 0 || !check_port_control) | ||
1582 | return ret; | ||
1583 | |||
1584 | ehdr = (struct ethhdr *) rx->skb->data; | ||
1585 | if (ehdr->h_proto != rx->sdata->control_port_protocol) | ||
1586 | return -1; | ||
1587 | |||
1588 | return 0; | ||
1570 | } | 1589 | } |
1571 | 1590 | ||
1572 | /* | 1591 | /* |
@@ -2692,7 +2711,7 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx, | |||
2692 | if (!skb) { | 2711 | if (!skb) { |
2693 | if (net_ratelimit()) | 2712 | if (net_ratelimit()) |
2694 | wiphy_debug(local->hw.wiphy, | 2713 | wiphy_debug(local->hw.wiphy, |
2695 | "failed to copy multicast frame for %s\n", | 2714 | "failed to copy skb for %s\n", |
2696 | sdata->name); | 2715 | sdata->name); |
2697 | return true; | 2716 | return true; |
2698 | } | 2717 | } |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index fb274db77e3..1ef73be76b2 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -196,7 +196,8 @@ ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) | |||
196 | ieee802_11_parse_elems(elements, skb->len - baselen, &elems); | 196 | ieee802_11_parse_elems(elements, skb->len - baselen, &elems); |
197 | 197 | ||
198 | if (elems.ds_params && elems.ds_params_len == 1) | 198 | if (elems.ds_params && elems.ds_params_len == 1) |
199 | freq = ieee80211_channel_to_frequency(elems.ds_params[0]); | 199 | freq = ieee80211_channel_to_frequency(elems.ds_params[0], |
200 | rx_status->band); | ||
200 | else | 201 | else |
201 | freq = rx_status->freq; | 202 | freq = rx_status->freq; |
202 | 203 | ||
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index bbdd2a86a94..ca0b69060ef 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -82,6 +82,7 @@ enum ieee80211_sta_info_flags { | |||
82 | * @state: session state (see above) | 82 | * @state: session state (see above) |
83 | * @stop_initiator: initiator of a session stop | 83 | * @stop_initiator: initiator of a session stop |
84 | * @tx_stop: TX DelBA frame when stopping | 84 | * @tx_stop: TX DelBA frame when stopping |
85 | * @buf_size: reorder buffer size at receiver | ||
85 | * | 86 | * |
86 | * This structure's lifetime is managed by RCU, assignments to | 87 | * This structure's lifetime is managed by RCU, assignments to |
87 | * the array holding it must hold the aggregation mutex. | 88 | * the array holding it must hold the aggregation mutex. |
@@ -101,6 +102,7 @@ struct tid_ampdu_tx { | |||
101 | u8 dialog_token; | 102 | u8 dialog_token; |
102 | u8 stop_initiator; | 103 | u8 stop_initiator; |
103 | bool tx_stop; | 104 | bool tx_stop; |
105 | u8 buf_size; | ||
104 | }; | 106 | }; |
105 | 107 | ||
106 | /** | 108 | /** |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index b64b42bc774..ffc67491c38 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1750,7 +1750,7 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1750 | __le16 fc; | 1750 | __le16 fc; |
1751 | struct ieee80211_hdr hdr; | 1751 | struct ieee80211_hdr hdr; |
1752 | struct ieee80211s_hdr mesh_hdr __maybe_unused; | 1752 | struct ieee80211s_hdr mesh_hdr __maybe_unused; |
1753 | struct mesh_path *mppath = NULL; | 1753 | struct mesh_path __maybe_unused *mppath = NULL; |
1754 | const u8 *encaps_data; | 1754 | const u8 *encaps_data; |
1755 | int encaps_len, skip_header_bytes; | 1755 | int encaps_len, skip_header_bytes; |
1756 | int nh_pos, h_pos; | 1756 | int nh_pos, h_pos; |
@@ -1815,19 +1815,19 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
1815 | mppath = mpp_path_lookup(skb->data, sdata); | 1815 | mppath = mpp_path_lookup(skb->data, sdata); |
1816 | 1816 | ||
1817 | /* | 1817 | /* |
1818 | * Do not use address extension, if it is a packet from | 1818 | * Use address extension if it is a packet from |
1819 | * the same interface and the destination is not being | 1819 | * another interface or if we know the destination |
1820 | * proxied by any other mest point. | 1820 | * is being proxied by a portal (i.e. portal address |
1821 | * differs from proxied address) | ||
1821 | */ | 1822 | */ |
1822 | if (compare_ether_addr(sdata->vif.addr, | 1823 | if (compare_ether_addr(sdata->vif.addr, |
1823 | skb->data + ETH_ALEN) == 0 && | 1824 | skb->data + ETH_ALEN) == 0 && |
1824 | (!mppath || !compare_ether_addr(mppath->mpp, skb->data))) { | 1825 | !(mppath && compare_ether_addr(mppath->mpp, skb->data))) { |
1825 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, | 1826 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, |
1826 | skb->data, skb->data + ETH_ALEN); | 1827 | skb->data, skb->data + ETH_ALEN); |
1827 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, | 1828 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, |
1828 | sdata, NULL, NULL); | 1829 | sdata, NULL, NULL); |
1829 | } else { | 1830 | } else { |
1830 | /* packet from other interface */ | ||
1831 | int is_mesh_mcast = 1; | 1831 | int is_mesh_mcast = 1; |
1832 | const u8 *mesh_da; | 1832 | const u8 *mesh_da; |
1833 | 1833 | ||
@@ -2302,6 +2302,11 @@ struct sk_buff *ieee80211_beacon_get_tim(struct ieee80211_hw *hw, | |||
2302 | struct ieee80211_mgmt *mgmt; | 2302 | struct ieee80211_mgmt *mgmt; |
2303 | u8 *pos; | 2303 | u8 *pos; |
2304 | 2304 | ||
2305 | #ifdef CONFIG_MAC80211_MESH | ||
2306 | if (!sdata->u.mesh.mesh_id_len) | ||
2307 | goto out; | ||
2308 | #endif | ||
2309 | |||
2305 | /* headroom, head length, tail length and maximum TIM length */ | 2310 | /* headroom, head length, tail length and maximum TIM length */ |
2306 | skb = dev_alloc_skb(local->tx_headroom + 400 + | 2311 | skb = dev_alloc_skb(local->tx_headroom + 400 + |
2307 | sdata->u.mesh.vendor_ie_len); | 2312 | sdata->u.mesh.vendor_ie_len); |