aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/debugfs_netdev.c14
-rw-r--r--net/mac80211/ieee80211.c2
-rw-r--r--net/mac80211/ieee80211_i.h26
-rw-r--r--net/mac80211/ieee80211_iface.c8
-rw-r--r--net/mac80211/ieee80211_ioctl.c57
-rw-r--r--net/mac80211/ieee80211_sta.c102
6 files changed, 121 insertions, 88 deletions
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
index 095be91829ca..099dac95b09b 100644
--- a/net/mac80211/debugfs_netdev.c
+++ b/net/mac80211/debugfs_netdev.c
@@ -112,13 +112,13 @@ static ssize_t ieee80211_if_fmt_flags(
112 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) 112 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen)
113{ 113{
114 return scnprintf(buf, buflen, "%s%s%s%s%s%s%s\n", 114 return scnprintf(buf, buflen, "%s%s%s%s%s%s%s\n",
115 sdata->u.sta.ssid_set ? "SSID\n" : "", 115 sdata->u.sta.flags & IEEE80211_STA_SSID_SET ? "SSID\n" : "",
116 sdata->u.sta.bssid_set ? "BSSID\n" : "", 116 sdata->u.sta.flags & IEEE80211_STA_BSSID_SET ? "BSSID\n" : "",
117 sdata->u.sta.prev_bssid_set ? "prev BSSID\n" : "", 117 sdata->u.sta.flags & IEEE80211_STA_PREV_BSSID_SET ? "prev BSSID\n" : "",
118 sdata->u.sta.authenticated ? "AUTH\n" : "", 118 sdata->u.sta.flags & IEEE80211_STA_AUTHENTICATED ? "AUTH\n" : "",
119 sdata->u.sta.associated ? "ASSOC\n" : "", 119 sdata->u.sta.flags & IEEE80211_STA_ASSOCIATED ? "ASSOC\n" : "",
120 sdata->u.sta.probereq_poll ? "PROBEREQ POLL\n" : "", 120 sdata->u.sta.flags & IEEE80211_STA_PROBEREQ_POLL ? "PROBEREQ POLL\n" : "",
121 sdata->use_protection ? "CTS prot\n" : ""); 121 sdata->use_protection ? "CTS prot\n" : "");
122} 122}
123__IEEE80211_IF_FILE(flags); 123__IEEE80211_IF_FILE(flags);
124 124
diff --git a/net/mac80211/ieee80211.c b/net/mac80211/ieee80211.c
index 289b33ce45cf..be678c61afa5 100644
--- a/net/mac80211/ieee80211.c
+++ b/net/mac80211/ieee80211.c
@@ -354,7 +354,7 @@ static void ieee80211_if_open(struct net_device *dev)
354 switch (sdata->type) { 354 switch (sdata->type) {
355 case IEEE80211_IF_TYPE_STA: 355 case IEEE80211_IF_TYPE_STA:
356 case IEEE80211_IF_TYPE_IBSS: 356 case IEEE80211_IF_TYPE_IBSS:
357 sdata->u.sta.prev_bssid_set = 0; 357 sdata->u.sta.flags &= ~IEEE80211_STA_PREV_BSSID_SET;
358 break; 358 break;
359 } 359 }
360} 360}
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 9888611660b7..28c5d514e6d5 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -217,6 +217,19 @@ struct ieee80211_if_vlan {
217 u8 id; 217 u8 id;
218}; 218};
219 219
220/* flags used in struct ieee80211_if_sta.flags */
221#define IEEE80211_STA_SSID_SET BIT(0)
222#define IEEE80211_STA_BSSID_SET BIT(1)
223#define IEEE80211_STA_PREV_BSSID_SET BIT(2)
224#define IEEE80211_STA_AUTHENTICATED BIT(3)
225#define IEEE80211_STA_ASSOCIATED BIT(4)
226#define IEEE80211_STA_PROBEREQ_POLL BIT(5)
227#define IEEE80211_STA_CREATE_IBSS BIT(6)
228#define IEEE80211_STA_MIXED_CELL BIT(7)
229#define IEEE80211_STA_WMM_ENABLED BIT(8)
230#define IEEE80211_STA_AUTO_SSID_SEL BIT(10)
231#define IEEE80211_STA_AUTO_BSSID_SEL BIT(11)
232#define IEEE80211_STA_AUTO_CHANNEL_SEL BIT(12)
220struct ieee80211_if_sta { 233struct ieee80211_if_sta {
221 enum { 234 enum {
222 IEEE80211_DISABLED, IEEE80211_AUTHENTICATE, 235 IEEE80211_DISABLED, IEEE80211_AUTHENTICATE,
@@ -239,18 +252,7 @@ struct ieee80211_if_sta {
239 252
240 int auth_tries, assoc_tries; 253 int auth_tries, assoc_tries;
241 254
242 unsigned int ssid_set:1; 255 unsigned int flags;
243 unsigned int bssid_set:1;
244 unsigned int prev_bssid_set:1;
245 unsigned int authenticated:1;
246 unsigned int associated:1;
247 unsigned int probereq_poll:1;
248 unsigned int create_ibss:1;
249 unsigned int mixed_cell:1;
250 unsigned int wmm_enabled:1;
251 unsigned int auto_ssid_sel:1;
252 unsigned int auto_bssid_sel:1;
253 unsigned int auto_channel_sel:1;
254#define IEEE80211_STA_REQ_SCAN 0 256#define IEEE80211_STA_REQ_SCAN 0
255#define IEEE80211_STA_REQ_AUTH 1 257#define IEEE80211_STA_REQ_AUTH 1
256#define IEEE80211_STA_REQ_RUN 2 258#define IEEE80211_STA_REQ_RUN 2
diff --git a/net/mac80211/ieee80211_iface.c b/net/mac80211/ieee80211_iface.c
index 6db67767801d..61009176d51b 100644
--- a/net/mac80211/ieee80211_iface.c
+++ b/net/mac80211/ieee80211_iface.c
@@ -187,10 +187,10 @@ void ieee80211_if_set_type(struct net_device *dev, int type)
187 ifsta->capab = WLAN_CAPABILITY_ESS; 187 ifsta->capab = WLAN_CAPABILITY_ESS;
188 ifsta->auth_algs = IEEE80211_AUTH_ALG_OPEN | 188 ifsta->auth_algs = IEEE80211_AUTH_ALG_OPEN |
189 IEEE80211_AUTH_ALG_SHARED_KEY; 189 IEEE80211_AUTH_ALG_SHARED_KEY;
190 ifsta->create_ibss = 1; 190 ifsta->flags |= IEEE80211_STA_CREATE_IBSS |
191 ifsta->wmm_enabled = 1; 191 IEEE80211_STA_WMM_ENABLED |
192 ifsta->auto_channel_sel = 1; 192 IEEE80211_STA_AUTO_BSSID_SEL |
193 ifsta->auto_bssid_sel = 1; 193 IEEE80211_STA_AUTO_CHANNEL_SEL;
194 194
195 msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev); 195 msdata = IEEE80211_DEV_TO_SUB_IF(sdata->local->mdev);
196 sdata->bss = &msdata->u.ap; 196 sdata->bss = &msdata->u.ap;
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c
index 643c8855801c..ea2e0f958ac3 100644
--- a/net/mac80211/ieee80211_ioctl.c
+++ b/net/mac80211/ieee80211_ioctl.c
@@ -270,7 +270,7 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
270 int ret = ieee80211_sta_set_extra_ie(dev, extra, data->length); 270 int ret = ieee80211_sta_set_extra_ie(dev, extra, data->length);
271 if (ret) 271 if (ret)
272 return ret; 272 return ret;
273 sdata->u.sta.auto_bssid_sel = 0; 273 sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
274 ieee80211_sta_req_auth(dev, &sdata->u.sta); 274 ieee80211_sta_req_auth(dev, &sdata->u.sta);
275 return 0; 275 return 0;
276 } 276 }
@@ -502,13 +502,14 @@ static int ieee80211_ioctl_siwfreq(struct net_device *dev,
502 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); 502 struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
503 503
504 if (sdata->type == IEEE80211_IF_TYPE_STA) 504 if (sdata->type == IEEE80211_IF_TYPE_STA)
505 sdata->u.sta.auto_channel_sel = 0; 505 sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_CHANNEL_SEL;
506 506
507 /* freq->e == 0: freq->m = channel; otherwise freq = m * 10^e */ 507 /* freq->e == 0: freq->m = channel; otherwise freq = m * 10^e */
508 if (freq->e == 0) { 508 if (freq->e == 0) {
509 if (freq->m < 0) { 509 if (freq->m < 0) {
510 if (sdata->type == IEEE80211_IF_TYPE_STA) 510 if (sdata->type == IEEE80211_IF_TYPE_STA)
511 sdata->u.sta.auto_channel_sel = 1; 511 sdata->u.sta.flags |=
512 IEEE80211_STA_AUTO_CHANNEL_SEL;
512 return 0; 513 return 0;
513 } else 514 } else
514 return ieee80211_set_channel(local, freq->m, -1); 515 return ieee80211_set_channel(local, freq->m, -1);
@@ -563,7 +564,10 @@ static int ieee80211_ioctl_siwessid(struct net_device *dev,
563 sdata->u.sta.ssid_len = len; 564 sdata->u.sta.ssid_len = len;
564 return 0; 565 return 0;
565 } 566 }
566 sdata->u.sta.auto_ssid_sel = !data->flags; 567 if (data->flags)
568 sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_SSID_SEL;
569 else
570 sdata->u.sta.flags |= IEEE80211_STA_AUTO_SSID_SEL;
567 ret = ieee80211_sta_set_ssid(dev, ssid, len); 571 ret = ieee80211_sta_set_ssid(dev, ssid, len);
568 if (ret) 572 if (ret)
569 return ret; 573 return ret;
@@ -630,13 +634,13 @@ static int ieee80211_ioctl_siwap(struct net_device *dev,
630 ETH_ALEN); 634 ETH_ALEN);
631 return 0; 635 return 0;
632 } 636 }
633 if (is_zero_ether_addr((u8 *) &ap_addr->sa_data)) { 637 if (is_zero_ether_addr((u8 *) &ap_addr->sa_data))
634 sdata->u.sta.auto_bssid_sel = 1; 638 sdata->u.sta.flags |= IEEE80211_STA_AUTO_BSSID_SEL |
635 sdata->u.sta.auto_channel_sel = 1; 639 IEEE80211_STA_AUTO_CHANNEL_SEL;
636 } else if (is_broadcast_ether_addr((u8 *) &ap_addr->sa_data)) 640 else if (is_broadcast_ether_addr((u8 *) &ap_addr->sa_data))
637 sdata->u.sta.auto_bssid_sel = 1; 641 sdata->u.sta.flags |= IEEE80211_STA_AUTO_BSSID_SEL;
638 else 642 else
639 sdata->u.sta.auto_bssid_sel = 0; 643 sdata->u.sta.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
640 ret = ieee80211_sta_set_bssid(dev, (u8 *) &ap_addr->sa_data); 644 ret = ieee80211_sta_set_bssid(dev, (u8 *) &ap_addr->sa_data);
641 if (ret) 645 if (ret)
642 return ret; 646 return ret;
@@ -1104,8 +1108,12 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
1104 if (sdata->type != IEEE80211_IF_TYPE_STA && 1108 if (sdata->type != IEEE80211_IF_TYPE_STA &&
1105 sdata->type != IEEE80211_IF_TYPE_IBSS) 1109 sdata->type != IEEE80211_IF_TYPE_IBSS)
1106 ret = -EINVAL; 1110 ret = -EINVAL;
1107 else 1111 else {
1108 sdata->u.sta.mixed_cell = !!value; 1112 if (value)
1113 sdata->u.sta.flags |= IEEE80211_STA_MIXED_CELL;
1114 else
1115 sdata->u.sta.flags &= ~IEEE80211_STA_MIXED_CELL;
1116 }
1109 break; 1117 break;
1110 1118
1111 case PRISM2_PARAM_HW_MODES: 1119 case PRISM2_PARAM_HW_MODES:
@@ -1115,15 +1123,23 @@ static int ieee80211_ioctl_prism2_param(struct net_device *dev,
1115 case PRISM2_PARAM_CREATE_IBSS: 1123 case PRISM2_PARAM_CREATE_IBSS:
1116 if (sdata->type != IEEE80211_IF_TYPE_IBSS) 1124 if (sdata->type != IEEE80211_IF_TYPE_IBSS)
1117 ret = -EINVAL; 1125 ret = -EINVAL;
1118 else 1126 else {
1119 sdata->u.sta.create_ibss = !!value; 1127 if (value)
1128 sdata->u.sta.flags |= IEEE80211_STA_CREATE_IBSS;
1129 else
1130 sdata->u.sta.flags &= ~IEEE80211_STA_CREATE_IBSS;
1131 }
1120 break; 1132 break;
1121 case PRISM2_PARAM_WMM_ENABLED: 1133 case PRISM2_PARAM_WMM_ENABLED:
1122 if (sdata->type != IEEE80211_IF_TYPE_STA && 1134 if (sdata->type != IEEE80211_IF_TYPE_STA &&
1123 sdata->type != IEEE80211_IF_TYPE_IBSS) 1135 sdata->type != IEEE80211_IF_TYPE_IBSS)
1124 ret = -EINVAL; 1136 ret = -EINVAL;
1125 else 1137 else {
1126 sdata->u.sta.wmm_enabled = !!value; 1138 if (value)
1139 sdata->u.sta.flags |= IEEE80211_STA_WMM_ENABLED;
1140 else
1141 sdata->u.sta.flags &= ~IEEE80211_STA_WMM_ENABLED;
1142 }
1127 break; 1143 break;
1128 default: 1144 default:
1129 ret = -EOPNOTSUPP; 1145 ret = -EOPNOTSUPP;
@@ -1186,7 +1202,8 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
1186 if (sdata->type != IEEE80211_IF_TYPE_IBSS) 1202 if (sdata->type != IEEE80211_IF_TYPE_IBSS)
1187 ret = -EINVAL; 1203 ret = -EINVAL;
1188 else 1204 else
1189 *param = !!sdata->u.sta.create_ibss; 1205 *param = !!(sdata->u.sta.flags &
1206 IEEE80211_STA_CREATE_IBSS);
1190 break; 1207 break;
1191 1208
1192 case PRISM2_PARAM_MIXED_CELL: 1209 case PRISM2_PARAM_MIXED_CELL:
@@ -1194,14 +1211,16 @@ static int ieee80211_ioctl_get_prism2_param(struct net_device *dev,
1194 sdata->type != IEEE80211_IF_TYPE_IBSS) 1211 sdata->type != IEEE80211_IF_TYPE_IBSS)
1195 ret = -EINVAL; 1212 ret = -EINVAL;
1196 else 1213 else
1197 *param = !!sdata->u.sta.mixed_cell; 1214 *param = !!(sdata->u.sta.flags &
1215 IEEE80211_STA_MIXED_CELL);
1198 break; 1216 break;
1199 case PRISM2_PARAM_WMM_ENABLED: 1217 case PRISM2_PARAM_WMM_ENABLED:
1200 if (sdata->type != IEEE80211_IF_TYPE_STA && 1218 if (sdata->type != IEEE80211_IF_TYPE_STA &&
1201 sdata->type != IEEE80211_IF_TYPE_IBSS) 1219 sdata->type != IEEE80211_IF_TYPE_IBSS)
1202 ret = -EINVAL; 1220 ret = -EINVAL;
1203 else 1221 else
1204 *param = !!sdata->u.sta.wmm_enabled; 1222 *param = !!(sdata->u.sta.flags &
1223 IEEE80211_STA_WMM_ENABLED);
1205 break; 1224 break;
1206 default: 1225 default:
1207 ret = -EOPNOTSUPP; 1226 ret = -EOPNOTSUPP;
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
405static void ieee80211_set_associated(struct net_device *dev, 405static 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);