diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/cfg.c | 3 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 1 | ||||
-rw-r--r-- | net/mac80211/mesh.c | 2 | ||||
-rw-r--r-- | net/mac80211/mesh.h | 5 | ||||
-rw-r--r-- | net/mac80211/mesh_hwmp.c | 2 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 10 | ||||
-rw-r--r-- | net/mac80211/rx.c | 1 | ||||
-rw-r--r-- | net/mac80211/scan.c | 20 | ||||
-rw-r--r-- | net/mac80211/util.c | 2 |
9 files changed, 33 insertions, 13 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 93ee1fd5c08d..6dc3579c0ac5 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -354,7 +354,8 @@ static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | |||
354 | sinfo->rx_packets = sta->rx_packets; | 354 | sinfo->rx_packets = sta->rx_packets; |
355 | sinfo->tx_packets = sta->tx_packets; | 355 | sinfo->tx_packets = sta->tx_packets; |
356 | 356 | ||
357 | if (sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) { | 357 | if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) || |
358 | (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) { | ||
358 | sinfo->filled |= STATION_INFO_SIGNAL; | 359 | sinfo->filled |= STATION_INFO_SIGNAL; |
359 | sinfo->signal = (s8)sta->last_signal; | 360 | sinfo->signal = (s8)sta->last_signal; |
360 | } | 361 | } |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 419f186cfcf0..91dc8636d644 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -746,6 +746,7 @@ struct ieee80211_local { | |||
746 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ | 746 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ |
747 | 747 | ||
748 | bool pspolling; | 748 | bool pspolling; |
749 | bool scan_ps_enabled; | ||
749 | /* | 750 | /* |
750 | * PS can only be enabled when we have exactly one managed | 751 | * PS can only be enabled when we have exactly one managed |
751 | * interface (and monitors) in PS, this then points there. | 752 | * interface (and monitors) in PS, this then points there. |
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index c0fe46493f71..6a4331429598 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -427,7 +427,7 @@ int ieee80211_new_mesh_header(struct ieee80211s_hdr *meshhdr, | |||
427 | char *addr5, char *addr6) | 427 | char *addr5, char *addr6) |
428 | { | 428 | { |
429 | int aelen = 0; | 429 | int aelen = 0; |
430 | memset(meshhdr, 0, sizeof(meshhdr)); | 430 | memset(meshhdr, 0, sizeof(*meshhdr)); |
431 | meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; | 431 | meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; |
432 | put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); | 432 | put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); |
433 | sdata->u.mesh.mesh_seqnum++; | 433 | sdata->u.mesh.mesh_seqnum++; |
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h index 31e102541869..85562c59d7d6 100644 --- a/net/mac80211/mesh.h +++ b/net/mac80211/mesh.h | |||
@@ -188,8 +188,9 @@ struct mesh_rmc { | |||
188 | */ | 188 | */ |
189 | #define MESH_PREQ_MIN_INT 10 | 189 | #define MESH_PREQ_MIN_INT 10 |
190 | #define MESH_DIAM_TRAVERSAL_TIME 50 | 190 | #define MESH_DIAM_TRAVERSAL_TIME 50 |
191 | /* Paths will be refreshed if they are closer than PATH_REFRESH_TIME to their | 191 | /* A path will be refreshed if it is used PATH_REFRESH_TIME milliseconds before |
192 | * expiration | 192 | * timing out. This way it will remain ACTIVE and no data frames will be |
193 | * unnecesarily held in the pending queue. | ||
193 | */ | 194 | */ |
194 | #define MESH_PATH_REFRESH_TIME 1000 | 195 | #define MESH_PATH_REFRESH_TIME 1000 |
195 | #define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME) | 196 | #define MESH_MIN_DISCOVERY_TIMEOUT (2 * MESH_DIAM_TRAVERSAL_TIME) |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 833b2f3670c5..d28acb6b1f81 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -937,7 +937,7 @@ int mesh_nexthop_lookup(struct sk_buff *skb, | |||
937 | 937 | ||
938 | if (mpath->flags & MESH_PATH_ACTIVE) { | 938 | if (mpath->flags & MESH_PATH_ACTIVE) { |
939 | if (time_after(jiffies, | 939 | if (time_after(jiffies, |
940 | mpath->exp_time + | 940 | mpath->exp_time - |
941 | msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && | 941 | msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && |
942 | !memcmp(sdata->dev->dev_addr, hdr->addr4, ETH_ALEN) && | 942 | !memcmp(sdata->dev->dev_addr, hdr->addr4, ETH_ALEN) && |
943 | !(mpath->flags & MESH_PATH_RESOLVING) && | 943 | !(mpath->flags & MESH_PATH_RESOLVING) && |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 6dc7b5ad9a41..d8d50fb5e823 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1083,8 +1083,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1083 | 1083 | ||
1084 | ieee80211_set_wmm_default(sdata); | 1084 | ieee80211_set_wmm_default(sdata); |
1085 | 1085 | ||
1086 | ieee80211_recalc_idle(local); | ||
1087 | |||
1088 | /* channel(_type) changes are handled by ieee80211_hw_config */ | 1086 | /* channel(_type) changes are handled by ieee80211_hw_config */ |
1089 | local->oper_channel_type = NL80211_CHAN_NO_HT; | 1087 | local->oper_channel_type = NL80211_CHAN_NO_HT; |
1090 | 1088 | ||
@@ -1370,6 +1368,7 @@ ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, | |||
1370 | 1368 | ||
1371 | if (!wk) { | 1369 | if (!wk) { |
1372 | ieee80211_set_disassoc(sdata, true); | 1370 | ieee80211_set_disassoc(sdata, true); |
1371 | ieee80211_recalc_idle(sdata->local); | ||
1373 | } else { | 1372 | } else { |
1374 | list_del(&wk->list); | 1373 | list_del(&wk->list); |
1375 | kfree(wk); | 1374 | kfree(wk); |
@@ -1403,6 +1402,7 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1403 | sdata->dev->name, mgmt->sa, reason_code); | 1402 | sdata->dev->name, mgmt->sa, reason_code); |
1404 | 1403 | ||
1405 | ieee80211_set_disassoc(sdata, false); | 1404 | ieee80211_set_disassoc(sdata, false); |
1405 | ieee80211_recalc_idle(sdata->local); | ||
1406 | return RX_MGMT_CFG80211_DISASSOC; | 1406 | return RX_MGMT_CFG80211_DISASSOC; |
1407 | } | 1407 | } |
1408 | 1408 | ||
@@ -2117,6 +2117,7 @@ static void ieee80211_sta_work(struct work_struct *work) | |||
2117 | " after %dms, disconnecting.\n", | 2117 | " after %dms, disconnecting.\n", |
2118 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ); | 2118 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ); |
2119 | ieee80211_set_disassoc(sdata, true); | 2119 | ieee80211_set_disassoc(sdata, true); |
2120 | ieee80211_recalc_idle(local); | ||
2120 | mutex_unlock(&ifmgd->mtx); | 2121 | mutex_unlock(&ifmgd->mtx); |
2121 | /* | 2122 | /* |
2122 | * must be outside lock due to cfg80211, | 2123 | * must be outside lock due to cfg80211, |
@@ -2560,6 +2561,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2560 | IEEE80211_STYPE_DEAUTH, req->reason_code, | 2561 | IEEE80211_STYPE_DEAUTH, req->reason_code, |
2561 | cookie); | 2562 | cookie); |
2562 | 2563 | ||
2564 | ieee80211_recalc_idle(sdata->local); | ||
2565 | |||
2563 | return 0; | 2566 | return 0; |
2564 | } | 2567 | } |
2565 | 2568 | ||
@@ -2592,5 +2595,8 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | |||
2592 | ieee80211_send_deauth_disassoc(sdata, req->bss->bssid, | 2595 | ieee80211_send_deauth_disassoc(sdata, req->bss->bssid, |
2593 | IEEE80211_STYPE_DISASSOC, req->reason_code, | 2596 | IEEE80211_STYPE_DISASSOC, req->reason_code, |
2594 | cookie); | 2597 | cookie); |
2598 | |||
2599 | ieee80211_recalc_idle(sdata->local); | ||
2600 | |||
2595 | return 0; | 2601 | return 0; |
2596 | } | 2602 | } |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index f237df408378..9f2807aeaf52 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1712,7 +1712,6 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
1712 | mpp_path_add(proxied_addr, mpp_addr, sdata); | 1712 | mpp_path_add(proxied_addr, mpp_addr, sdata); |
1713 | } else { | 1713 | } else { |
1714 | spin_lock_bh(&mppath->state_lock); | 1714 | spin_lock_bh(&mppath->state_lock); |
1715 | mppath->exp_time = jiffies; | ||
1716 | if (compare_ether_addr(mppath->mpp, mpp_addr) != 0) | 1715 | if (compare_ether_addr(mppath->mpp, mpp_addr) != 0) |
1717 | memcpy(mppath->mpp, mpp_addr, ETH_ALEN); | 1716 | memcpy(mppath->mpp, mpp_addr, ETH_ALEN); |
1718 | spin_unlock_bh(&mppath->state_lock); | 1717 | spin_unlock_bh(&mppath->state_lock); |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 4cf387c944bf..f1a4c7160300 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -227,7 +227,8 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local) | |||
227 | static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) | 227 | static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) |
228 | { | 228 | { |
229 | struct ieee80211_local *local = sdata->local; | 229 | struct ieee80211_local *local = sdata->local; |
230 | bool ps = false; | 230 | |
231 | local->scan_ps_enabled = false; | ||
231 | 232 | ||
232 | /* FIXME: what to do when local->pspolling is true? */ | 233 | /* FIXME: what to do when local->pspolling is true? */ |
233 | 234 | ||
@@ -235,12 +236,13 @@ static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) | |||
235 | cancel_work_sync(&local->dynamic_ps_enable_work); | 236 | cancel_work_sync(&local->dynamic_ps_enable_work); |
236 | 237 | ||
237 | if (local->hw.conf.flags & IEEE80211_CONF_PS) { | 238 | if (local->hw.conf.flags & IEEE80211_CONF_PS) { |
238 | ps = true; | 239 | local->scan_ps_enabled = true; |
239 | local->hw.conf.flags &= ~IEEE80211_CONF_PS; | 240 | local->hw.conf.flags &= ~IEEE80211_CONF_PS; |
240 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 241 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
241 | } | 242 | } |
242 | 243 | ||
243 | if (!ps || !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) | 244 | if (!(local->scan_ps_enabled) || |
245 | !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) | ||
244 | /* | 246 | /* |
245 | * If power save was enabled, no need to send a nullfunc | 247 | * If power save was enabled, no need to send a nullfunc |
246 | * frame because AP knows that we are sleeping. But if the | 248 | * frame because AP knows that we are sleeping. But if the |
@@ -261,7 +263,7 @@ static void ieee80211_scan_ps_disable(struct ieee80211_sub_if_data *sdata) | |||
261 | 263 | ||
262 | if (!local->ps_sdata) | 264 | if (!local->ps_sdata) |
263 | ieee80211_send_nullfunc(local, sdata, 0); | 265 | ieee80211_send_nullfunc(local, sdata, 0); |
264 | else { | 266 | else if (local->scan_ps_enabled) { |
265 | /* | 267 | /* |
266 | * In !IEEE80211_HW_PS_NULLFUNC_STACK case the hardware | 268 | * In !IEEE80211_HW_PS_NULLFUNC_STACK case the hardware |
267 | * will send a nullfunc frame with the powersave bit set | 269 | * will send a nullfunc frame with the powersave bit set |
@@ -277,6 +279,16 @@ static void ieee80211_scan_ps_disable(struct ieee80211_sub_if_data *sdata) | |||
277 | */ | 279 | */ |
278 | local->hw.conf.flags |= IEEE80211_CONF_PS; | 280 | local->hw.conf.flags |= IEEE80211_CONF_PS; |
279 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 281 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
282 | } else if (local->hw.conf.dynamic_ps_timeout > 0) { | ||
283 | /* | ||
284 | * If IEEE80211_CONF_PS was not set and the dynamic_ps_timer | ||
285 | * had been running before leaving the operating channel, | ||
286 | * restart the timer now and send a nullfunc frame to inform | ||
287 | * the AP that we are awake. | ||
288 | */ | ||
289 | ieee80211_send_nullfunc(local, sdata, 0); | ||
290 | mod_timer(&local->dynamic_ps_timer, jiffies + | ||
291 | msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); | ||
280 | } | 292 | } |
281 | } | 293 | } |
282 | 294 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index d09f78bb2442..78a6e924c7e1 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -579,7 +579,7 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
579 | if (elen > left) | 579 | if (elen > left) |
580 | break; | 580 | break; |
581 | 581 | ||
582 | if (calc_crc && id < 64 && (filter & BIT(id))) | 582 | if (calc_crc && id < 64 && (filter & (1ULL << id))) |
583 | crc = crc32_be(crc, pos - 2, elen + 2); | 583 | crc = crc32_be(crc, pos - 2, elen + 2); |
584 | 584 | ||
585 | switch (id) { | 585 | switch (id) { |