diff options
Diffstat (limited to 'net/mac80211/ibss.c')
-rw-r--r-- | net/mac80211/ibss.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index ef6c6b2401d1..5bcde4c3fba1 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
@@ -187,15 +187,17 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, | |||
187 | static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, | 187 | static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, |
188 | struct ieee80211_bss *bss) | 188 | struct ieee80211_bss *bss) |
189 | { | 189 | { |
190 | struct cfg80211_bss *cbss = | ||
191 | container_of((void *)bss, struct cfg80211_bss, priv); | ||
190 | struct ieee80211_supported_band *sband; | 192 | struct ieee80211_supported_band *sband; |
191 | u32 basic_rates; | 193 | u32 basic_rates; |
192 | int i, j; | 194 | int i, j; |
193 | u16 beacon_int = bss->cbss.beacon_interval; | 195 | u16 beacon_int = cbss->beacon_interval; |
194 | 196 | ||
195 | if (beacon_int < 10) | 197 | if (beacon_int < 10) |
196 | beacon_int = 10; | 198 | beacon_int = 10; |
197 | 199 | ||
198 | sband = sdata->local->hw.wiphy->bands[bss->cbss.channel->band]; | 200 | sband = sdata->local->hw.wiphy->bands[cbss->channel->band]; |
199 | 201 | ||
200 | basic_rates = 0; | 202 | basic_rates = 0; |
201 | 203 | ||
@@ -212,12 +214,12 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, | |||
212 | } | 214 | } |
213 | } | 215 | } |
214 | 216 | ||
215 | __ieee80211_sta_join_ibss(sdata, bss->cbss.bssid, | 217 | __ieee80211_sta_join_ibss(sdata, cbss->bssid, |
216 | beacon_int, | 218 | beacon_int, |
217 | bss->cbss.channel, | 219 | cbss->channel, |
218 | basic_rates, | 220 | basic_rates, |
219 | bss->cbss.capability, | 221 | cbss->capability, |
220 | bss->cbss.tsf); | 222 | cbss->tsf); |
221 | } | 223 | } |
222 | 224 | ||
223 | static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | 225 | static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, |
@@ -229,6 +231,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
229 | { | 231 | { |
230 | struct ieee80211_local *local = sdata->local; | 232 | struct ieee80211_local *local = sdata->local; |
231 | int freq; | 233 | int freq; |
234 | struct cfg80211_bss *cbss; | ||
232 | struct ieee80211_bss *bss; | 235 | struct ieee80211_bss *bss; |
233 | struct sta_info *sta; | 236 | struct sta_info *sta; |
234 | struct ieee80211_channel *channel; | 237 | struct ieee80211_channel *channel; |
@@ -283,8 +286,10 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
283 | if (!bss) | 286 | if (!bss) |
284 | return; | 287 | return; |
285 | 288 | ||
289 | cbss = container_of((void *)bss, struct cfg80211_bss, priv); | ||
290 | |||
286 | /* was just updated in ieee80211_bss_info_update */ | 291 | /* was just updated in ieee80211_bss_info_update */ |
287 | beacon_timestamp = bss->cbss.tsf; | 292 | beacon_timestamp = cbss->tsf; |
288 | 293 | ||
289 | /* check if we need to merge IBSS */ | 294 | /* check if we need to merge IBSS */ |
290 | 295 | ||
@@ -297,11 +302,11 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
297 | goto put_bss; | 302 | goto put_bss; |
298 | 303 | ||
299 | /* not an IBSS */ | 304 | /* not an IBSS */ |
300 | if (!(bss->cbss.capability & WLAN_CAPABILITY_IBSS)) | 305 | if (!(cbss->capability & WLAN_CAPABILITY_IBSS)) |
301 | goto put_bss; | 306 | goto put_bss; |
302 | 307 | ||
303 | /* different channel */ | 308 | /* different channel */ |
304 | if (bss->cbss.channel != local->oper_channel) | 309 | if (cbss->channel != local->oper_channel) |
305 | goto put_bss; | 310 | goto put_bss; |
306 | 311 | ||
307 | /* different SSID */ | 312 | /* different SSID */ |
@@ -311,7 +316,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
311 | goto put_bss; | 316 | goto put_bss; |
312 | 317 | ||
313 | /* same BSSID */ | 318 | /* same BSSID */ |
314 | if (memcmp(bss->cbss.bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) | 319 | if (memcmp(cbss->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) |
315 | goto put_bss; | 320 | goto put_bss; |
316 | 321 | ||
317 | if (rx_status->flag & RX_FLAG_TSFT) { | 322 | if (rx_status->flag & RX_FLAG_TSFT) { |
@@ -382,6 +387,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata, | |||
382 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, | 387 | struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, |
383 | u8 *bssid,u8 *addr, u32 supp_rates) | 388 | u8 *bssid,u8 *addr, u32 supp_rates) |
384 | { | 389 | { |
390 | struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; | ||
385 | struct ieee80211_local *local = sdata->local; | 391 | struct ieee80211_local *local = sdata->local; |
386 | struct sta_info *sta; | 392 | struct sta_info *sta; |
387 | int band = local->hw.conf.channel->band; | 393 | int band = local->hw.conf.channel->band; |
@@ -397,6 +403,9 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, | |||
397 | return NULL; | 403 | return NULL; |
398 | } | 404 | } |
399 | 405 | ||
406 | if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) | ||
407 | return NULL; | ||
408 | |||
400 | if (compare_ether_addr(bssid, sdata->u.ibss.bssid)) | 409 | if (compare_ether_addr(bssid, sdata->u.ibss.bssid)) |
401 | return NULL; | 410 | return NULL; |
402 | 411 | ||
@@ -514,7 +523,7 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) | |||
514 | { | 523 | { |
515 | struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; | 524 | struct ieee80211_if_ibss *ifibss = &sdata->u.ibss; |
516 | struct ieee80211_local *local = sdata->local; | 525 | struct ieee80211_local *local = sdata->local; |
517 | struct ieee80211_bss *bss; | 526 | struct cfg80211_bss *cbss; |
518 | struct ieee80211_channel *chan = NULL; | 527 | struct ieee80211_channel *chan = NULL; |
519 | const u8 *bssid = NULL; | 528 | const u8 *bssid = NULL; |
520 | int active_ibss; | 529 | int active_ibss; |
@@ -538,21 +547,23 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) | |||
538 | chan = ifibss->channel; | 547 | chan = ifibss->channel; |
539 | if (!is_zero_ether_addr(ifibss->bssid)) | 548 | if (!is_zero_ether_addr(ifibss->bssid)) |
540 | bssid = ifibss->bssid; | 549 | bssid = ifibss->bssid; |
541 | bss = (void *)cfg80211_get_bss(local->hw.wiphy, chan, bssid, | 550 | cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid, |
542 | ifibss->ssid, ifibss->ssid_len, | 551 | ifibss->ssid, ifibss->ssid_len, |
543 | WLAN_CAPABILITY_IBSS | | 552 | WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY, |
544 | WLAN_CAPABILITY_PRIVACY, | 553 | capability); |
545 | capability); | 554 | |
555 | if (cbss) { | ||
556 | struct ieee80211_bss *bss; | ||
546 | 557 | ||
547 | if (bss) { | 558 | bss = (void *)cbss->priv; |
548 | #ifdef CONFIG_MAC80211_IBSS_DEBUG | 559 | #ifdef CONFIG_MAC80211_IBSS_DEBUG |
549 | printk(KERN_DEBUG " sta_find_ibss: selected %pM current " | 560 | printk(KERN_DEBUG " sta_find_ibss: selected %pM current " |
550 | "%pM\n", bss->cbss.bssid, ifibss->bssid); | 561 | "%pM\n", cbss->bssid, ifibss->bssid); |
551 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ | 562 | #endif /* CONFIG_MAC80211_IBSS_DEBUG */ |
552 | 563 | ||
553 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %pM" | 564 | printk(KERN_DEBUG "%s: Selected IBSS BSSID %pM" |
554 | " based on configured SSID\n", | 565 | " based on configured SSID\n", |
555 | sdata->name, bss->cbss.bssid); | 566 | sdata->name, cbss->bssid); |
556 | 567 | ||
557 | ieee80211_sta_join_ibss(sdata, bss); | 568 | ieee80211_sta_join_ibss(sdata, bss); |
558 | ieee80211_rx_bss_put(local, bss); | 569 | ieee80211_rx_bss_put(local, bss); |
@@ -744,7 +755,7 @@ static void ieee80211_ibss_work(struct work_struct *work) | |||
744 | if (WARN_ON(local->suspended)) | 755 | if (WARN_ON(local->suspended)) |
745 | return; | 756 | return; |
746 | 757 | ||
747 | if (!netif_running(sdata->dev)) | 758 | if (!ieee80211_sdata_running(sdata)) |
748 | return; | 759 | return; |
749 | 760 | ||
750 | if (local->scanning) | 761 | if (local->scanning) |
@@ -827,7 +838,7 @@ void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local) | |||
827 | 838 | ||
828 | mutex_lock(&local->iflist_mtx); | 839 | mutex_lock(&local->iflist_mtx); |
829 | list_for_each_entry(sdata, &local->interfaces, list) { | 840 | list_for_each_entry(sdata, &local->interfaces, list) { |
830 | if (!netif_running(sdata->dev)) | 841 | if (!ieee80211_sdata_running(sdata)) |
831 | continue; | 842 | continue; |
832 | if (sdata->vif.type != NL80211_IFTYPE_ADHOC) | 843 | if (sdata->vif.type != NL80211_IFTYPE_ADHOC) |
833 | continue; | 844 | continue; |