aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/nl80211.h9
-rw-r--r--include/net/cfg80211.h5
-rw-r--r--net/mac80211/cfg.c5
-rw-r--r--net/mac80211/ieee80211_i.h2
-rw-r--r--net/mac80211/mlme.c5
-rw-r--r--net/mac80211/wext.c3
-rw-r--r--net/wireless/nl80211.c3
7 files changed, 29 insertions, 3 deletions
diff --git a/include/linux/nl80211.h b/include/linux/nl80211.h
index aeefccfac0e1..2781525b03d5 100644
--- a/include/linux/nl80211.h
+++ b/include/linux/nl80211.h
@@ -504,6 +504,13 @@ enum nl80211_commands {
504 * @NL80211_ATTR_STA_FLAGS2: Attribute containing a 504 * @NL80211_ATTR_STA_FLAGS2: Attribute containing a
505 * &struct nl80211_sta_flag_update. 505 * &struct nl80211_sta_flag_update.
506 * 506 *
507 * @NL80211_ATTR_CONTROL_PORT: A flag indicating whether user space controls
508 * IEEE 802.1X port, i.e., sets/clears %NL80211_STA_FLAG_AUTHORIZED, in
509 * station mode. If the flag is included in %NL80211_CMD_ASSOCIATE
510 * request, the driver will assume that the port is unauthorized until
511 * authorized by user space. Otherwise, port is marked authorized by
512 * default in station mode.
513 *
507 * @NL80211_ATTR_MAX: highest attribute number currently defined 514 * @NL80211_ATTR_MAX: highest attribute number currently defined
508 * @__NL80211_ATTR_AFTER_LAST: internal use 515 * @__NL80211_ATTR_AFTER_LAST: internal use
509 */ 516 */
@@ -610,6 +617,8 @@ enum nl80211_attrs {
610 617
611 NL80211_ATTR_STA_FLAGS2, 618 NL80211_ATTR_STA_FLAGS2,
612 619
620 NL80211_ATTR_CONTROL_PORT,
621
613 /* add attributes here, update the policy in nl80211.c */ 622 /* add attributes here, update the policy in nl80211.c */
614 623
615 __NL80211_ATTR_AFTER_LAST, 624 __NL80211_ATTR_AFTER_LAST,
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 0dae6b382940..9e17a83d3432 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -655,6 +655,10 @@ struct cfg80211_auth_request {
655 * @ie: Extra IEs to add to (Re)Association Request frame or %NULL 655 * @ie: Extra IEs to add to (Re)Association Request frame or %NULL
656 * @ie_len: Length of ie buffer in octets 656 * @ie_len: Length of ie buffer in octets
657 * @use_mfp: Use management frame protection (IEEE 802.11w) in this association 657 * @use_mfp: Use management frame protection (IEEE 802.11w) in this association
658 * @control_port: Whether user space controls IEEE 802.1X port, i.e.,
659 * sets/clears %NL80211_STA_FLAG_AUTHORIZED. If true, the driver is
660 * required to assume that the port is unauthorized until authorized by
661 * user space. Otherwise, port is marked authorized by default.
658 */ 662 */
659struct cfg80211_assoc_request { 663struct cfg80211_assoc_request {
660 struct ieee80211_channel *chan; 664 struct ieee80211_channel *chan;
@@ -664,6 +668,7 @@ struct cfg80211_assoc_request {
664 const u8 *ie; 668 const u8 *ie;
665 size_t ie_len; 669 size_t ie_len;
666 bool use_mfp; 670 bool use_mfp;
671 bool control_port;
667}; 672};
668 673
669/** 674/**
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index d591a936f5c4..6464bfd232c9 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1265,6 +1265,11 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
1265 sdata->u.mgd.flags &= ~IEEE80211_STA_MFP_ENABLED; 1265 sdata->u.mgd.flags &= ~IEEE80211_STA_MFP_ENABLED;
1266 } 1266 }
1267 1267
1268 if (req->control_port)
1269 sdata->u.mgd.flags |= IEEE80211_STA_CONTROL_PORT;
1270 else
1271 sdata->u.mgd.flags &= ~IEEE80211_STA_CONTROL_PORT;
1272
1268 sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME; 1273 sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME;
1269 sdata->u.mgd.state = IEEE80211_STA_MLME_ASSOCIATE; 1274 sdata->u.mgd.state = IEEE80211_STA_MLME_ASSOCIATE;
1270 ieee80211_sta_req_auth(sdata); 1275 ieee80211_sta_req_auth(sdata);
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 081c57427308..56a49ef446ca 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -235,7 +235,7 @@ struct mesh_preq_queue {
235#define IEEE80211_STA_ASSOCIATED BIT(4) 235#define IEEE80211_STA_ASSOCIATED BIT(4)
236#define IEEE80211_STA_PROBEREQ_POLL BIT(5) 236#define IEEE80211_STA_PROBEREQ_POLL BIT(5)
237#define IEEE80211_STA_CREATE_IBSS BIT(6) 237#define IEEE80211_STA_CREATE_IBSS BIT(6)
238/* hole at 7, please re-use */ 238#define IEEE80211_STA_CONTROL_PORT BIT(7)
239#define IEEE80211_STA_WMM_ENABLED BIT(8) 239#define IEEE80211_STA_WMM_ENABLED BIT(8)
240/* hole at 9, please re-use */ 240/* hole at 9, please re-use */
241#define IEEE80211_STA_AUTO_SSID_SEL BIT(10) 241#define IEEE80211_STA_AUTO_SSID_SEL BIT(10)
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 6d00e3f738c0..2806f6af7ae7 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1581,8 +1581,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1581 * to between the sta_info_alloc() and sta_info_insert() above. 1581 * to between the sta_info_alloc() and sta_info_insert() above.
1582 */ 1582 */
1583 1583
1584 set_sta_flags(sta, WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP | 1584 set_sta_flags(sta, WLAN_STA_AUTH | WLAN_STA_ASSOC | WLAN_STA_ASSOC_AP);
1585 WLAN_STA_AUTHORIZED); 1585 if (!(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
1586 set_sta_flags(sta, WLAN_STA_AUTHORIZED);
1586 1587
1587 rates = 0; 1588 rates = 0;
1588 basic_rates = 0; 1589 basic_rates = 0;
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
index d84502644686..c14394744a9c 100644
--- a/net/mac80211/wext.c
+++ b/net/mac80211/wext.c
@@ -41,6 +41,7 @@ static int ieee80211_ioctl_siwgenie(struct net_device *dev,
41 return ret; 41 return ret;
42 sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL; 42 sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
43 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME; 43 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME;
44 sdata->u.mgd.flags &= ~IEEE80211_STA_CONTROL_PORT;
44 ieee80211_sta_req_auth(sdata); 45 ieee80211_sta_req_auth(sdata);
45 return 0; 46 return 0;
46 } 47 }
@@ -124,6 +125,7 @@ static int ieee80211_ioctl_siwessid(struct net_device *dev,
124 return ret; 125 return ret;
125 126
126 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME; 127 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME;
128 sdata->u.mgd.flags &= ~IEEE80211_STA_CONTROL_PORT;
127 ieee80211_sta_req_auth(sdata); 129 ieee80211_sta_req_auth(sdata);
128 return 0; 130 return 0;
129 } 131 }
@@ -181,6 +183,7 @@ static int ieee80211_ioctl_siwap(struct net_device *dev,
181 if (ret) 183 if (ret)
182 return ret; 184 return ret;
183 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME; 185 sdata->u.mgd.flags &= ~IEEE80211_STA_EXT_SME;
186 sdata->u.mgd.flags &= ~IEEE80211_STA_CONTROL_PORT;
184 ieee80211_sta_req_auth(sdata); 187 ieee80211_sta_req_auth(sdata);
185 return 0; 188 return 0;
186 } else if (sdata->vif.type == NL80211_IFTYPE_WDS) { 189 } else if (sdata->vif.type == NL80211_IFTYPE_WDS) {
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 66024ef57bab..cad281390cfa 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -126,6 +126,7 @@ static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = {
126 [NL80211_ATTR_STA_FLAGS2] = { 126 [NL80211_ATTR_STA_FLAGS2] = {
127 .len = sizeof(struct nl80211_sta_flag_update), 127 .len = sizeof(struct nl80211_sta_flag_update),
128 }, 128 },
129 [NL80211_ATTR_CONTROL_PORT] = { .type = NLA_FLAG },
129}; 130};
130 131
131/* IE validation */ 132/* IE validation */
@@ -3040,6 +3041,8 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
3040 } 3041 }
3041 } 3042 }
3042 3043
3044 req.control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
3045
3043 err = drv->ops->assoc(&drv->wiphy, dev, &req); 3046 err = drv->ops->assoc(&drv->wiphy, dev, &req);
3044 3047
3045out: 3048out: