diff options
Diffstat (limited to 'net/mac80211/ieee80211_sta.c')
-rw-r--r-- | net/mac80211/ieee80211_sta.c | 102 |
1 files changed, 57 insertions, 45 deletions
diff --git a/net/mac80211/ieee80211_sta.c b/net/mac80211/ieee80211_sta.c index 3757298c5a60..6a57333dc75c 100644 --- a/net/mac80211/ieee80211_sta.c +++ b/net/mac80211/ieee80211_sta.c | |||
@@ -403,18 +403,20 @@ static void ieee80211_sta_send_associnfo(struct net_device *dev, | |||
403 | 403 | ||
404 | 404 | ||
405 | static void ieee80211_set_associated(struct net_device *dev, | 405 | static void ieee80211_set_associated(struct net_device *dev, |
406 | struct ieee80211_if_sta *ifsta, int assoc) | 406 | struct ieee80211_if_sta *ifsta, |
407 | unsigned int assoc) | ||
407 | { | 408 | { |
408 | union iwreq_data wrqu; | 409 | union iwreq_data wrqu; |
409 | 410 | ||
410 | if (ifsta->associated == assoc) | 411 | if (!!(ifsta->flags & IEEE80211_STA_ASSOCIATED) == assoc) |
411 | return; | 412 | return; |
412 | 413 | ||
413 | ifsta->associated = assoc; | ||
414 | |||
415 | if (assoc) { | 414 | if (assoc) { |
416 | struct ieee80211_sub_if_data *sdata; | 415 | struct ieee80211_sub_if_data *sdata; |
417 | struct ieee80211_sta_bss *bss; | 416 | struct ieee80211_sta_bss *bss; |
417 | |||
418 | ifsta->flags |= IEEE80211_STA_ASSOCIATED; | ||
419 | |||
418 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 420 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
419 | if (sdata->type != IEEE80211_IF_TYPE_STA) | 421 | if (sdata->type != IEEE80211_IF_TYPE_STA) |
420 | return; | 422 | return; |
@@ -427,11 +429,13 @@ static void ieee80211_set_associated(struct net_device *dev, | |||
427 | } | 429 | } |
428 | 430 | ||
429 | netif_carrier_on(dev); | 431 | netif_carrier_on(dev); |
430 | ifsta->prev_bssid_set = 1; | 432 | ifsta->flags |= IEEE80211_STA_PREV_BSSID_SET; |
431 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); | 433 | memcpy(ifsta->prev_bssid, sdata->u.sta.bssid, ETH_ALEN); |
432 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); | 434 | memcpy(wrqu.ap_addr.sa_data, sdata->u.sta.bssid, ETH_ALEN); |
433 | ieee80211_sta_send_associnfo(dev, ifsta); | 435 | ieee80211_sta_send_associnfo(dev, ifsta); |
434 | } else { | 436 | } else { |
437 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; | ||
438 | |||
435 | netif_carrier_off(dev); | 439 | netif_carrier_off(dev); |
436 | ieee80211_reset_erp_info(dev); | 440 | ieee80211_reset_erp_info(dev); |
437 | memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); | 441 | memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); |
@@ -579,7 +583,7 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
579 | memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN); | 583 | memcpy(mgmt->sa, dev->dev_addr, ETH_ALEN); |
580 | memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN); | 584 | memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN); |
581 | 585 | ||
582 | if (ifsta->prev_bssid_set) { | 586 | if (ifsta->flags & IEEE80211_STA_PREV_BSSID_SET) { |
583 | skb_put(skb, 10); | 587 | skb_put(skb, 10); |
584 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, | 588 | mgmt->frame_control = IEEE80211_FC(IEEE80211_FTYPE_MGMT, |
585 | IEEE80211_STYPE_REASSOC_REQ); | 589 | IEEE80211_STYPE_REASSOC_REQ); |
@@ -631,7 +635,7 @@ static void ieee80211_send_assoc(struct net_device *dev, | |||
631 | memcpy(pos, ifsta->extra_ie, ifsta->extra_ie_len); | 635 | memcpy(pos, ifsta->extra_ie, ifsta->extra_ie_len); |
632 | } | 636 | } |
633 | 637 | ||
634 | if (wmm && ifsta->wmm_enabled) { | 638 | if (wmm && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) { |
635 | pos = skb_put(skb, 9); | 639 | pos = skb_put(skb, 9); |
636 | *pos++ = WLAN_EID_VENDOR_SPECIFIC; | 640 | *pos++ = WLAN_EID_VENDOR_SPECIFIC; |
637 | *pos++ = 7; /* len */ | 641 | *pos++ = 7; /* len */ |
@@ -718,7 +722,8 @@ static int ieee80211_privacy_mismatch(struct net_device *dev, | |||
718 | struct ieee80211_sta_bss *bss; | 722 | struct ieee80211_sta_bss *bss; |
719 | int res = 0; | 723 | int res = 0; |
720 | 724 | ||
721 | if (!ifsta || ifsta->mixed_cell || ifsta->key_management_enabled) | 725 | if (!ifsta || (ifsta->flags & IEEE80211_STA_MIXED_CELL) || |
726 | ifsta->key_management_enabled) | ||
722 | return 0; | 727 | return 0; |
723 | 728 | ||
724 | bss = ieee80211_rx_bss_get(dev, ifsta->bssid); | 729 | bss = ieee80211_rx_bss_get(dev, ifsta->bssid); |
@@ -786,22 +791,20 @@ static void ieee80211_associated(struct net_device *dev, | |||
786 | disassoc = 0; | 791 | disassoc = 0; |
787 | if (time_after(jiffies, | 792 | if (time_after(jiffies, |
788 | sta->last_rx + IEEE80211_MONITORING_INTERVAL)) { | 793 | sta->last_rx + IEEE80211_MONITORING_INTERVAL)) { |
789 | if (ifsta->probereq_poll) { | 794 | if (ifsta->flags & IEEE80211_STA_PROBEREQ_POLL) { |
790 | printk(KERN_DEBUG "%s: No ProbeResp from " | 795 | printk(KERN_DEBUG "%s: No ProbeResp from " |
791 | "current AP " MAC_FMT " - assume out of " | 796 | "current AP " MAC_FMT " - assume out of " |
792 | "range\n", | 797 | "range\n", |
793 | dev->name, MAC_ARG(ifsta->bssid)); | 798 | dev->name, MAC_ARG(ifsta->bssid)); |
794 | disassoc = 1; | 799 | disassoc = 1; |
795 | sta_info_free(sta); | 800 | sta_info_free(sta); |
796 | ifsta->probereq_poll = 0; | 801 | } else |
797 | } else { | ||
798 | ieee80211_send_probe_req(dev, ifsta->bssid, | 802 | ieee80211_send_probe_req(dev, ifsta->bssid, |
799 | local->scan_ssid, | 803 | local->scan_ssid, |
800 | local->scan_ssid_len); | 804 | local->scan_ssid_len); |
801 | ifsta->probereq_poll = 1; | 805 | ifsta->flags ^= IEEE80211_STA_PROBEREQ_POLL; |
802 | } | ||
803 | } else { | 806 | } else { |
804 | ifsta->probereq_poll = 0; | 807 | ifsta->flags &= ~IEEE80211_STA_PROBEREQ_POLL; |
805 | if (time_after(jiffies, ifsta->last_probe + | 808 | if (time_after(jiffies, ifsta->last_probe + |
806 | IEEE80211_PROBE_INTERVAL)) { | 809 | IEEE80211_PROBE_INTERVAL)) { |
807 | ifsta->last_probe = jiffies; | 810 | ifsta->last_probe = jiffies; |
@@ -905,7 +908,7 @@ static void ieee80211_auth_completed(struct net_device *dev, | |||
905 | struct ieee80211_if_sta *ifsta) | 908 | struct ieee80211_if_sta *ifsta) |
906 | { | 909 | { |
907 | printk(KERN_DEBUG "%s: authenticated\n", dev->name); | 910 | printk(KERN_DEBUG "%s: authenticated\n", dev->name); |
908 | ifsta->authenticated = 1; | 911 | ifsta->flags |= IEEE80211_STA_AUTHENTICATED; |
909 | ieee80211_associate(dev, ifsta); | 912 | ieee80211_associate(dev, ifsta); |
910 | } | 913 | } |
911 | 914 | ||
@@ -1092,7 +1095,7 @@ static void ieee80211_rx_mgmt_deauth(struct net_device *dev, | |||
1092 | " (reason=%d)\n", | 1095 | " (reason=%d)\n", |
1093 | dev->name, MAC_ARG(mgmt->sa), reason_code); | 1096 | dev->name, MAC_ARG(mgmt->sa), reason_code); |
1094 | 1097 | ||
1095 | if (ifsta->authenticated) { | 1098 | if (ifsta->flags & IEEE80211_STA_AUTHENTICATED) { |
1096 | printk(KERN_DEBUG "%s: deauthenticated\n", dev->name); | 1099 | printk(KERN_DEBUG "%s: deauthenticated\n", dev->name); |
1097 | } | 1100 | } |
1098 | 1101 | ||
@@ -1105,7 +1108,7 @@ static void ieee80211_rx_mgmt_deauth(struct net_device *dev, | |||
1105 | } | 1108 | } |
1106 | 1109 | ||
1107 | ieee80211_set_disassoc(dev, ifsta, 1); | 1110 | ieee80211_set_disassoc(dev, ifsta, 1); |
1108 | ifsta->authenticated = 0; | 1111 | ifsta->flags &= ~IEEE80211_STA_AUTHENTICATED; |
1109 | } | 1112 | } |
1110 | 1113 | ||
1111 | 1114 | ||
@@ -1137,7 +1140,7 @@ static void ieee80211_rx_mgmt_disassoc(struct net_device *dev, | |||
1137 | " (reason=%d)\n", | 1140 | " (reason=%d)\n", |
1138 | dev->name, MAC_ARG(mgmt->sa), reason_code); | 1141 | dev->name, MAC_ARG(mgmt->sa), reason_code); |
1139 | 1142 | ||
1140 | if (ifsta->associated) | 1143 | if (ifsta->flags & IEEE80211_STA_ASSOCIATED) |
1141 | printk(KERN_DEBUG "%s: disassociated\n", dev->name); | 1144 | printk(KERN_DEBUG "%s: disassociated\n", dev->name); |
1142 | 1145 | ||
1143 | if (ifsta->state == IEEE80211_ASSOCIATED) { | 1146 | if (ifsta->state == IEEE80211_ASSOCIATED) { |
@@ -1209,7 +1212,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev, | |||
1209 | /* if this was a reassociation, ensure we try a "full" | 1212 | /* if this was a reassociation, ensure we try a "full" |
1210 | * association next time. This works around some broken APs | 1213 | * association next time. This works around some broken APs |
1211 | * which do not correctly reject reassociation requests. */ | 1214 | * which do not correctly reject reassociation requests. */ |
1212 | ifsta->prev_bssid_set = 0; | 1215 | ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET; |
1213 | return; | 1216 | return; |
1214 | } | 1217 | } |
1215 | 1218 | ||
@@ -1296,7 +1299,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct net_device *dev, | |||
1296 | 1299 | ||
1297 | rate_control_rate_init(sta, local); | 1300 | rate_control_rate_init(sta, local); |
1298 | 1301 | ||
1299 | if (elems.wmm_param && ifsta->wmm_enabled) { | 1302 | if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) { |
1300 | sta->flags |= WLAN_STA_WME; | 1303 | sta->flags |= WLAN_STA_WME; |
1301 | ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param, | 1304 | ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param, |
1302 | elems.wmm_param_len); | 1305 | elems.wmm_param_len); |
@@ -1693,7 +1696,7 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev, | |||
1693 | return; | 1696 | return; |
1694 | ifsta = &sdata->u.sta; | 1697 | ifsta = &sdata->u.sta; |
1695 | 1698 | ||
1696 | if (!ifsta->associated || | 1699 | if (!(ifsta->flags & IEEE80211_STA_ASSOCIATED) || |
1697 | memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0) | 1700 | memcmp(ifsta->bssid, mgmt->bssid, ETH_ALEN) != 0) |
1698 | return; | 1701 | return; |
1699 | 1702 | ||
@@ -1709,7 +1712,7 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev, | |||
1709 | if (elems.erp_info && elems.erp_info_len >= 1) | 1712 | if (elems.erp_info && elems.erp_info_len >= 1) |
1710 | ieee80211_handle_erp_ie(dev, elems.erp_info[0]); | 1713 | ieee80211_handle_erp_ie(dev, elems.erp_info[0]); |
1711 | 1714 | ||
1712 | if (elems.wmm_param && ifsta->wmm_enabled) { | 1715 | if (elems.wmm_param && (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) { |
1713 | ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param, | 1716 | ieee80211_sta_wmm_params(dev, ifsta, elems.wmm_param, |
1714 | elems.wmm_param_len); | 1717 | elems.wmm_param_len); |
1715 | } | 1718 | } |
@@ -2076,7 +2079,8 @@ static void ieee80211_sta_reset_auth(struct net_device *dev, | |||
2076 | printk(KERN_DEBUG "%s: Initial auth_alg=%d\n", dev->name, | 2079 | printk(KERN_DEBUG "%s: Initial auth_alg=%d\n", dev->name, |
2077 | ifsta->auth_alg); | 2080 | ifsta->auth_alg); |
2078 | ifsta->auth_transaction = -1; | 2081 | ifsta->auth_transaction = -1; |
2079 | ifsta->associated = ifsta->auth_tries = ifsta->assoc_tries = 0; | 2082 | ifsta->flags &= ~IEEE80211_STA_ASSOCIATED; |
2083 | ifsta->auth_tries = ifsta->assoc_tries = 0; | ||
2080 | netif_carrier_off(dev); | 2084 | netif_carrier_off(dev); |
2081 | } | 2085 | } |
2082 | 2086 | ||
@@ -2090,8 +2094,10 @@ void ieee80211_sta_req_auth(struct net_device *dev, | |||
2090 | if (sdata->type != IEEE80211_IF_TYPE_STA) | 2094 | if (sdata->type != IEEE80211_IF_TYPE_STA) |
2091 | return; | 2095 | return; |
2092 | 2096 | ||
2093 | if ((ifsta->bssid_set || ifsta->auto_bssid_sel) && | 2097 | if ((ifsta->flags & (IEEE80211_STA_BSSID_SET | |
2094 | (ifsta->ssid_set || ifsta->auto_ssid_sel)) { | 2098 | IEEE80211_STA_AUTO_BSSID_SEL)) && |
2099 | (ifsta->flags & (IEEE80211_STA_SSID_SET | | ||
2100 | IEEE80211_STA_AUTO_SSID_SEL))) { | ||
2095 | set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request); | 2101 | set_bit(IEEE80211_STA_REQ_AUTH, &ifsta->request); |
2096 | queue_work(local->hw.workqueue, &ifsta->work); | 2102 | queue_work(local->hw.workqueue, &ifsta->work); |
2097 | } | 2103 | } |
@@ -2105,7 +2111,7 @@ static int ieee80211_sta_match_ssid(struct ieee80211_if_sta *ifsta, | |||
2105 | if (!memcmp(ifsta->ssid, ssid, ssid_len)) | 2111 | if (!memcmp(ifsta->ssid, ssid, ssid_len)) |
2106 | return 1; | 2112 | return 1; |
2107 | 2113 | ||
2108 | if (ifsta->auto_bssid_sel) | 2114 | if (ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL) |
2109 | return 0; | 2115 | return 0; |
2110 | 2116 | ||
2111 | hidden_ssid = 1; | 2117 | hidden_ssid = 1; |
@@ -2134,8 +2140,8 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
2134 | struct ieee80211_sta_bss *bss, *selected = NULL; | 2140 | struct ieee80211_sta_bss *bss, *selected = NULL; |
2135 | int top_rssi = 0, freq; | 2141 | int top_rssi = 0, freq; |
2136 | 2142 | ||
2137 | if (!ifsta->auto_channel_sel && !ifsta->auto_bssid_sel && | 2143 | if (!(ifsta->flags & (IEEE80211_STA_AUTO_SSID_SEL | |
2138 | !ifsta->auto_ssid_sel) { | 2144 | IEEE80211_STA_AUTO_BSSID_SEL | IEEE80211_STA_AUTO_CHANNEL_SEL))) { |
2139 | ifsta->state = IEEE80211_AUTHENTICATE; | 2145 | ifsta->state = IEEE80211_AUTHENTICATE; |
2140 | ieee80211_sta_reset_auth(dev, ifsta); | 2146 | ieee80211_sta_reset_auth(dev, ifsta); |
2141 | return 0; | 2147 | return 0; |
@@ -2151,14 +2157,15 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
2151 | !!sdata->default_key) | 2157 | !!sdata->default_key) |
2152 | continue; | 2158 | continue; |
2153 | 2159 | ||
2154 | if (!ifsta->auto_channel_sel && bss->freq != freq) | 2160 | if (!(ifsta->flags & IEEE80211_STA_AUTO_CHANNEL_SEL) && |
2161 | bss->freq != freq) | ||
2155 | continue; | 2162 | continue; |
2156 | 2163 | ||
2157 | if (!ifsta->auto_bssid_sel && | 2164 | if (!(ifsta->flags & IEEE80211_STA_AUTO_BSSID_SEL) && |
2158 | memcmp(bss->bssid, ifsta->bssid, ETH_ALEN)) | 2165 | memcmp(bss->bssid, ifsta->bssid, ETH_ALEN)) |
2159 | continue; | 2166 | continue; |
2160 | 2167 | ||
2161 | if (!ifsta->auto_ssid_sel && | 2168 | if (!(ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL) && |
2162 | !ieee80211_sta_match_ssid(ifsta, bss->ssid, bss->ssid_len)) | 2169 | !ieee80211_sta_match_ssid(ifsta, bss->ssid, bss->ssid_len)) |
2163 | continue; | 2170 | continue; |
2164 | 2171 | ||
@@ -2173,7 +2180,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
2173 | 2180 | ||
2174 | if (selected) { | 2181 | if (selected) { |
2175 | ieee80211_set_channel(local, -1, selected->freq); | 2182 | ieee80211_set_channel(local, -1, selected->freq); |
2176 | if (!ifsta->ssid_set) | 2183 | if (!(ifsta->flags & IEEE80211_STA_SSID_SET)) |
2177 | ieee80211_sta_set_ssid(dev, selected->ssid, | 2184 | ieee80211_sta_set_ssid(dev, selected->ssid, |
2178 | selected->ssid_len); | 2185 | selected->ssid_len); |
2179 | ieee80211_sta_set_bssid(dev, selected->bssid); | 2186 | ieee80211_sta_set_bssid(dev, selected->bssid); |
@@ -2183,7 +2190,7 @@ static int ieee80211_sta_config_auth(struct net_device *dev, | |||
2183 | return 0; | 2190 | return 0; |
2184 | } else { | 2191 | } else { |
2185 | if (ifsta->state != IEEE80211_AUTHENTICATE) { | 2192 | if (ifsta->state != IEEE80211_AUTHENTICATE) { |
2186 | if (ifsta->auto_ssid_sel) | 2193 | if (ifsta->flags & IEEE80211_STA_AUTO_SSID_SEL) |
2187 | ieee80211_sta_start_scan(dev, NULL, 0); | 2194 | ieee80211_sta_start_scan(dev, NULL, 0); |
2188 | else | 2195 | else |
2189 | ieee80211_sta_start_scan(dev, ifsta->ssid, | 2196 | ieee80211_sta_start_scan(dev, ifsta->ssid, |
@@ -2480,10 +2487,10 @@ static int ieee80211_sta_find_ibss(struct net_device *dev, | |||
2480 | 2487 | ||
2481 | if (time_after(jiffies, ifsta->ibss_join_req + | 2488 | if (time_after(jiffies, ifsta->ibss_join_req + |
2482 | IEEE80211_IBSS_JOIN_TIMEOUT)) { | 2489 | IEEE80211_IBSS_JOIN_TIMEOUT)) { |
2483 | if (ifsta->create_ibss && | 2490 | if ((ifsta->flags & IEEE80211_STA_CREATE_IBSS) && |
2484 | local->oper_channel->flag & IEEE80211_CHAN_W_IBSS) | 2491 | local->oper_channel->flag & IEEE80211_CHAN_W_IBSS) |
2485 | return ieee80211_sta_create_ibss(dev, ifsta); | 2492 | return ieee80211_sta_create_ibss(dev, ifsta); |
2486 | if (ifsta->create_ibss) { | 2493 | if (ifsta->flags & IEEE80211_STA_CREATE_IBSS) { |
2487 | printk(KERN_DEBUG "%s: IBSS not allowed on the" | 2494 | printk(KERN_DEBUG "%s: IBSS not allowed on the" |
2488 | " configured channel %d (%d MHz)\n", | 2495 | " configured channel %d (%d MHz)\n", |
2489 | dev->name, local->hw.conf.channel, | 2496 | dev->name, local->hw.conf.channel, |
@@ -2544,13 +2551,17 @@ int ieee80211_sta_set_ssid(struct net_device *dev, char *ssid, size_t len) | |||
2544 | ifsta = &sdata->u.sta; | 2551 | ifsta = &sdata->u.sta; |
2545 | 2552 | ||
2546 | if (ifsta->ssid_len != len || memcmp(ifsta->ssid, ssid, len) != 0) | 2553 | if (ifsta->ssid_len != len || memcmp(ifsta->ssid, ssid, len) != 0) |
2547 | ifsta->prev_bssid_set = 0; | 2554 | ifsta->flags &= ~IEEE80211_STA_PREV_BSSID_SET; |
2548 | memcpy(ifsta->ssid, ssid, len); | 2555 | memcpy(ifsta->ssid, ssid, len); |
2549 | memset(ifsta->ssid + len, 0, IEEE80211_MAX_SSID_LEN - len); | 2556 | memset(ifsta->ssid + len, 0, IEEE80211_MAX_SSID_LEN - len); |
2550 | ifsta->ssid_len = len; | 2557 | ifsta->ssid_len = len; |
2551 | 2558 | ||
2552 | ifsta->ssid_set = len ? 1 : 0; | 2559 | if (len) |
2553 | if (sdata->type == IEEE80211_IF_TYPE_IBSS && !ifsta->bssid_set) { | 2560 | ifsta->flags |= IEEE80211_STA_SSID_SET; |
2561 | else | ||
2562 | ifsta->flags &= ~IEEE80211_STA_SSID_SET; | ||
2563 | if (sdata->type == IEEE80211_IF_TYPE_IBSS && | ||
2564 | !(ifsta->flags & IEEE80211_STA_BSSID_SET)) { | ||
2554 | ifsta->ibss_join_req = jiffies; | 2565 | ifsta->ibss_join_req = jiffies; |
2555 | ifsta->state = IEEE80211_IBSS_SEARCH; | 2566 | ifsta->state = IEEE80211_IBSS_SEARCH; |
2556 | return ieee80211_sta_find_ibss(dev, ifsta); | 2567 | return ieee80211_sta_find_ibss(dev, ifsta); |
@@ -2588,10 +2599,11 @@ int ieee80211_sta_set_bssid(struct net_device *dev, u8 *bssid) | |||
2588 | } | 2599 | } |
2589 | } | 2600 | } |
2590 | 2601 | ||
2591 | if (!is_valid_ether_addr(bssid)) | 2602 | if (is_valid_ether_addr(bssid)) |
2592 | ifsta->bssid_set = 0; | 2603 | ifsta->flags |= IEEE80211_STA_BSSID_SET; |
2593 | else | 2604 | else |
2594 | ifsta->bssid_set = 1; | 2605 | ifsta->flags &= ~IEEE80211_STA_BSSID_SET; |
2606 | |||
2595 | return 0; | 2607 | return 0; |
2596 | } | 2608 | } |
2597 | 2609 | ||
@@ -2658,7 +2670,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw) | |||
2658 | continue; | 2670 | continue; |
2659 | 2671 | ||
2660 | if (sdata->type == IEEE80211_IF_TYPE_STA) { | 2672 | if (sdata->type == IEEE80211_IF_TYPE_STA) { |
2661 | if (sdata->u.sta.associated) | 2673 | if (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED) |
2662 | ieee80211_send_nullfunc(local, sdata, 0); | 2674 | ieee80211_send_nullfunc(local, sdata, 0); |
2663 | ieee80211_sta_timer((unsigned long)sdata); | 2675 | ieee80211_sta_timer((unsigned long)sdata); |
2664 | } | 2676 | } |
@@ -2670,7 +2682,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw) | |||
2670 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 2682 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
2671 | if (sdata->type == IEEE80211_IF_TYPE_IBSS) { | 2683 | if (sdata->type == IEEE80211_IF_TYPE_IBSS) { |
2672 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; | 2684 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; |
2673 | if (!ifsta->bssid_set || | 2685 | if (!(ifsta->flags & IEEE80211_STA_BSSID_SET) || |
2674 | (!ifsta->state == IEEE80211_IBSS_JOINED && | 2686 | (!ifsta->state == IEEE80211_IBSS_JOINED && |
2675 | !ieee80211_sta_active_ibss(dev))) | 2687 | !ieee80211_sta_active_ibss(dev))) |
2676 | ieee80211_sta_find_ibss(dev, ifsta); | 2688 | ieee80211_sta_find_ibss(dev, ifsta); |
@@ -2812,7 +2824,7 @@ static int ieee80211_sta_start_scan(struct net_device *dev, | |||
2812 | 2824 | ||
2813 | netif_stop_queue(sdata->dev); | 2825 | netif_stop_queue(sdata->dev); |
2814 | if (sdata->type == IEEE80211_IF_TYPE_STA && | 2826 | if (sdata->type == IEEE80211_IF_TYPE_STA && |
2815 | sdata->u.sta.associated) | 2827 | (sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED)) |
2816 | ieee80211_send_nullfunc(local, sdata, 1); | 2828 | ieee80211_send_nullfunc(local, sdata, 1); |
2817 | } | 2829 | } |
2818 | read_unlock(&local->sub_if_lock); | 2830 | read_unlock(&local->sub_if_lock); |
@@ -3125,7 +3137,7 @@ int ieee80211_sta_disassociate(struct net_device *dev, u16 reason) | |||
3125 | if (sdata->type != IEEE80211_IF_TYPE_STA) | 3137 | if (sdata->type != IEEE80211_IF_TYPE_STA) |
3126 | return -EINVAL; | 3138 | return -EINVAL; |
3127 | 3139 | ||
3128 | if (!ifsta->associated) | 3140 | if (!(ifsta->flags & IEEE80211_STA_ASSOCIATED)) |
3129 | return -1; | 3141 | return -1; |
3130 | 3142 | ||
3131 | ieee80211_send_disassoc(dev, ifsta, reason); | 3143 | ieee80211_send_disassoc(dev, ifsta, reason); |