diff options
author | Jouni Malinen <jouni.malinen@atheros.com> | 2009-05-06 15:09:37 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-05-11 15:23:54 -0400 |
commit | dc6382ced07d6bad61d0b591fb12ab5da7ca632c (patch) | |
tree | 277d03c28c0756368d663d1b053ceaed196f666e /net | |
parent | ed9b58bc443a1210b5be1ded6421b17e015bf985 (diff) |
nl80211 : Add support for configuring MFP
NL80211_CMD_ASSOCIATE request must be able to indicate whether
management frame protection (IEEE 802.11w) is being used. mac80211 was
able to use MFP in client mode only with WEXT, but the new
NL80211_ATTR_USE_MFP attribute will allow this to be done with
nl80211, too.
Since we are currently using nl80211 for MFP only with drivers that
use user space SME, only MFP disabled and required values are
used. However, the NL80211_ATTR_USE_MFP attribute is an enum that can
be extended with MFP optional in the future, if that is needed with
some drivers (e.g., if the RSN IE is generated by the driver).
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/cfg.c | 8 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 12 |
2 files changed, 20 insertions, 0 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index d0ca6da33ca9..4e627cf2b8c1 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1253,6 +1253,14 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev, | |||
1253 | if (ret) | 1253 | if (ret) |
1254 | return ret; | 1254 | return ret; |
1255 | 1255 | ||
1256 | if (req->use_mfp) { | ||
1257 | sdata->u.mgd.mfp = IEEE80211_MFP_REQUIRED; | ||
1258 | sdata->u.mgd.flags |= IEEE80211_STA_MFP_ENABLED; | ||
1259 | } else { | ||
1260 | sdata->u.mgd.mfp = IEEE80211_MFP_DISABLED; | ||
1261 | sdata->u.mgd.flags &= ~IEEE80211_STA_MFP_ENABLED; | ||
1262 | } | ||
1263 | |||
1256 | sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME; | 1264 | sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME; |
1257 | sdata->u.mgd.state = IEEE80211_STA_MLME_ASSOCIATE; | 1265 | sdata->u.mgd.state = IEEE80211_STA_MLME_ASSOCIATE; |
1258 | ieee80211_sta_req_auth(sdata); | 1266 | ieee80211_sta_req_auth(sdata); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 3c53c5cbc3a9..79927706937a 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -122,6 +122,7 @@ static struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] __read_mostly = { | |||
122 | [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, | 122 | [NL80211_ATTR_REASON_CODE] = { .type = NLA_U16 }, |
123 | [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, | 123 | [NL80211_ATTR_FREQ_FIXED] = { .type = NLA_FLAG }, |
124 | [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, | 124 | [NL80211_ATTR_TIMED_OUT] = { .type = NLA_FLAG }, |
125 | [NL80211_ATTR_USE_MFP] = { .type = NLA_U32 }, | ||
125 | }; | 126 | }; |
126 | 127 | ||
127 | /* IE validation */ | 128 | /* IE validation */ |
@@ -3012,6 +3013,17 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) | |||
3012 | req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); | 3013 | req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]); |
3013 | } | 3014 | } |
3014 | 3015 | ||
3016 | if (info->attrs[NL80211_ATTR_USE_MFP]) { | ||
3017 | enum nl80211_mfp use_mfp = | ||
3018 | nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]); | ||
3019 | if (use_mfp == NL80211_MFP_REQUIRED) | ||
3020 | req.use_mfp = true; | ||
3021 | else if (use_mfp != NL80211_MFP_NO) { | ||
3022 | err = -EINVAL; | ||
3023 | goto out; | ||
3024 | } | ||
3025 | } | ||
3026 | |||
3015 | err = drv->ops->assoc(&drv->wiphy, dev, &req); | 3027 | err = drv->ops->assoc(&drv->wiphy, dev, &req); |
3016 | 3028 | ||
3017 | out: | 3029 | out: |