From: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
kernel-team@lists.ubuntu.com
Cc: Emmanuel Grumbach <emmanuel.grumbach@intel.com>,
Johannes Berg <johannes.berg@intel.com>,
Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Subject: [PATCH 07/74] mac80211: fix dtim_period in hidden SSID AP association
Date: Thu, 24 Jan 2013 01:26:19 -0200 [thread overview]
Message-ID: <1358998046-613-8-git-send-email-herton.krzesinski@canonical.com> (raw)
In-Reply-To: <1358998046-613-1-git-send-email-herton.krzesinski@canonical.com>
3.5.7.4 -stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <johannes.berg@intel.com>
commit 826262c3d23743cb032a9e1a65a0f9be75091a5e upstream.
When AP's SSID is hidden the BSS can appear several times in
cfg80211's BSS list: once with a zero-length SSID that comes
from the beacon, and once for each SSID from probe reponses.
Since the mac80211 stores its data in ieee80211_bss which
is embedded into cfg80211_bss, mac80211's data will be
duplicated too.
This becomes a problem when a driver needs the dtim_period
since this data exists only in the beacon's instance in
cfg80211 bss table which isn't the instance that is used
when associating.
Remove the DTIM period from the BSS table and track it
explicitly to avoid this problem.
Tested-by: Efi Tubul <efi.tubul@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
[ herton: adjust context, no RCU locking (use same backport as the one
for 3.7), keep printk usage instead of non-existent sdata_info in 3.5 ]
Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
---
net/mac80211/ieee80211_i.h | 5 +--
net/mac80211/mlme.c | 73 +++++++++++++++++++++++++++++++-------------
net/mac80211/scan.c | 13 --------
3 files changed, 53 insertions(+), 38 deletions(-)
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index d0b1c56..16655d6 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -81,8 +81,6 @@ struct ieee80211_bss {
size_t ssid_len;
u8 ssid[IEEE80211_MAX_SSID_LEN];
- u8 dtim_period;
-
bool wmm_used;
bool uapsd_supported;
@@ -129,7 +127,6 @@ enum ieee80211_bss_corrupt_data_flags {
/**
* enum ieee80211_valid_data_flags - BSS valid data flags
- * @IEEE80211_BSS_VALID_DTIM: DTIM data was gathered from non-corrupt IE
* @IEEE80211_BSS_VALID_WMM: WMM/UAPSD data was gathered from non-corrupt IE
* @IEEE80211_BSS_VALID_RATES: Supported rates were gathered from non-corrupt IE
* @IEEE80211_BSS_VALID_ERP: ERP flag was gathered from non-corrupt IE
@@ -140,7 +137,6 @@ enum ieee80211_bss_corrupt_data_flags {
* beacon/probe response.
*/
enum ieee80211_bss_valid_data_flags {
- IEEE80211_BSS_VALID_DTIM = BIT(0),
IEEE80211_BSS_VALID_WMM = BIT(1),
IEEE80211_BSS_VALID_RATES = BIT(2),
IEEE80211_BSS_VALID_ERP = BIT(3)
@@ -444,6 +440,7 @@ struct ieee80211_if_managed {
unsigned long timers_running; /* used for quiesce/restart */
bool powersave; /* powersave requested for this iface */
bool broken_ap; /* AP is broken -- turn off powersave */
+ u8 dtim_period;
enum ieee80211_smps_mode req_smps, /* requested smps mode */
ap_smps, /* smps mode AP thinks we're in */
driver_smps_mode; /* smps mode request */
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 6d79367..4549e7e 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -994,12 +994,8 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
if (beaconint_us > latency) {
local->ps_sdata = NULL;
} else {
- struct ieee80211_bss *bss;
int maxslp = 1;
- u8 dtimper;
-
- bss = (void *)found->u.mgd.associated->priv;
- dtimper = bss->dtim_period;
+ u8 dtimper = found->u.mgd.dtim_period;
/* If the TIM IE is invalid, pretend the value is 1 */
if (!dtimper)
@@ -1305,10 +1301,17 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
ieee80211_led_assoc(local, 1);
- if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD)
- bss_conf->dtim_period = bss->dtim_period;
- else
+ if (local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
+ /*
+ * If the AP is buggy we may get here with no DTIM period
+ * known, so assume it's 1 which is the only safe assumption
+ * in that case, although if the TIM IE is broken powersave
+ * probably just won't work at all.
+ */
+ bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1;
+ } else {
bss_conf->dtim_period = 0;
+ }
bss_conf->assoc = 1;
@@ -1441,6 +1444,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
del_timer_sync(&sdata->u.mgd.timer);
del_timer_sync(&sdata->u.mgd.chswitch_timer);
+
+ sdata->vif.bss_conf.dtim_period = 0;
}
void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
@@ -2205,11 +2210,18 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
struct ieee80211_channel *channel;
bool need_ps = false;
- if (sdata->u.mgd.associated &&
- ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) {
- bss = (void *)sdata->u.mgd.associated->priv;
+ if ((sdata->u.mgd.associated &&
+ ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) ||
+ (sdata->u.mgd.assoc_data &&
+ ether_addr_equal(mgmt->bssid,
+ sdata->u.mgd.assoc_data->bss->bssid))) {
/* not previously set so we may need to recalc */
- need_ps = !bss->dtim_period;
+ need_ps = sdata->u.mgd.associated && !sdata->u.mgd.dtim_period;
+
+ if (elems->tim && !elems->parse_error) {
+ struct ieee80211_tim_ie *tim_ie = elems->tim;
+ sdata->u.mgd.dtim_period = tim_ie->dtim_period;
+ }
}
if (elems->ds_params && elems->ds_params_len == 1)
@@ -3413,20 +3425,39 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
/* kick off associate process */
ifmgd->assoc_data = assoc_data;
+ ifmgd->dtim_period = 0;
err = ieee80211_prep_connection(sdata, req->bss, true);
if (err)
goto err_clear;
- if (!bss->dtim_period &&
- sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
- /*
- * Wait up to one beacon interval ...
- * should this be more if we miss one?
- */
- printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
- sdata->name, ifmgd->bssid);
- assoc_data->timeout = TU_TO_EXP_TIME(req->bss->beacon_interval);
+ if (sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {
+ const u8 *beacon_ies = req->bss->beacon_ies;
+ size_t beacon_ies_len = req->bss->len_beacon_ies;
+
+ if (!beacon_ies_len) {
+ /*
+ * Wait up to one beacon interval ...
+ * should this be more if we miss one?
+ */
+ printk(KERN_DEBUG "%s: waiting for beacon from %pM\n",
+ sdata->name, ifmgd->bssid);
+ assoc_data->timeout =
+ TU_TO_EXP_TIME(req->bss->beacon_interval);
+ } else {
+ const u8 *tim_ie = cfg80211_find_ie(WLAN_EID_TIM,
+ beacon_ies,
+ beacon_ies_len);
+ if (tim_ie && tim_ie[1] >=
+ sizeof(struct ieee80211_tim_ie)) {
+ const struct ieee80211_tim_ie *tim;
+ tim = (void *)(tim_ie + 2);
+ ifmgd->dtim_period = tim->dtim_period;
+ }
+ assoc_data->have_beacon = true;
+ assoc_data->sent_assoc = false;
+ assoc_data->timeout = jiffies;
+ }
} else {
assoc_data->have_beacon = true;
assoc_data->sent_assoc = false;
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c
index fd973e5..58ac7d0 100644
--- a/net/mac80211/scan.c
+++ b/net/mac80211/scan.c
@@ -112,19 +112,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
bss->valid_data |= IEEE80211_BSS_VALID_ERP;
}
- if (elems->tim && (!elems->parse_error ||
- !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) {
- struct ieee80211_tim_ie *tim_ie =
- (struct ieee80211_tim_ie *)elems->tim;
- bss->dtim_period = tim_ie->dtim_period;
- if (!elems->parse_error)
- bss->valid_data |= IEEE80211_BSS_VALID_DTIM;
- }
-
- /* If the beacon had no TIM IE, or it was invalid, use 1 */
- if (beacon && !bss->dtim_period)
- bss->dtim_period = 1;
-
/* replace old supported rates if we get new values */
if (!elems->parse_error ||
!(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
--
1.7.9.5
next prev parent reply other threads:[~2013-01-24 3:28 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-24 3:26 [ 3.5.y.z extended stable ] Linux 3.5.7.4 stable review Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 01/74] usb: gadget: dummy: fix enumeration with g_multi Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 02/74] usb: musb: core: print new line in the driver banner again Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 03/74] ASoC: pcm: allow backend hardware to be freed in pause state Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 04/74] ASoC: wm2200: Fix setting dai format in wm2200_set_fmt Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 05/74] mac80211: fix ibss scanning Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 06/74] mac80211: use del_timer_sync for final sta cleanup timer deletion Herton Ronaldo Krzesinski
2013-01-24 3:26 ` Herton Ronaldo Krzesinski [this message]
2013-01-24 3:26 ` [PATCH 08/74] xhci: Handle HS bulk/ctrl endpoints that don't NAK Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 09/74] USB: Handle auto-transition from hot to warm reset Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 10/74] USB: Ignore xHCI Reset Device status Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 11/74] USB: Allow USB 3.0 ports to be disabled Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 12/74] USB: Increase reset timeout Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 13/74] USB: Ignore port state until reset completes Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 14/74] USB: Handle warm reset failure on empty port Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 15/74] xhci: Avoid "dead ports", add roothub port polling Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 16/74] ASoC: wm2200: Remove DSP B and left justified AIF modes Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 17/74] ASoC: wm5100: Remove DSP B and left justified formats Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 18/74] mwifiex: check wait_event_interruptible return value Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 19/74] ASoC: wm2000: Fix sense of speech clarity enable Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 20/74] drm/i915; Only increment the user-pin-count after successfully pinning the bo Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 21/74] samsung-laptop: Add quirk for broken acpi_video backlight on N250P Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 22/74] sony-laptop: fix SNC buffer calls when SN06 returns Integers Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 23/74] staging: r8712u: Add new device ID Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 24/74] b43: Fix firmware loading when driver is built into the kernel Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 25/74] staging: speakup: avoid out-of-range access in synth_init() Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 26/74] staging: speakup: avoid out-of-range access in synth_add() Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 27/74] staging: comedi: fix minimum AO period for NI 625x and NI 628x Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 28/74] staging: comedi: prevent auto-unconfig of manually configured devices Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 29/74] staging: comedi: comedi_test: fix race when cancelling command Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 30/74] regulator: max8997: Use uV in voltage_map_desc Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 31/74] regulator: max8998: Convert to regulator_list_voltage_linear() Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 32/74] regulator: max8998: Convert to set_voltage_sel and regulator_map_voltage_linear Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 33/74] regulator: max8998: Use uV in voltage_map_desc Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 34/74] ALSA: pxa27x: fix ac97 cold reset Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 35/74] ALSA: pxa27x: fix ac97 warm reset Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 36/74] SUNRPC: Ensure we release the socket write lock if the rpc_task exits early Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 37/74] target: use correct sense code for LUN communication failure Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 38/74] Revert "ALSA: hda - Shut up pins at power-saving mode with Conexnat codecs" Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 39/74] regulator: max8998: Ensure enough delay time for max8998_set_voltage_buck_time_sel Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 40/74] radeon/kms: force rn50 chip to always report connected on analog output Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 41/74] tcm_fc: Do not indicate retry capability to initiators Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 42/74] tcm_fc: Do not report target role when target is not defined Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 43/74] target: Fix use-after-free in LUN RESET handling Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 44/74] target: Release se_cmd when LUN lookup fails for TMR Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 45/74] sh: Fix FDPIC binary loader Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 46/74] USB: option: Add new MEDIATEK PID support Herton Ronaldo Krzesinski
2013-01-24 3:26 ` [PATCH 47/74] USB: option: blacklist network interface on ZTE MF880 Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 48/74] USB: option: add Telekom Speedstick LTE II Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 49/74] USB: option: add Nexpring NP10T terminal id Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 50/74] Add CDC-ACM support for the CX93010-2x UCMxx USB Modem Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 51/74] USB: cdc-acm: Add support for "PSC Scanning, Magellan 800i" Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 52/74] USB: hub: handle claim of enabled remote wakeup after reset Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 53/74] mm: compaction: fix echo 1 > compact_memory return error issue Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 54/74] mm: use aligned zone start for pfn_to_bitidx calculation Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 55/74] mm: bootmem: fix free_all_bootmem_core() with odd bitmap alignment Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 56/74] audit: create explicit AUDIT_SECCOMP event type Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 57/74] USB: Add device quirk for Microsoft VX700 webcam Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 58/74] drm/nouveau: fix blank LVDS screen regression on pre-nv50 cards Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 59/74] drm/nv17-50: restore fence buffer on resume Herton Ronaldo Krzesinski
2013-01-24 17:36 ` Marcin Slusarz
2013-01-24 17:52 ` Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 60/74] usb: ftdi_sio: Crucible Technologies COMET Caller ID - pid added Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 61/74] udldrmfb: Fix EDID not working with monitors with EDID extension blocks Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 62/74] udldrmfb: udl_get_edid: usb_control_msg buffer must not be on the stack Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 63/74] udldrmfb: udl_get_edid: drop unneeded i-- Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 64/74] s390/time: fix sched_clock() overflow Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 65/74] rt2800usb: Add support for 2001:3c1e (D-Link DWA-125 rev B1) USB Wi-Fi adapter Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 66/74] drm/radeon: fix NULL pointer dereference in UMS mode Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 67/74] drm/radeon: fix a bogus kfree Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 68/74] ALSA: usb - fix race in creation of M-Audio Fast track pro driver Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 69/74] x86/Sandy Bridge: reserve pages when integrated graphics is present Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 70/74] USB: io_ti: Fix NULL dereference in chase_port() Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 71/74] intel-iommu: Prevent devices with RMRRs from being placed into SI Domain Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 72/74] igb: release already assigned MSI-X interrupts if setup fails Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 73/74] usb: chipidea: Allow disabling streaming not only in udc mode Herton Ronaldo Krzesinski
2013-01-24 3:27 ` [PATCH 74/74] [SCSI] sd: Reshuffle init_sd to avoid crash Herton Ronaldo Krzesinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1358998046-613-8-git-send-email-herton.krzesinski@canonical.com \
--to=herton.krzesinski@canonical.com \
--cc=emmanuel.grumbach@intel.com \
--cc=johannes.berg@intel.com \
--cc=kernel-team@lists.ubuntu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®