From 9df242891ee95c998e23074dd3fea1ad19399291 Mon Sep 17 00:00:00 2001 From: Dmitry Tarnyagin Date: Wed, 10 Aug 2011 19:15:13 +0200 Subject: cw1200: Purge cfg80211 beacon cache before authentication. cw1200 device requires SSID to be available at AUTH stage. cfg80211 beacon cache is designed to handle multi-SSID BSSes, so bss struct returned by cfg80211_get_bss() has random SSID if BSS just changed SSID before authentication (typical for p2p). This is a firmware design fault, however as a workaround cfg80211 beacon cache is purged to make sure target BSS is searchable in rb-tree at the AUTH stage. Likely will not be accepted by community. Change-Id: I38d071e0d32bf414906170a19134718b0e834cce Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28558 Tested-by: Dmitry TARNYAGIN Reviewed-by: Bartosz MARKOWSKI Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/28696 Tested-by: Bartosz MARKOWSKI Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33504 Reviewed-by: Philippe LANGLAIS --- net/mac80211/work.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'net/mac80211/work.c') diff --git a/net/mac80211/work.c b/net/mac80211/work.c index c6dd01a0529..290ddbb4d1d 100644 --- a/net/mac80211/work.c +++ b/net/mac80211/work.c @@ -454,6 +454,30 @@ ieee80211_authenticate(struct ieee80211_work *wk) struct ieee80211_sub_if_data *sdata = wk->sdata; struct ieee80211_local *local = sdata->local; + /* HACK!!! cw1200 device requires SSID to be available at AUTH stage. + * cfg80211 beacon cache is designed to handle multi-SSID BSSes, so + * bss struct returned by cfg80211_get_bss() has random SSID if BSS + * just changed SSID before authentication (typical for p2p). + * This is a firmware design fault, however as a workaround cfg80211 + * beacon cache is purged to make sure target BSS is searchable + * in rb-tree at the AUTH stage. + */ + struct cfg80211_bss *bss; + while (true) { + bss = cfg80211_get_bss(local->hw.wiphy, + wk->probe_auth.bss->channel, + wk->probe_auth.bss->bssid, + NULL, 0, 0, 0); + if (WARN_ON(!bss)) + break; + if (bss == wk->probe_auth.bss) { + cfg80211_put_bss(bss); + break; + } + cfg80211_unlink_bss(local->hw.wiphy, bss); + } + /* End of the hack */ + if (!wk->probe_auth.synced) { int ret = drv_tx_sync(local, sdata, wk->filter_ta, IEEE80211_TX_SYNC_AUTH); -- cgit v1.2.3