aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless/core.h
diff options
context:
space:
mode:
authorAntonio Quartulli <antonio@open-mesh.com>2014-01-29 11:53:43 -0500
committerJohannes Berg <johannes.berg@intel.com>2014-02-04 15:58:16 -0500
commitfe94f3a4ffaa20c7470038c69ffc8e545ef5f90a (patch)
treea8056f9f9e74e30679bb4fc852dfe19bd680f51e /net/wireless/core.h
parent67235cbca44f082e9c4c2ed370f9afe5fc478d49 (diff)
cfg80211: fix channel configuration in IBSS join
When receiving an IBSS_JOINED event select the BSS object based on the {bssid, channel} couple rather than the bssid only. With the current approach if another cell having the same BSSID (but using a different channel) exists then cfg80211 picks up the wrong BSS object. The result is a mismatching channel configuration between cfg80211 and the driver, that can lead to any sort of problem. The issue can be triggered by having an IBSS sitting on given channel and then asking the driver to create a new cell using the same BSSID but with a different frequency. By passing the channel to cfg80211_get_bss() we can solve this ambiguity and retrieve/create the correct BSS object. All the users of cfg80211_ibss_joined() have been changed accordingly. Moreover WARN when cfg80211_ibss_joined() gets a NULL channel as argument and remove a bogus call of the same function in ath6kl (it does not make sense to call cfg80211_ibss_joined() with a zero BSSID on ibss-leave). Cc: Kalle Valo <kvalo@qca.qualcomm.com> Cc: Arend van Spriel <arend@broadcom.com> Cc: Bing Zhao <bzhao@marvell.com> Cc: Jussi Kivilinna <jussi.kivilinna@iki.fi> Cc: libertas-dev@lists.infradead.org Acked-by: Kalle Valo <kvalo@qca.qualcomm.com> Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> [minor code cleanup in ath6kl] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/core.h')
-rw-r--r--net/wireless/core.h4
1 files changed, 3 insertions, 1 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 37ec16d7bb1a..8a820f9c4a76 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -210,6 +210,7 @@ struct cfg80211_event {
210 } dc; 210 } dc;
211 struct { 211 struct {
212 u8 bssid[ETH_ALEN]; 212 u8 bssid[ETH_ALEN];
213 struct ieee80211_channel *channel;
213 } ij; 214 } ij;
214 }; 215 };
215}; 216};
@@ -257,7 +258,8 @@ int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
257 struct net_device *dev, bool nowext); 258 struct net_device *dev, bool nowext);
258int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 259int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
259 struct net_device *dev, bool nowext); 260 struct net_device *dev, bool nowext);
260void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid); 261void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
262 struct ieee80211_channel *channel);
261int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, 263int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
262 struct wireless_dev *wdev); 264 struct wireless_dev *wdev);
263 265