OLD | NEW |
1 /* | 1 /* |
2 * Off-channel operation helpers | 2 * Off-channel operation helpers |
3 * | 3 * |
4 * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi> | 4 * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi> |
5 * Copyright 2004, Instant802 Networks, Inc. | 5 * Copyright 2004, Instant802 Networks, Inc. |
6 * Copyright 2005, Devicescape Software, Inc. | 6 * Copyright 2005, Devicescape Software, Inc. |
7 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 7 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | 8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net> |
9 * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> | 9 * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> |
10 * | 10 * |
11 * This program is free software; you can redistribute it and/or modify | 11 * This program is free software; you can redistribute it and/or modify |
12 * it under the terms of the GNU General Public License version 2 as | 12 * it under the terms of the GNU General Public License version 2 as |
13 * published by the Free Software Foundation. | 13 * published by the Free Software Foundation. |
14 */ | 14 */ |
15 #include <net/mac80211.h> | 15 #include <net/mac80211.h> |
16 #include "ieee80211_i.h" | 16 #include "ieee80211_i.h" |
17 | 17 |
18 /* | 18 /* |
19 * inform AP that we will go to sleep so that it will buffer the frames | 19 * inform AP that we will go to sleep so that it will buffer the frames |
20 * while we scan | 20 * while we scan |
21 */ | 21 */ |
22 static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata) | 22 static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata) |
23 { | 23 { |
24 struct ieee80211_local *local = sdata->local; | 24 struct ieee80211_local *local = sdata->local; |
| 25 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
25 | 26 |
26 local->offchannel_ps_enabled = false; | 27 local->offchannel_ps_enabled = false; |
27 | 28 |
28 /* FIXME: what to do when local->pspolling is true? */ | 29 /* FIXME: what to do when local->pspolling is true? */ |
29 | 30 |
30 del_timer_sync(&local->dynamic_ps_timer); | 31 del_timer_sync(&local->dynamic_ps_timer); |
| 32 del_timer_sync(&ifmgd->conn_mon_timer); |
| 33 |
31 cancel_work_sync(&local->dynamic_ps_enable_work); | 34 cancel_work_sync(&local->dynamic_ps_enable_work); |
32 | 35 |
33 if (local->hw.conf.flags & IEEE80211_CONF_PS) { | 36 if (local->hw.conf.flags & IEEE80211_CONF_PS) { |
34 local->offchannel_ps_enabled = true; | 37 local->offchannel_ps_enabled = true; |
35 local->hw.conf.flags &= ~IEEE80211_CONF_PS; | 38 local->hw.conf.flags &= ~IEEE80211_CONF_PS; |
36 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 39 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
37 } | 40 } |
38 | 41 |
39 if (!(local->offchannel_ps_enabled) || | 42 if (!(local->offchannel_ps_enabled) || |
40 !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) | 43 !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 /* | 81 /* |
79 * If IEEE80211_CONF_PS was not set and the dynamic_ps_timer | 82 * If IEEE80211_CONF_PS was not set and the dynamic_ps_timer |
80 * had been running before leaving the operating channel, | 83 * had been running before leaving the operating channel, |
81 * restart the timer now and send a nullfunc frame to inform | 84 * restart the timer now and send a nullfunc frame to inform |
82 * the AP that we are awake. | 85 * the AP that we are awake. |
83 */ | 86 */ |
84 ieee80211_send_nullfunc(local, sdata, 0); | 87 ieee80211_send_nullfunc(local, sdata, 0); |
85 mod_timer(&local->dynamic_ps_timer, jiffies + | 88 mod_timer(&local->dynamic_ps_timer, jiffies + |
86 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); | 89 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); |
87 } | 90 } |
| 91 |
| 92 ieee80211_sta_reset_conn_monitor(sdata); |
88 } | 93 } |
89 | 94 |
90 void ieee80211_offchannel_stop_beaconing(struct ieee80211_local *local) | 95 void ieee80211_offchannel_stop_beaconing(struct ieee80211_local *local) |
91 { | 96 { |
92 struct ieee80211_sub_if_data *sdata; | 97 struct ieee80211_sub_if_data *sdata; |
93 | 98 |
94 mutex_lock(&local->iflist_mtx); | 99 mutex_lock(&local->iflist_mtx); |
95 list_for_each_entry(sdata, &local->interfaces, list) { | 100 list_for_each_entry(sdata, &local->interfaces, list) { |
96 if (!ieee80211_sdata_running(sdata)) | 101 if (!ieee80211_sdata_running(sdata)) |
97 continue; | 102 continue; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 /* re-enable beaconing */ | 166 /* re-enable beaconing */ |
162 if (enable_beaconing && | 167 if (enable_beaconing && |
163 (sdata->vif.type == NL80211_IFTYPE_AP || | 168 (sdata->vif.type == NL80211_IFTYPE_AP || |
164 sdata->vif.type == NL80211_IFTYPE_ADHOC || | 169 sdata->vif.type == NL80211_IFTYPE_ADHOC || |
165 sdata->vif.type == NL80211_IFTYPE_MESH_POINT)) | 170 sdata->vif.type == NL80211_IFTYPE_MESH_POINT)) |
166 ieee80211_bss_info_change_notify( | 171 ieee80211_bss_info_change_notify( |
167 sdata, BSS_CHANGED_BEACON_ENABLED); | 172 sdata, BSS_CHANGED_BEACON_ENABLED); |
168 } | 173 } |
169 mutex_unlock(&local->iflist_mtx); | 174 mutex_unlock(&local->iflist_mtx); |
170 } | 175 } |
OLD | NEW |