mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 18:43:33 +02:00
wifi: nl80211: permit userspace to pass supported selectors
Currently the SAE_H2E selector already exists, which needs to be implemented by the SME. As new such selectors might be added in the future, add a feature to permit userspace to report a selector as supported. If not given, the kernel should assume that userspace does support SAE_H2E. Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250101070249.fe67b871cc39.Ieb98390328927e998e612345a58b6dbc00b0e3a2@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
931cf025cc
commit
f6d2e5abf1
|
|
@ -3023,6 +3023,10 @@ static inline const u8 *ieee80211_bss_get_ie(struct cfg80211_bss *bss, u8 id)
|
|||
*
|
||||
* @bss: The BSS to authenticate with, the callee must obtain a reference
|
||||
* to it if it needs to keep it.
|
||||
* @supported_selectors: List of selectors that should be assumed to be
|
||||
* supported by the station.
|
||||
* SAE_H2E must be assumed supported if set to %NULL.
|
||||
* @supported_selectors_len: Length of supported_selectors in octets.
|
||||
* @auth_type: Authentication type (algorithm)
|
||||
* @ie: Extra IEs to add to Authentication frame or %NULL
|
||||
* @ie_len: Length of ie buffer in octets
|
||||
|
|
@ -3045,6 +3049,8 @@ struct cfg80211_auth_request {
|
|||
struct cfg80211_bss *bss;
|
||||
const u8 *ie;
|
||||
size_t ie_len;
|
||||
const u8 *supported_selectors;
|
||||
u8 supported_selectors_len;
|
||||
enum nl80211_auth_type auth_type;
|
||||
const u8 *key;
|
||||
u8 key_len;
|
||||
|
|
@ -3124,6 +3130,10 @@ enum cfg80211_assoc_req_flags {
|
|||
* included in the Current AP address field of the Reassociation Request
|
||||
* frame.
|
||||
* @flags: See &enum cfg80211_assoc_req_flags
|
||||
* @supported_selectors: supported selectors in IEEE 802.11 format
|
||||
* (or %NULL for no change).
|
||||
* If %NULL, then support for SAE_H2E should be assumed.
|
||||
* @supported_selectors_len: Length of supported_selectors in octets.
|
||||
* @ht_capa: HT Capabilities over-rides. Values set in ht_capa_mask
|
||||
* will be used in ht_capa. Un-supported values will be ignored.
|
||||
* @ht_capa_mask: The bits of ht_capa which are to be used.
|
||||
|
|
@ -3150,6 +3160,8 @@ struct cfg80211_assoc_request {
|
|||
struct cfg80211_crypto_settings crypto;
|
||||
bool use_mfp;
|
||||
u32 flags;
|
||||
const u8 *supported_selectors;
|
||||
u8 supported_selectors_len;
|
||||
struct ieee80211_ht_cap ht_capa;
|
||||
struct ieee80211_ht_cap ht_capa_mask;
|
||||
struct ieee80211_vht_cap vht_capa, vht_capa_mask;
|
||||
|
|
|
|||
|
|
@ -2871,6 +2871,12 @@ enum nl80211_commands {
|
|||
* @NL80211_ATTR_VIF_RADIO_MASK: Bitmask of allowed radios (u32).
|
||||
* A value of 0 means all radios.
|
||||
*
|
||||
* @NL80211_ATTR_SUPPORTED_SELECTORS: supported selectors, array of
|
||||
* supported selectors as defined by IEEE 802.11 7.3.2.2 but without the
|
||||
* length restriction (at most %NL80211_MAX_SUPP_SELECTORS).
|
||||
* This can be used to provide a list of selectors that are implemented
|
||||
* by the supplicant. If not given, support for SAE_H2E is assumed.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
|
|
@ -3421,6 +3427,8 @@ enum nl80211_attrs {
|
|||
|
||||
NL80211_ATTR_VIF_RADIO_MASK,
|
||||
|
||||
NL80211_ATTR_SUPPORTED_SELECTORS,
|
||||
|
||||
/* add attributes here, update the policy in nl80211.c */
|
||||
|
||||
__NL80211_ATTR_AFTER_LAST,
|
||||
|
|
@ -3465,6 +3473,7 @@ enum nl80211_attrs {
|
|||
#define NL80211_WIPHY_NAME_MAXLEN 64
|
||||
|
||||
#define NL80211_MAX_SUPP_RATES 32
|
||||
#define NL80211_MAX_SUPP_SELECTORS 128
|
||||
#define NL80211_MAX_SUPP_HT_RATES 77
|
||||
#define NL80211_MAX_SUPP_REG_RULES 128
|
||||
#define NL80211_TKIP_DATA_OFFSET_ENCR_KEY 0
|
||||
|
|
|
|||
|
|
@ -294,6 +294,21 @@ static int validate_he_capa(const struct nlattr *attr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int validate_supported_selectors(const struct nlattr *attr,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
const u8 *supported_selectors = nla_data(attr);
|
||||
u8 supported_selectors_len = nla_len(attr);
|
||||
|
||||
/* The top bit must not be set as it is not part of the selector */
|
||||
for (int i = 0; i < supported_selectors_len; i++) {
|
||||
if (supported_selectors[i] & 0x80)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* policy for the attributes */
|
||||
static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR];
|
||||
|
||||
|
|
@ -830,6 +845,9 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
[NL80211_ATTR_MLO_TTLM_ULINK] = NLA_POLICY_EXACT_LEN(sizeof(u16) * 8),
|
||||
[NL80211_ATTR_ASSOC_SPP_AMSDU] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_VIF_RADIO_MASK] = { .type = NLA_U32 },
|
||||
[NL80211_ATTR_SUPPORTED_SELECTORS] =
|
||||
NLA_POLICY_VALIDATE_FN(NLA_BINARY, validate_supported_selectors,
|
||||
NL80211_MAX_SUPP_SELECTORS),
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
|
|
@ -10858,6 +10876,13 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
|
|||
req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
|
||||
}
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) {
|
||||
req.supported_selectors =
|
||||
nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
|
||||
req.supported_selectors_len =
|
||||
nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
|
||||
}
|
||||
|
||||
auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
|
||||
if (!nl80211_valid_auth_type(rdev, auth_type, NL80211_CMD_AUTHENTICATE))
|
||||
return -EINVAL;
|
||||
|
|
@ -11140,6 +11165,13 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
|
|||
if (info->attrs[NL80211_ATTR_PREV_BSSID])
|
||||
req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]) {
|
||||
req.supported_selectors =
|
||||
nla_data(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
|
||||
req.supported_selectors_len =
|
||||
nla_len(info->attrs[NL80211_ATTR_SUPPORTED_SELECTORS]);
|
||||
}
|
||||
|
||||
if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
|
||||
req.flags |= ASSOC_REQ_DISABLE_HT;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user