diff options
Diffstat (limited to 'net/mac80211/ieee80211_i.h')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 133 |
1 files changed, 105 insertions, 28 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 65e0ed6c2975..b80c38689927 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -50,12 +50,6 @@ struct ieee80211_local; | |||
50 | * increased memory use (about 2 kB of RAM per entry). */ | 50 | * increased memory use (about 2 kB of RAM per entry). */ |
51 | #define IEEE80211_FRAGMENT_MAX 4 | 51 | #define IEEE80211_FRAGMENT_MAX 4 |
52 | 52 | ||
53 | /* | ||
54 | * Time after which we ignore scan results and no longer report/use | ||
55 | * them in any way. | ||
56 | */ | ||
57 | #define IEEE80211_SCAN_RESULT_EXPIRE (10 * HZ) | ||
58 | |||
59 | #define TU_TO_EXP_TIME(x) (jiffies + usecs_to_jiffies((x) * 1024)) | 53 | #define TU_TO_EXP_TIME(x) (jiffies + usecs_to_jiffies((x) * 1024)) |
60 | 54 | ||
61 | #define IEEE80211_DEFAULT_UAPSD_QUEUES \ | 55 | #define IEEE80211_DEFAULT_UAPSD_QUEUES \ |
@@ -165,12 +159,37 @@ typedef unsigned __bitwise__ ieee80211_rx_result; | |||
165 | #define RX_DROP_MONITOR ((__force ieee80211_rx_result) 2u) | 159 | #define RX_DROP_MONITOR ((__force ieee80211_rx_result) 2u) |
166 | #define RX_QUEUED ((__force ieee80211_rx_result) 3u) | 160 | #define RX_QUEUED ((__force ieee80211_rx_result) 3u) |
167 | 161 | ||
168 | #define IEEE80211_RX_IN_SCAN BIT(0) | 162 | /** |
169 | /* frame is destined to interface currently processed (incl. multicast frames) */ | 163 | * enum ieee80211_packet_rx_flags - packet RX flags |
170 | #define IEEE80211_RX_RA_MATCH BIT(1) | 164 | * @IEEE80211_RX_RA_MATCH: frame is destined to interface currently processed |
171 | #define IEEE80211_RX_AMSDU BIT(2) | 165 | * (incl. multicast frames) |
172 | #define IEEE80211_RX_FRAGMENTED BIT(3) | 166 | * @IEEE80211_RX_IN_SCAN: received while scanning |
173 | /* only add flags here that do not change with subframes of an aMPDU */ | 167 | * @IEEE80211_RX_FRAGMENTED: fragmented frame |
168 | * @IEEE80211_RX_AMSDU: a-MSDU packet | ||
169 | * @IEEE80211_RX_MALFORMED_ACTION_FRM: action frame is malformed | ||
170 | * | ||
171 | * These are per-frame flags that are attached to a frame in the | ||
172 | * @rx_flags field of &struct ieee80211_rx_status. | ||
173 | */ | ||
174 | enum ieee80211_packet_rx_flags { | ||
175 | IEEE80211_RX_IN_SCAN = BIT(0), | ||
176 | IEEE80211_RX_RA_MATCH = BIT(1), | ||
177 | IEEE80211_RX_FRAGMENTED = BIT(2), | ||
178 | IEEE80211_RX_AMSDU = BIT(3), | ||
179 | IEEE80211_RX_MALFORMED_ACTION_FRM = BIT(4), | ||
180 | }; | ||
181 | |||
182 | /** | ||
183 | * enum ieee80211_rx_flags - RX data flags | ||
184 | * | ||
185 | * @IEEE80211_RX_CMNTR: received on cooked monitor already | ||
186 | * | ||
187 | * These flags are used across handling multiple interfaces | ||
188 | * for a single frame. | ||
189 | */ | ||
190 | enum ieee80211_rx_flags { | ||
191 | IEEE80211_RX_CMNTR = BIT(0), | ||
192 | }; | ||
174 | 193 | ||
175 | struct ieee80211_rx_data { | 194 | struct ieee80211_rx_data { |
176 | struct sk_buff *skb; | 195 | struct sk_buff *skb; |
@@ -343,10 +362,14 @@ struct ieee80211_if_managed { | |||
343 | unsigned long timers_running; /* used for quiesce/restart */ | 362 | unsigned long timers_running; /* used for quiesce/restart */ |
344 | bool powersave; /* powersave requested for this iface */ | 363 | bool powersave; /* powersave requested for this iface */ |
345 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ | 364 | enum ieee80211_smps_mode req_smps, /* requested smps mode */ |
346 | ap_smps; /* smps mode AP thinks we're in */ | 365 | ap_smps, /* smps mode AP thinks we're in */ |
366 | driver_smps_mode; /* smps mode request */ | ||
367 | |||
368 | struct work_struct request_smps_work; | ||
347 | 369 | ||
348 | unsigned int flags; | 370 | unsigned int flags; |
349 | 371 | ||
372 | bool beacon_crc_valid; | ||
350 | u32 beacon_crc; | 373 | u32 beacon_crc; |
351 | 374 | ||
352 | enum { | 375 | enum { |
@@ -371,6 +394,13 @@ struct ieee80211_if_managed { | |||
371 | int ave_beacon_signal; | 394 | int ave_beacon_signal; |
372 | 395 | ||
373 | /* | 396 | /* |
397 | * Number of Beacon frames used in ave_beacon_signal. This can be used | ||
398 | * to avoid generating less reliable cqm events that would be based | ||
399 | * only on couple of received frames. | ||
400 | */ | ||
401 | unsigned int count_beacon_signal; | ||
402 | |||
403 | /* | ||
374 | * Last Beacon frame signal strength average (ave_beacon_signal / 16) | 404 | * Last Beacon frame signal strength average (ave_beacon_signal / 16) |
375 | * that triggered a cqm event. 0 indicates that no event has been | 405 | * that triggered a cqm event. 0 indicates that no event has been |
376 | * generated for the current association. | 406 | * generated for the current association. |
@@ -474,6 +504,19 @@ enum ieee80211_sub_if_data_flags { | |||
474 | IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), | 504 | IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3), |
475 | }; | 505 | }; |
476 | 506 | ||
507 | /** | ||
508 | * enum ieee80211_sdata_state_bits - virtual interface state bits | ||
509 | * @SDATA_STATE_RUNNING: virtual interface is up & running; this | ||
510 | * mirrors netif_running() but is separate for interface type | ||
511 | * change handling while the interface is up | ||
512 | * @SDATA_STATE_OFFCHANNEL: This interface is currently in offchannel | ||
513 | * mode, so queues are stopped | ||
514 | */ | ||
515 | enum ieee80211_sdata_state_bits { | ||
516 | SDATA_STATE_RUNNING, | ||
517 | SDATA_STATE_OFFCHANNEL, | ||
518 | }; | ||
519 | |||
477 | struct ieee80211_sub_if_data { | 520 | struct ieee80211_sub_if_data { |
478 | struct list_head list; | 521 | struct list_head list; |
479 | 522 | ||
@@ -487,6 +530,8 @@ struct ieee80211_sub_if_data { | |||
487 | 530 | ||
488 | unsigned int flags; | 531 | unsigned int flags; |
489 | 532 | ||
533 | unsigned long state; | ||
534 | |||
490 | int drop_unencrypted; | 535 | int drop_unencrypted; |
491 | 536 | ||
492 | char name[IFNAMSIZ]; | 537 | char name[IFNAMSIZ]; |
@@ -497,17 +542,20 @@ struct ieee80211_sub_if_data { | |||
497 | */ | 542 | */ |
498 | bool ht_opmode_valid; | 543 | bool ht_opmode_valid; |
499 | 544 | ||
545 | /* to detect idle changes */ | ||
546 | bool old_idle; | ||
547 | |||
500 | /* Fragment table for host-based reassembly */ | 548 | /* Fragment table for host-based reassembly */ |
501 | struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; | 549 | struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; |
502 | unsigned int fragment_next; | 550 | unsigned int fragment_next; |
503 | 551 | ||
504 | #define NUM_DEFAULT_KEYS 4 | ||
505 | #define NUM_DEFAULT_MGMT_KEYS 2 | ||
506 | struct ieee80211_key *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; | 552 | struct ieee80211_key *keys[NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS]; |
507 | struct ieee80211_key *default_key; | 553 | struct ieee80211_key *default_key; |
508 | struct ieee80211_key *default_mgmt_key; | 554 | struct ieee80211_key *default_mgmt_key; |
509 | 555 | ||
510 | u16 sequence_number; | 556 | u16 sequence_number; |
557 | __be16 control_port_protocol; | ||
558 | bool control_port_no_encrypt; | ||
511 | 559 | ||
512 | struct work_struct work; | 560 | struct work_struct work; |
513 | struct sk_buff_head skb_queue; | 561 | struct sk_buff_head skb_queue; |
@@ -539,6 +587,7 @@ struct ieee80211_sub_if_data { | |||
539 | #ifdef CONFIG_MAC80211_DEBUGFS | 587 | #ifdef CONFIG_MAC80211_DEBUGFS |
540 | struct { | 588 | struct { |
541 | struct dentry *dir; | 589 | struct dentry *dir; |
590 | struct dentry *subdir_stations; | ||
542 | struct dentry *default_key; | 591 | struct dentry *default_key; |
543 | struct dentry *default_mgmt_key; | 592 | struct dentry *default_mgmt_key; |
544 | } debugfs; | 593 | } debugfs; |
@@ -595,11 +644,17 @@ enum queue_stop_reason { | |||
595 | * determine if we are on the operating channel or not | 644 | * determine if we are on the operating channel or not |
596 | * @SCAN_OFF_CHANNEL: We're off our operating channel for scanning, | 645 | * @SCAN_OFF_CHANNEL: We're off our operating channel for scanning, |
597 | * gets only set in conjunction with SCAN_SW_SCANNING | 646 | * gets only set in conjunction with SCAN_SW_SCANNING |
647 | * @SCAN_COMPLETED: Set for our scan work function when the driver reported | ||
648 | * that the scan completed. | ||
649 | * @SCAN_ABORTED: Set for our scan work function when the driver reported | ||
650 | * a scan complete for an aborted scan. | ||
598 | */ | 651 | */ |
599 | enum { | 652 | enum { |
600 | SCAN_SW_SCANNING, | 653 | SCAN_SW_SCANNING, |
601 | SCAN_HW_SCANNING, | 654 | SCAN_HW_SCANNING, |
602 | SCAN_OFF_CHANNEL, | 655 | SCAN_OFF_CHANNEL, |
656 | SCAN_COMPLETED, | ||
657 | SCAN_ABORTED, | ||
603 | }; | 658 | }; |
604 | 659 | ||
605 | /** | 660 | /** |
@@ -634,7 +689,6 @@ struct ieee80211_local { | |||
634 | /* | 689 | /* |
635 | * work stuff, potentially off-channel (in the future) | 690 | * work stuff, potentially off-channel (in the future) |
636 | */ | 691 | */ |
637 | struct mutex work_mtx; | ||
638 | struct list_head work_list; | 692 | struct list_head work_list; |
639 | struct timer_list work_timer; | 693 | struct timer_list work_timer; |
640 | struct work_struct work_work; | 694 | struct work_struct work_work; |
@@ -653,9 +707,13 @@ struct ieee80211_local { | |||
653 | int open_count; | 707 | int open_count; |
654 | int monitors, cooked_mntrs; | 708 | int monitors, cooked_mntrs; |
655 | /* number of interfaces with corresponding FIF_ flags */ | 709 | /* number of interfaces with corresponding FIF_ flags */ |
656 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll; | 710 | int fif_fcsfail, fif_plcpfail, fif_control, fif_other_bss, fif_pspoll, |
711 | fif_probe_req; | ||
712 | int probe_req_reg; | ||
657 | unsigned int filter_flags; /* FIF_* */ | 713 | unsigned int filter_flags; /* FIF_* */ |
658 | 714 | ||
715 | bool wiphy_ciphers_allocated; | ||
716 | |||
659 | /* protects the aggregated multicast list and filter calls */ | 717 | /* protects the aggregated multicast list and filter calls */ |
660 | spinlock_t filter_lock; | 718 | spinlock_t filter_lock; |
661 | 719 | ||
@@ -746,9 +804,10 @@ struct ieee80211_local { | |||
746 | */ | 804 | */ |
747 | struct mutex key_mtx; | 805 | struct mutex key_mtx; |
748 | 806 | ||
807 | /* mutex for scan and work locking */ | ||
808 | struct mutex mtx; | ||
749 | 809 | ||
750 | /* Scanning and BSS list */ | 810 | /* Scanning and BSS list */ |
751 | struct mutex scan_mtx; | ||
752 | unsigned long scanning; | 811 | unsigned long scanning; |
753 | struct cfg80211_ssid scan_ssid; | 812 | struct cfg80211_ssid scan_ssid; |
754 | struct cfg80211_scan_request *int_scan_req; | 813 | struct cfg80211_scan_request *int_scan_req; |
@@ -866,10 +925,14 @@ struct ieee80211_local { | |||
866 | #ifdef CONFIG_MAC80211_DEBUGFS | 925 | #ifdef CONFIG_MAC80211_DEBUGFS |
867 | struct local_debugfsdentries { | 926 | struct local_debugfsdentries { |
868 | struct dentry *rcdir; | 927 | struct dentry *rcdir; |
869 | struct dentry *stations; | ||
870 | struct dentry *keys; | 928 | struct dentry *keys; |
871 | } debugfs; | 929 | } debugfs; |
872 | #endif | 930 | #endif |
931 | |||
932 | /* dummy netdev for use w/ NAPI */ | ||
933 | struct net_device napi_dev; | ||
934 | |||
935 | struct napi_struct napi; | ||
873 | }; | 936 | }; |
874 | 937 | ||
875 | static inline struct ieee80211_sub_if_data * | 938 | static inline struct ieee80211_sub_if_data * |
@@ -1003,6 +1066,8 @@ void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata); | |||
1003 | void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); | 1066 | void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata); |
1004 | void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, | 1067 | void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, |
1005 | struct sk_buff *skb); | 1068 | struct sk_buff *skb); |
1069 | void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata); | ||
1070 | void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata); | ||
1006 | 1071 | ||
1007 | /* IBSS code */ | 1072 | /* IBSS code */ |
1008 | void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); | 1073 | void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); |
@@ -1068,10 +1133,12 @@ void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata); | |||
1068 | void ieee80211_remove_interfaces(struct ieee80211_local *local); | 1133 | void ieee80211_remove_interfaces(struct ieee80211_local *local); |
1069 | u32 __ieee80211_recalc_idle(struct ieee80211_local *local); | 1134 | u32 __ieee80211_recalc_idle(struct ieee80211_local *local); |
1070 | void ieee80211_recalc_idle(struct ieee80211_local *local); | 1135 | void ieee80211_recalc_idle(struct ieee80211_local *local); |
1136 | void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, | ||
1137 | const int offset); | ||
1071 | 1138 | ||
1072 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) | 1139 | static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) |
1073 | { | 1140 | { |
1074 | return netif_running(sdata->dev); | 1141 | return test_bit(SDATA_STATE_RUNNING, &sdata->state); |
1075 | } | 1142 | } |
1076 | 1143 | ||
1077 | /* tx handling */ | 1144 | /* tx handling */ |
@@ -1105,12 +1172,13 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata, | |||
1105 | int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata, | 1172 | int ieee80211_send_smps_action(struct ieee80211_sub_if_data *sdata, |
1106 | enum ieee80211_smps_mode smps, const u8 *da, | 1173 | enum ieee80211_smps_mode smps, const u8 *da, |
1107 | const u8 *bssid); | 1174 | const u8 *bssid); |
1175 | void ieee80211_request_smps_work(struct work_struct *work); | ||
1108 | 1176 | ||
1109 | void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | 1177 | void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, |
1110 | u16 initiator, u16 reason); | 1178 | u16 initiator, u16 reason, bool stop); |
1111 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | 1179 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, |
1112 | u16 initiator, u16 reason); | 1180 | u16 initiator, u16 reason, bool stop); |
1113 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta); | 1181 | void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, bool tx); |
1114 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | 1182 | void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, |
1115 | struct sta_info *sta, | 1183 | struct sta_info *sta, |
1116 | struct ieee80211_mgmt *mgmt, size_t len); | 1184 | struct ieee80211_mgmt *mgmt, size_t len); |
@@ -1124,13 +1192,16 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
1124 | size_t len); | 1192 | size_t len); |
1125 | 1193 | ||
1126 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | 1194 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
1127 | enum ieee80211_back_parties initiator); | 1195 | enum ieee80211_back_parties initiator, |
1196 | bool tx); | ||
1128 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | 1197 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
1129 | enum ieee80211_back_parties initiator); | 1198 | enum ieee80211_back_parties initiator, |
1199 | bool tx); | ||
1130 | void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); | 1200 | void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); |
1131 | void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); | 1201 | void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); |
1132 | void ieee80211_ba_session_work(struct work_struct *work); | 1202 | void ieee80211_ba_session_work(struct work_struct *work); |
1133 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); | 1203 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); |
1204 | void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid); | ||
1134 | 1205 | ||
1135 | /* Spectrum management */ | 1206 | /* Spectrum management */ |
1136 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, | 1207 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, |
@@ -1146,6 +1217,12 @@ int __ieee80211_suspend(struct ieee80211_hw *hw); | |||
1146 | 1217 | ||
1147 | static inline int __ieee80211_resume(struct ieee80211_hw *hw) | 1218 | static inline int __ieee80211_resume(struct ieee80211_hw *hw) |
1148 | { | 1219 | { |
1220 | struct ieee80211_local *local = hw_to_local(hw); | ||
1221 | |||
1222 | WARN(test_bit(SCAN_HW_SCANNING, &local->scanning), | ||
1223 | "%s: resume with hardware scan still in progress\n", | ||
1224 | wiphy_name(hw->wiphy)); | ||
1225 | |||
1149 | return ieee80211_reconfig(hw_to_local(hw)); | 1226 | return ieee80211_reconfig(hw_to_local(hw)); |
1150 | } | 1227 | } |
1151 | #else | 1228 | #else |
@@ -1208,7 +1285,8 @@ void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, | |||
1208 | const u8 *key, u8 key_len, u8 key_idx); | 1285 | const u8 *key, u8 key_len, u8 key_idx); |
1209 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, | 1286 | int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer, |
1210 | const u8 *ie, size_t ie_len, | 1287 | const u8 *ie, size_t ie_len, |
1211 | enum ieee80211_band band); | 1288 | enum ieee80211_band band, u32 rate_mask, |
1289 | u8 channel); | ||
1212 | void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, | 1290 | void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst, |
1213 | const u8 *ssid, size_t ssid_len, | 1291 | const u8 *ssid, size_t ssid_len, |
1214 | const u8 *ie, size_t ie_len); | 1292 | const u8 *ie, size_t ie_len); |
@@ -1221,8 +1299,7 @@ u32 ieee80211_sta_get_rates(struct ieee80211_local *local, | |||
1221 | enum ieee80211_band band); | 1299 | enum ieee80211_band band); |
1222 | int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, | 1300 | int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, |
1223 | enum ieee80211_smps_mode smps_mode); | 1301 | enum ieee80211_smps_mode smps_mode); |
1224 | void ieee80211_recalc_smps(struct ieee80211_local *local, | 1302 | void ieee80211_recalc_smps(struct ieee80211_local *local); |
1225 | struct ieee80211_sub_if_data *forsdata); | ||
1226 | 1303 | ||
1227 | size_t ieee80211_ie_split(const u8 *ies, size_t ielen, | 1304 | size_t ieee80211_ie_split(const u8 *ies, size_t ielen, |
1228 | const u8 *ids, int n_ids, size_t offset); | 1305 | const u8 *ids, int n_ids, size_t offset); |