diff options
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 66785739dad3..e99d1b60557c 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "led.h" | 24 | #include "led.h" |
25 | #include "driver-ops.h" | 25 | #include "driver-ops.h" |
26 | #include "wme.h" | 26 | #include "wme.h" |
27 | #include "rate.h" | ||
27 | 28 | ||
28 | /** | 29 | /** |
29 | * DOC: Interface list locking | 30 | * DOC: Interface list locking |
@@ -148,6 +149,26 @@ static int ieee80211_check_concurrent_iface(struct ieee80211_sub_if_data *sdata, | |||
148 | return 0; | 149 | return 0; |
149 | } | 150 | } |
150 | 151 | ||
152 | void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata, | ||
153 | const int offset) | ||
154 | { | ||
155 | struct ieee80211_local *local = sdata->local; | ||
156 | u32 flags = sdata->u.mntr_flags; | ||
157 | |||
158 | #define ADJUST(_f, _s) do { \ | ||
159 | if (flags & MONITOR_FLAG_##_f) \ | ||
160 | local->fif_##_s += offset; \ | ||
161 | } while (0) | ||
162 | |||
163 | ADJUST(FCSFAIL, fcsfail); | ||
164 | ADJUST(PLCPFAIL, plcpfail); | ||
165 | ADJUST(CONTROL, control); | ||
166 | ADJUST(CONTROL, pspoll); | ||
167 | ADJUST(OTHER_BSS, other_bss); | ||
168 | |||
169 | #undef ADJUST | ||
170 | } | ||
171 | |||
151 | /* | 172 | /* |
152 | * NOTE: Be very careful when changing this function, it must NOT return | 173 | * NOTE: Be very careful when changing this function, it must NOT return |
153 | * an error on interface type changes that have been pre-checked, so most | 174 | * an error on interface type changes that have been pre-checked, so most |
@@ -240,17 +261,7 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up) | |||
240 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR; | 261 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR; |
241 | } | 262 | } |
242 | 263 | ||
243 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) | 264 | ieee80211_adjust_monitor_flags(sdata, 1); |
244 | local->fif_fcsfail++; | ||
245 | if (sdata->u.mntr_flags & MONITOR_FLAG_PLCPFAIL) | ||
246 | local->fif_plcpfail++; | ||
247 | if (sdata->u.mntr_flags & MONITOR_FLAG_CONTROL) { | ||
248 | local->fif_control++; | ||
249 | local->fif_pspoll++; | ||
250 | } | ||
251 | if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS) | ||
252 | local->fif_other_bss++; | ||
253 | |||
254 | ieee80211_configure_filter(local); | 265 | ieee80211_configure_filter(local); |
255 | 266 | ||
256 | netif_carrier_on(dev); | 267 | netif_carrier_on(dev); |
@@ -301,6 +312,8 @@ static int ieee80211_do_open(struct net_device *dev, bool coming_up) | |||
301 | /* STA has been freed */ | 312 | /* STA has been freed */ |
302 | goto err_del_interface; | 313 | goto err_del_interface; |
303 | } | 314 | } |
315 | |||
316 | rate_control_rate_init(sta); | ||
304 | } | 317 | } |
305 | 318 | ||
306 | /* | 319 | /* |
@@ -477,17 +490,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | |||
477 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR; | 490 | hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR; |
478 | } | 491 | } |
479 | 492 | ||
480 | if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL) | 493 | ieee80211_adjust_monitor_flags(sdata, -1); |
481 | local->fif_fcsfail--; | ||
482 | if (sdata->u.mntr_flags & MONITOR_FLAG_PLCPFAIL) | ||
483 | local->fif_plcpfail--; | ||
484 | if (sdata->u.mntr_flags & MONITOR_FLAG_CONTROL) { | ||
485 | local->fif_pspoll--; | ||
486 | local->fif_control--; | ||
487 | } | ||
488 | if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS) | ||
489 | local->fif_other_bss--; | ||
490 | |||
491 | ieee80211_configure_filter(local); | 494 | ieee80211_configure_filter(local); |
492 | break; | 495 | break; |
493 | case NL80211_IFTYPE_MESH_POINT: | 496 | case NL80211_IFTYPE_MESH_POINT: |
@@ -793,7 +796,8 @@ static void ieee80211_iface_work(struct work_struct *work) | |||
793 | 796 | ||
794 | __ieee80211_stop_rx_ba_session( | 797 | __ieee80211_stop_rx_ba_session( |
795 | sta, tid, WLAN_BACK_RECIPIENT, | 798 | sta, tid, WLAN_BACK_RECIPIENT, |
796 | WLAN_REASON_QSTA_REQUIRE_SETUP); | 799 | WLAN_REASON_QSTA_REQUIRE_SETUP, |
800 | true); | ||
797 | } | 801 | } |
798 | mutex_unlock(&local->sta_mtx); | 802 | mutex_unlock(&local->sta_mtx); |
799 | } else switch (sdata->vif.type) { | 803 | } else switch (sdata->vif.type) { |