From a3bad2b70e5b770edeb592050a0d985e758f2b3b Mon Sep 17 00:00:00 2001 From: Min Liu Date: Mon, 25 Mar 2019 11:48:49 +0800 Subject: [PATCH] qcacmn: Reject STA with PMF disabled only when PMF is required In wlan_crypto_rsn_info, only need to reject STA with PMF disabled when PMF is required. Change-Id: I7a7d4b2d1a2d44a95d08eb6bfac14540940f0be3 CRs-Fixed: 2424932 --- .../crypto/inc/wlan_crypto_global_api.h | 10 ++++++ .../crypto/src/wlan_crypto_global_api.c | 32 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h b/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h index 4010f4b29a5b..43efd71f18de 100644 --- a/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h +++ b/umac/cmn_services/crypto/inc/wlan_crypto_global_api.h @@ -222,6 +222,16 @@ QDF_STATUS wlan_crypto_demic(struct wlan_objmgr_vdev *vdev, */ bool wlan_crypto_vdev_is_pmf_enabled(struct wlan_objmgr_vdev *vdev); +/** + * wlan_crypto_vdev_is_pmf_required - called to check is pmf required in vdev + * @vdev: vdev + * + * This function gets called to check is pmf required or not in vdev. + * + * Return: true or false + */ +bool wlan_crypto_vdev_is_pmf_required(struct wlan_objmgr_vdev *vdev); + /** * wlan_crypto_is_pmf_enabled - called by mgmt txrx to check is pmf enabled * @vdev: vdev diff --git a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c index 39fdf9700e56..5bc4b007bf4a 100644 --- a/umac/cmn_services/crypto/src/wlan_crypto_global_api.c +++ b/umac/cmn_services/crypto/src/wlan_crypto_global_api.c @@ -1645,6 +1645,36 @@ bool wlan_crypto_vdev_is_pmf_enabled(struct wlan_objmgr_vdev *vdev) return false; } + +/** + * wlan_crypto_vdev_is_pmf_required - called to check is pmf required in vdev + * @vdev: vdev + * + * This function gets called to check is pmf required or not in vdev. + * + * Return: true or false + */ +bool wlan_crypto_vdev_is_pmf_required(struct wlan_objmgr_vdev *vdev) +{ + struct wlan_crypto_comp_priv *crypto_priv; + struct wlan_crypto_params *vdev_crypto_params; + + if (!vdev) + return false; + + vdev_crypto_params = wlan_crypto_vdev_get_comp_params(vdev, + &crypto_priv); + if (!crypto_priv) { + crypto_err("crypto_priv NULL"); + return QDF_STATUS_E_INVAL; + } + + if (vdev_crypto_params->rsn_caps & WLAN_CRYPTO_RSN_CAP_MFP_REQUIRED) + return true; + + return false; +} + /** * wlan_crypto_is_pmf_enabled - called by mgmt txrx to check is pmf enabled * @vdev: vdev @@ -2808,7 +2838,7 @@ bool wlan_crypto_rsn_info(struct wlan_objmgr_vdev *vdev, crypto_debug("Key mgmt match failed"); return false; } - if (wlan_crypto_vdev_is_pmf_enabled(vdev) && + if (wlan_crypto_vdev_is_pmf_required(vdev) && !(crypto_params->rsn_caps & WLAN_CRYPTO_RSN_CAP_MFP_ENABLED)) { crypto_debug("Peer is not PMF capable"); return false;