|
@@ -1989,6 +1989,46 @@ cm_connect_req_update_ml_partner_info(struct cnx_mgr *cm_ctx,
|
|
|
{}
|
|
|
#endif
|
|
|
|
|
|
+#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE)
|
|
|
+static void
|
|
|
+cm_override_partner_link_akm(struct cnx_mgr *cm_ctx, struct cm_req *cm_req)
|
|
|
+{
|
|
|
+ struct scan_cache_entry *cur_entry;
|
|
|
+ struct wlan_objmgr_vdev *assoc_vdev;
|
|
|
+
|
|
|
+ if (!cm_req->connect_req.cur_candidate)
|
|
|
+ return;
|
|
|
+
|
|
|
+ assoc_vdev = wlan_mlo_get_assoc_link_vdev(cm_ctx->vdev);
|
|
|
+ if (!assoc_vdev) {
|
|
|
+ mlme_err("Assoc vdev not found");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Partner link might have common AKM with assoc link but that
|
|
|
+ * AKM might not be the superior AKM of the available AKMs for
|
|
|
+ * the partner link.
|
|
|
+ * Override partner link AKM with assoc link chosen AKM so that
|
|
|
+ * same AKM will be chosen for partner link as well.
|
|
|
+ *
|
|
|
+ * Example: Assoc link: WPA2-PSK
|
|
|
+ * Partner link: WPA3-SAE and WPA2-PSK
|
|
|
+ *
|
|
|
+ * Even WPA2-PSK is matching with assoc link, WPA3-SAE is more secure
|
|
|
+ * AKM for partner link and in order to avoid selecting WPA3-SAE for
|
|
|
+ * partner link, override that AKM with the common AKM from assoc link.
|
|
|
+ */
|
|
|
+ cur_entry = cm_req->connect_req.cur_candidate->entry;
|
|
|
+ cur_entry->neg_sec_info.key_mgmt =
|
|
|
+ wlan_crypto_get_param(assoc_vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void
|
|
|
+cm_override_partner_link_akm(struct cnx_mgr *cm_ctx, struct cm_req *cm_req)
|
|
|
+{
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/**
|
|
|
* cm_get_valid_candidate() - This API will be called to get the next valid
|
|
|
* candidate
|
|
@@ -2134,6 +2174,10 @@ try_same_candidate:
|
|
|
|
|
|
cm_connect_req_update_ml_partner_info(cm_ctx, cm_req,
|
|
|
use_same_candidate);
|
|
|
+ if (!use_same_candidate &&
|
|
|
+ wlan_vdev_mlme_is_mlo_link_vdev(cm_ctx->vdev)) {
|
|
|
+ cm_override_partner_link_akm(cm_ctx, cm_req);
|
|
|
+ }
|
|
|
|
|
|
flush_single_pmk:
|
|
|
akm = wlan_crypto_get_param(cm_ctx->vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
|
|
@@ -2433,77 +2477,23 @@ static
|
|
|
void cm_update_per_peer_key_mgmt_crypto_params(struct wlan_objmgr_vdev *vdev,
|
|
|
struct security_info *neg_sec_info)
|
|
|
{
|
|
|
- int32_t key_mgmt = 0;
|
|
|
- int32_t neg_akm = neg_sec_info->key_mgmt;
|
|
|
+ wlan_crypto_key_mgmt akm;
|
|
|
+ uint32_t key_mgmt = 0x0;
|
|
|
|
|
|
/*
|
|
|
* As there can be multiple AKM present select the most secured AKM
|
|
|
* present
|
|
|
*/
|
|
|
- if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FILS_SHA384))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FILS_SHA384);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FILS_SHA256))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FILS_SHA256);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm,
|
|
|
- WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X_SHA384))
|
|
|
- QDF_SET_PARAM(key_mgmt,
|
|
|
- WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X_SHA384);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm,
|
|
|
- WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B_192))
|
|
|
- QDF_SET_PARAM(key_mgmt,
|
|
|
- WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B_192);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_SAE_EXT_KEY))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE_EXT_KEY);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_SAE))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_SAE);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_SAE_EXT_KEY))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE_EXT_KEY);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_SAE))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_SAE);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_OWE))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_OWE);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_DPP))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_DPP);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SHA256))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SHA256);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_IEEE8021X);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_PSK_SHA384))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_PSK_SHA384);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_PSK_SHA384))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_PSK_SHA384);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_PSK_SHA256))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_PSK_SHA256);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_FT_PSK))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_FT_PSK);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_PSK))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_PSK);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_WAPI_PSK))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_WAPI_PSK);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_WAPI_CERT))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_WAPI_CERT);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_CCKM))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_CCKM);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_OSEN))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_OSEN);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_WPS))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_WPS);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_NO_WPA))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_NO_WPA);
|
|
|
- else if (QDF_HAS_PARAM(neg_akm, WLAN_CRYPTO_KEY_MGMT_WPA_NONE))
|
|
|
- QDF_SET_PARAM(key_mgmt, WLAN_CRYPTO_KEY_MGMT_WPA_NONE);
|
|
|
- else /* use original if no akm match */
|
|
|
- key_mgmt = neg_akm;
|
|
|
+
|
|
|
+ akm = wlan_crypto_get_secure_akm_available(neg_sec_info->key_mgmt);
|
|
|
+ /* If not matches any AKM, set to same AKM */
|
|
|
+ if (akm == WLAN_CRYPTO_KEY_MGMT_MAX)
|
|
|
+ key_mgmt = neg_sec_info->key_mgmt;
|
|
|
+ else
|
|
|
+ QDF_SET_PARAM(key_mgmt, akm);
|
|
|
|
|
|
wlan_crypto_set_vdev_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT, key_mgmt);
|
|
|
+
|
|
|
/*
|
|
|
* Overwrite the key mgmt with single key_mgmt if multiple are present
|
|
|
*/
|