BACKPORT: FROMLIST: cfg80211: Increase akm_suites array size in cfg80211_crypto_settings
Increase akm_suites array size in struct cfg80211_crypto_settings to 10 and advertise the capability to userspace. This allows userspace to send more than two AKMs to driver in netlink commands such as NL80211_CMD_CONNECT. This capability is needed for implementing WPA3-Personal transition mode correctly with any driver that handles roaming internally. Currently, the possible AKMs for multi-AKM connect can include PSK, PSK-SHA-256, SAE, FT-PSK and FT-SAE. Since the count is already 5, increasing the akm_suites array size to 10 should be reasonable for future usecases. Contains a fix for the issue: Reported-by: kernel test robot <lkp@intel.com> Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com> Bug: 233387627 Change-Id: Ief3648fda9195c1fa6b9bf881aae36da74b9738b Link: https://lore.kernel.org/linux-wireless/1653312358-12321-1-git-send-email-quic_vjakkam@quicinc.com/ Signed-off-by: Veerendranath Jakkam <quic_vjakkam@quicinc.com>
This commit is contained in:
parent
bee631cec5
commit
af34adaa6a
|
@ -241,6 +241,7 @@ int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
|
|||
struct qlink_auth_encr *aen;
|
||||
int ret;
|
||||
int i;
|
||||
int n;
|
||||
|
||||
if (!qtnf_cmd_start_ap_can_fit(vif, s))
|
||||
return -E2BIG;
|
||||
|
@ -280,8 +281,9 @@ int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
|
|||
for (i = 0; i < QLINK_MAX_NR_CIPHER_SUITES; i++)
|
||||
aen->ciphers_pairwise[i] =
|
||||
cpu_to_le32(s->crypto.ciphers_pairwise[i]);
|
||||
aen->n_akm_suites = cpu_to_le32(s->crypto.n_akm_suites);
|
||||
for (i = 0; i < QLINK_MAX_NR_AKM_SUITES; i++)
|
||||
n = min(QLINK_MAX_NR_AKM_SUITES, s->crypto.n_akm_suites);
|
||||
aen->n_akm_suites = cpu_to_le32(n);
|
||||
for (i = 0; i < n; i++)
|
||||
aen->akm_suites[i] = cpu_to_le32(s->crypto.akm_suites[i]);
|
||||
aen->control_port = s->crypto.control_port;
|
||||
aen->control_port_no_encrypt = s->crypto.control_port_no_encrypt;
|
||||
|
@ -2076,6 +2078,7 @@ int qtnf_cmd_send_connect(struct qtnf_vif *vif,
|
|||
struct qlink_auth_encr *aen;
|
||||
int ret;
|
||||
int i;
|
||||
int n;
|
||||
u32 connect_flags = 0;
|
||||
|
||||
cmd_skb = qtnf_cmd_alloc_new_cmdskb(vif->mac->macid, vif->vifid,
|
||||
|
@ -2132,9 +2135,10 @@ int qtnf_cmd_send_connect(struct qtnf_vif *vif,
|
|||
aen->ciphers_pairwise[i] =
|
||||
cpu_to_le32(sme->crypto.ciphers_pairwise[i]);
|
||||
|
||||
aen->n_akm_suites = cpu_to_le32(sme->crypto.n_akm_suites);
|
||||
n = min(QLINK_MAX_NR_AKM_SUITES, sme->crypto.n_akm_suites);
|
||||
aen->n_akm_suites = cpu_to_le32(n);
|
||||
|
||||
for (i = 0; i < QLINK_MAX_NR_AKM_SUITES; i++)
|
||||
for (i = 0; i < n; i++)
|
||||
aen->akm_suites[i] = cpu_to_le32(sme->crypto.akm_suites[i]);
|
||||
|
||||
aen->control_port = sme->crypto.control_port;
|
||||
|
|
|
@ -1098,6 +1098,7 @@ struct survey_info {
|
|||
};
|
||||
|
||||
#define CFG80211_MAX_WEP_KEYS 4
|
||||
#define CFG80211_MAX_NUM_AKM_SUITES 10
|
||||
|
||||
/**
|
||||
* struct cfg80211_crypto_settings - Crypto settings
|
||||
|
@ -1149,7 +1150,7 @@ struct cfg80211_crypto_settings {
|
|||
int n_ciphers_pairwise;
|
||||
u32 ciphers_pairwise[NL80211_MAX_NR_CIPHER_SUITES];
|
||||
int n_akm_suites;
|
||||
u32 akm_suites[NL80211_MAX_NR_AKM_SUITES];
|
||||
u32 akm_suites[CFG80211_MAX_NUM_AKM_SUITES];
|
||||
bool control_port;
|
||||
__be16 control_port_ethertype;
|
||||
bool control_port_no_encrypt;
|
||||
|
@ -5386,6 +5387,13 @@ struct wiphy_iftype_akm_suites {
|
|||
* @ema_max_profile_periodicity: maximum profile periodicity supported by
|
||||
* the driver. Setting this field to a non-zero value indicates that the
|
||||
* driver supports enhanced multi-BSSID advertisements (EMA AP).
|
||||
* @max_num_akm_suites: maximum number of AKM suites allowed for
|
||||
* configuration through %NL80211_CMD_CONNECT, %NL80211_CMD_ASSOCIATE and
|
||||
* %NL80211_CMD_START_AP. Set to NL80211_MAX_NR_AKM_SUITES if not set by
|
||||
* driver. If set by driver minimum allowed value is
|
||||
* NL80211_MAX_NR_AKM_SUITES in order to avoid compatibility issues with
|
||||
* legacy userspace and maximum allowed value is
|
||||
* CFG80211_MAX_NUM_AKM_SUITES.
|
||||
*/
|
||||
struct wiphy {
|
||||
struct mutex mtx;
|
||||
|
@ -5532,6 +5540,7 @@ struct wiphy {
|
|||
|
||||
u8 mbssid_max_interfaces;
|
||||
u8 ema_max_profile_periodicity;
|
||||
u16 max_num_akm_suites;
|
||||
|
||||
ANDROID_BACKPORT_RESERVED(1);
|
||||
ANDROID_BACKPORT_RESERVED(2);
|
||||
|
|
|
@ -2674,6 +2674,13 @@ enum nl80211_commands {
|
|||
* association request when used with NL80211_CMD_NEW_STATION). Can be set
|
||||
* only if %NL80211_STA_FLAG_WME is set.
|
||||
*
|
||||
* @NL80211_ATTR_MAX_NUM_AKM_SUITES: U16 attribute. Indicates maximum number of
|
||||
* AKM suites allowed for %NL80211_CMD_CONNECT, %NL80211_CMD_ASSOCIATE and
|
||||
* %NL80211_CMD_START_AP in %NL80211_CMD_GET_WIPHY response. If this
|
||||
* attribute is not present userspace shall consider maximum number of AKM
|
||||
* suites allowed as %NL80211_MAX_NR_AKM_SUITES which is the legacy maximum
|
||||
* number prior to the introduction of this attribute.
|
||||
*
|
||||
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
|
||||
* @NL80211_ATTR_MAX: highest attribute number currently defined
|
||||
* @__NL80211_ATTR_AFTER_LAST: internal use
|
||||
|
@ -3221,6 +3228,15 @@ enum nl80211_attrs {
|
|||
NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/*
|
||||
* These are temporary definitions that will become permanent when the UAPI
|
||||
* change is accepted upstream. This will not be used in production until the
|
||||
* UAPI change lands upstream
|
||||
*/
|
||||
|
||||
/* Link: https://lore.kernel.org/linux-wireless/1653312358-12321-1-git-send-email-quic_vjakkam@quicinc.com/ */
|
||||
#define NL80211_ATTR_MAX_NUM_AKM_SUITES NL80211_ATTR_RESERVED_DO_NOT_USE_1
|
||||
|
||||
/* source-level API compatibility */
|
||||
#define NL80211_ATTR_SCAN_GENERATION NL80211_ATTR_GENERATION
|
||||
#define NL80211_ATTR_MESH_PARAMS NL80211_ATTR_MESH_CONFIG
|
||||
|
@ -3268,6 +3284,11 @@ enum nl80211_attrs {
|
|||
#define NL80211_HE_MIN_CAPABILITY_LEN 16
|
||||
#define NL80211_HE_MAX_CAPABILITY_LEN 54
|
||||
#define NL80211_MAX_NR_CIPHER_SUITES 5
|
||||
|
||||
/*
|
||||
* NL80211_MAX_NR_AKM_SUITES is obsolete when %NL80211_ATTR_MAX_NUM_AKM_SUITES
|
||||
* present in %NL80211_CMD_GET_WIPHY response.
|
||||
*/
|
||||
#define NL80211_MAX_NR_AKM_SUITES 2
|
||||
#define NL80211_EHT_MIN_CAPABILITY_LEN 13
|
||||
#define NL80211_EHT_MAX_CAPABILITY_LEN 51
|
||||
|
|
|
@ -912,6 +912,12 @@ int wiphy_register(struct wiphy *wiphy)
|
|||
return -EINVAL;
|
||||
#endif
|
||||
|
||||
if (!wiphy->max_num_akm_suites)
|
||||
wiphy->max_num_akm_suites = NL80211_MAX_NR_AKM_SUITES;
|
||||
else if (wiphy->max_num_akm_suites < NL80211_MAX_NR_AKM_SUITES ||
|
||||
wiphy->max_num_akm_suites > CFG80211_MAX_NUM_AKM_SUITES)
|
||||
return -EINVAL;
|
||||
|
||||
/* check and set up bitrates */
|
||||
ieee80211_set_bitrate_flags(wiphy);
|
||||
|
||||
|
|
|
@ -792,6 +792,10 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|||
NL80211_EHT_MIN_CAPABILITY_LEN,
|
||||
NL80211_EHT_MAX_CAPABILITY_LEN),
|
||||
[NL80211_ATTR_DISABLE_EHT] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_MAX_NUM_AKM_SUITES] =
|
||||
NLA_POLICY_RANGE(NLA_U16,
|
||||
NL80211_MAX_NR_AKM_SUITES,
|
||||
CFG80211_MAX_NUM_AKM_SUITES),
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
|
@ -2891,6 +2895,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
|||
if (nl80211_put_mbssid_support(&rdev->wiphy, msg))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nla_put_u16(msg, NL80211_ATTR_MAX_NUM_AKM_SUITES,
|
||||
rdev->wiphy.max_num_akm_suites))
|
||||
goto nla_put_failure;
|
||||
|
||||
/* done */
|
||||
state->split_start = 0;
|
||||
break;
|
||||
|
@ -10261,7 +10269,7 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
|
|||
if (len % sizeof(u32))
|
||||
return -EINVAL;
|
||||
|
||||
if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
|
||||
if (settings->n_akm_suites > rdev->wiphy.max_num_akm_suites)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(settings->akm_suites, data, len);
|
||||
|
@ -16347,7 +16355,7 @@ static struct genl_family nl80211_fam __ro_after_init = {
|
|||
.name = NL80211_GENL_NAME, /* have users key off the name instead */
|
||||
.hdrsize = 0, /* no private header */
|
||||
.version = 1, /* no particular meaning now */
|
||||
.maxattr = NL80211_ATTR_DISABLE_EHT,
|
||||
.maxattr = NL80211_ATTR_MAX_NUM_AKM_SUITES,
|
||||
.policy = nl80211_policy,
|
||||
.netnsok = true,
|
||||
.pre_doit = nl80211_pre_doit,
|
||||
|
|
Loading…
Reference in New Issue