|
@@ -3778,12 +3778,23 @@ static bool nl80211_valid_auth_type(struct cfg80211_registered_device *rdev,
|
|
|
if (!(rdev->wiphy.features & NL80211_FEATURE_SAE) &&
|
|
|
auth_type == NL80211_AUTHTYPE_SAE)
|
|
|
return false;
|
|
|
+ if (!wiphy_ext_feature_isset(&rdev->wiphy,
|
|
|
+ NL80211_EXT_FEATURE_FILS_STA) &&
|
|
|
+ (auth_type == NL80211_AUTHTYPE_FILS_SK ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_PK))
|
|
|
+ return false;
|
|
|
return true;
|
|
|
case NL80211_CMD_CONNECT:
|
|
|
case NL80211_CMD_START_AP:
|
|
|
/* SAE not supported yet */
|
|
|
if (auth_type == NL80211_AUTHTYPE_SAE)
|
|
|
return false;
|
|
|
+ /* FILS not supported yet */
|
|
|
+ if (auth_type == NL80211_AUTHTYPE_FILS_SK ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_PK)
|
|
|
+ return false;
|
|
|
return true;
|
|
|
default:
|
|
|
return false;
|
|
@@ -7810,12 +7821,18 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
|
|
|
if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (auth_type == NL80211_AUTHTYPE_SAE &&
|
|
|
+ if ((auth_type == NL80211_AUTHTYPE_SAE ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_SK ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_SK_PFS ||
|
|
|
+ auth_type == NL80211_AUTHTYPE_FILS_PK) &&
|
|
|
!info->attrs[NL80211_ATTR_AUTH_DATA])
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
|
|
|
- if (auth_type != NL80211_AUTHTYPE_SAE)
|
|
|
+ if (auth_type != NL80211_AUTHTYPE_SAE &&
|
|
|
+ auth_type != NL80211_AUTHTYPE_FILS_SK &&
|
|
|
+ auth_type != NL80211_AUTHTYPE_FILS_SK_PFS &&
|
|
|
+ auth_type != NL80211_AUTHTYPE_FILS_PK)
|
|
|
return -EINVAL;
|
|
|
auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
|
|
|
auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
|