diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/mlme.c | 102 |
1 files changed, 56 insertions, 46 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index eababf320b83..0e9bd840e7dd 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -352,6 +352,17 @@ int ieee80211_ht_addt_info_ie_to_ht_bss_info( | |||
352 | return 0; | 352 | return 0; |
353 | } | 353 | } |
354 | 354 | ||
355 | static void ieee80211_sta_send_apinfo(struct ieee80211_sub_if_data *sdata, | ||
356 | struct ieee80211_if_sta *ifsta) | ||
357 | { | ||
358 | union iwreq_data wrqu; | ||
359 | memset(&wrqu, 0, sizeof(wrqu)); | ||
360 | if (ifsta->flags & IEEE80211_STA_ASSOCIATED) | ||
361 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); | ||
362 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | ||
363 | wireless_send_event(sdata->dev, SIOCGIWAP, &wrqu, NULL); | ||
364 | } | ||
365 | |||
355 | static void ieee80211_sta_send_associnfo(struct ieee80211_sub_if_data *sdata, | 366 | static void ieee80211_sta_send_associnfo(struct ieee80211_sub_if_data *sdata, |
356 | struct ieee80211_if_sta *ifsta) | 367 | struct ieee80211_if_sta *ifsta) |
357 | { | 368 | { |
@@ -373,68 +384,53 @@ static void ieee80211_sta_send_associnfo(struct ieee80211_sub_if_data *sdata, | |||
373 | 384 | ||
374 | 385 | ||
375 | static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, | 386 | static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, |
376 | struct ieee80211_if_sta *ifsta, | 387 | struct ieee80211_if_sta *ifsta) |
377 | bool assoc) | ||
378 | { | 388 | { |
379 | struct ieee80211_local *local = sdata->local; | 389 | struct ieee80211_local *local = sdata->local; |
380 | struct ieee80211_conf *conf = &local_to_hw(local)->conf; | 390 | struct ieee80211_conf *conf = &local_to_hw(local)->conf; |
381 | union iwreq_data wrqu; | ||
382 | u32 changed = BSS_CHANGED_ASSOC; | 391 | u32 changed = BSS_CHANGED_ASSOC; |
383 | 392 | ||
384 | if (assoc) { | 393 | struct ieee80211_sta_bss *bss; |
385 | struct ieee80211_sta_bss *bss; | ||
386 | |||
387 | ifsta->flags |= IEEE80211_STA_ASSOCIATED; | ||
388 | 394 | ||
389 | if (sdata->vif.type != IEEE80211_IF_TYPE_STA) | 395 | ifsta->flags |= IEEE80211_STA_ASSOCIATED; |
390 | return; | ||
391 | 396 | ||
392 | bss = ieee80211_rx_bss_get(local, ifsta->bssid, | 397 | if (sdata->vif.type != IEEE80211_IF_TYPE_STA) |
393 | conf->channel->center_freq, | 398 | return; |
394 | ifsta->ssid, ifsta->ssid_len); | ||
395 | if (bss) { | ||
396 | /* set timing information */ | ||
397 | sdata->bss_conf.beacon_int = bss->beacon_int; | ||
398 | sdata->bss_conf.timestamp = bss->timestamp; | ||
399 | sdata->bss_conf.dtim_period = bss->dtim_period; | ||
400 | 399 | ||
401 | changed |= ieee80211_handle_bss_capability(sdata, bss); | 400 | bss = ieee80211_rx_bss_get(local, ifsta->bssid, |
401 | conf->channel->center_freq, | ||
402 | ifsta->ssid, ifsta->ssid_len); | ||
403 | if (bss) { | ||
404 | /* set timing information */ | ||
405 | sdata->bss_conf.beacon_int = bss->beacon_int; | ||
406 | sdata->bss_conf.timestamp = bss->timestamp; | ||
407 | sdata->bss_conf.dtim_period = bss->dtim_period; | ||
402 | 408 | ||
403 | ieee80211_rx_bss_put(local, bss); | 409 | changed |= ieee80211_handle_bss_capability(sdata, bss); |
404 | } | ||
405 | 410 | ||
406 | if (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) { | 411 | ieee80211_rx_bss_put(local, bss); |
407 | changed |= BSS_CHANGED_HT; | 412 | } |
408 | sdata->bss_conf.assoc_ht = 1; | ||
409 | sdata->bss_conf.ht_conf = &conf->ht_conf; | ||
410 | sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf; | ||
411 | } | ||
412 | 413 | ||
413 | ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; | 414 | if (conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) { |
414 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); | 415 | changed |= BSS_CHANGED_HT; |
415 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); | 416 | sdata->bss_conf.assoc_ht = 1; |
416 | ieee80211_sta_send_associnfo(sdata, ifsta); | 417 | sdata->bss_conf.ht_conf = &conf->ht_conf; |
417 | } else { | 418 | sdata->bss_conf.ht_bss_conf = &conf->ht_bss_conf; |
418 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; | 419 | } |
419 | changed |= ieee80211_reset_erp_info(sdata); | ||
420 | 420 | ||
421 | sdata->bss_conf.assoc_ht = 0; | 421 | ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; |
422 | sdata->bss_conf.ht_conf = NULL; | 422 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); |
423 | sdata->bss_conf.ht_bss_conf = NULL; | 423 | ieee80211_sta_send_associnfo(sdata, ifsta); |
424 | 424 | ||
425 | memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); | ||
426 | } | ||
427 | ifsta->last_probe = jiffies; | 425 | ifsta->last_probe = jiffies; |
428 | ieee80211_led_assoc(local, assoc); | 426 | ieee80211_led_assoc(local, 1); |
429 | 427 | ||
430 | sdata->bss_conf.assoc = assoc; | 428 | sdata->bss_conf.assoc = 1; |
431 | ieee80211_bss_info_change_notify(sdata, changed); | 429 | ieee80211_bss_info_change_notify(sdata, changed); |
432 | 430 | ||
433 | if (assoc) | 431 | netif_carrier_on(sdata->dev); |
434 | netif_carrier_on(sdata->dev); | ||
435 | 432 | ||
436 | wrqu.ap_addr.sa_family = ARPHRD_ETHER; | 433 | ieee80211_sta_send_apinfo(sdata, ifsta); |
437 | wireless_send_event(sdata->dev, SIOCGIWAP, &wrqu, NULL); | ||
438 | } | 434 | } |
439 | 435 | ||
440 | void ieee80211_sta_tx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, | 436 | void ieee80211_sta_tx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb, |
@@ -836,6 +832,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
836 | { | 832 | { |
837 | struct ieee80211_local *local = sdata->local; | 833 | struct ieee80211_local *local = sdata->local; |
838 | struct sta_info *sta; | 834 | struct sta_info *sta; |
835 | u32 changed = BSS_CHANGED_ASSOC; | ||
839 | 836 | ||
840 | rcu_read_lock(); | 837 | rcu_read_lock(); |
841 | 838 | ||
@@ -863,7 +860,20 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
863 | ieee80211_send_disassoc(sdata, ifsta, reason); | 860 | ieee80211_send_disassoc(sdata, ifsta, reason); |
864 | } | 861 | } |
865 | 862 | ||
866 | ieee80211_set_associated(sdata, ifsta, 0); | 863 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; |
864 | changed |= ieee80211_reset_erp_info(sdata); | ||
865 | |||
866 | if (sdata->bss_conf.assoc_ht) | ||
867 | changed |= BSS_CHANGED_HT; | ||
868 | |||
869 | sdata->bss_conf.assoc_ht = 0; | ||
870 | sdata->bss_conf.ht_conf = NULL; | ||
871 | sdata->bss_conf.ht_bss_conf = NULL; | ||
872 | |||
873 | ieee80211_led_assoc(local, 0); | ||
874 | sdata->bss_conf.assoc = 0; | ||
875 | |||
876 | ieee80211_sta_send_apinfo(sdata, ifsta); | ||
867 | 877 | ||
868 | if (self_disconnected) | 878 | if (self_disconnected) |
869 | ifsta->state = IEEE80211_STA_MLME_DISABLED; | 879 | ifsta->state = IEEE80211_STA_MLME_DISABLED; |
@@ -2081,7 +2091,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | |||
2081 | * ieee80211_set_associated() will tell the driver */ | 2091 | * ieee80211_set_associated() will tell the driver */ |
2082 | bss_conf->aid = aid; | 2092 | bss_conf->aid = aid; |
2083 | bss_conf->assoc_capability = capab_info; | 2093 | bss_conf->assoc_capability = capab_info; |
2084 | ieee80211_set_associated(sdata, ifsta, 1); | 2094 | ieee80211_set_associated(sdata, ifsta); |
2085 | 2095 | ||
2086 | ieee80211_associated(sdata, ifsta); | 2096 | ieee80211_associated(sdata, ifsta); |
2087 | } | 2097 | } |