summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwadesong <wadesong@codeaurora.org>2018-07-09 15:30:02 +0800
committernshrivas <nshrivas@codeaurora.org>2018-07-09 18:03:50 -0700
commitfe3eff7d2fb72ead926d2351cd36f772a878857c (patch)
treed08b2b8eb6e8dcd5299e72016f7f5fc336127377
parent2ddd8e4972448625886a10666dc65f229bfc2ecd (diff)
qcacld-3.0: Clear privacy settings if concurrency check fails
Before STA connection starts, privacy settings are imposed to HDD layer and then checked against concurrency settings. But when the check for privacy/concurrency fails, the previously populated privacy settings are not cleared because the CSR roaming state machine doesn't goto privacy setting clearing stage under such circumstances. Add API to clear the privacy settings in HDD layer when privacy checking against concurrency fails, so that old privacy settings will not interfere with new settings when connection starts next time. Change-Id: Ic8eb28def3839195301e9bbb358f876dc3d46642 CRs-Fixed: 2274858
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c63
1 files changed, 61 insertions, 2 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index f70952828824..9166dfd6cc33 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -18090,6 +18090,60 @@ static int wlan_hdd_cfg80211_set_privacy(hdd_adapter_t *pAdapter,
return status;
}
+/**
+ * wlan_hdd_clear_wapi_privacy() - reset WAPI settings in HDD layer
+ * @adapter: pointer to HDD adapter object
+ *
+ * This function resets all WAPI related parameters imposed before STA
+ * connection starts. It's invoked when privacy checking against concurrency
+ * fails, to make sure no improper WAPI settings are still populated before
+ * returning an error to the upper layer requester.
+ *
+ * Return: none
+ */
+#ifdef FEATURE_WLAN_WAPI
+static inline void wlan_hdd_clear_wapi_privacy(hdd_adapter_t *adapter)
+{
+ adapter->wapi_info.nWapiMode = 0;
+ adapter->wapi_info.wapiAuthMode = WAPI_AUTH_MODE_OPEN;
+}
+#else
+static inline void wlan_hdd_clear_wapi_privacy(hdd_adapter_t *adapter)
+{
+}
+#endif
+
+/**
+ * wlan_hdd_cfg80211_clear_privacy() - reset STA security parameters
+ * @adapter: pointer to HDD adapter object
+ *
+ * This function resets all privacy related parameters imposed
+ * before STA connection starts. It's invoked when privacy checking
+ * against concurrency fails, to make sure no improper settings are
+ * still populated before returning an error to the upper layer requester.
+ *
+ * Return: none
+ */
+static void wlan_hdd_cfg80211_clear_privacy(hdd_adapter_t *adapter)
+{
+ hdd_wext_state_t *wext_state = WLAN_HDD_GET_WEXT_STATE_PTR(adapter);
+ hdd_station_ctx_t *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
+
+ hdd_debug("reseting all privacy configurations");
+
+ wext_state->wpaVersion = IW_AUTH_WPA_VERSION_DISABLED;
+
+ hdd_sta_ctx->conn_info.authType = eCSR_AUTH_TYPE_NONE;
+ wext_state->roamProfile.AuthType.authType[0] = eCSR_AUTH_TYPE_NONE;
+
+ hdd_sta_ctx->conn_info.ucEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
+ wext_state->roamProfile.EncryptionType.numEntries = 0;
+ hdd_sta_ctx->conn_info.mcEncryptionType = eCSR_ENCRYPT_TYPE_NONE;
+ wext_state->roamProfile.mcEncryptionType.numEntries = 0;
+
+ wlan_hdd_clear_wapi_privacy(adapter);
+}
+
int wlan_hdd_try_disconnect(hdd_adapter_t *pAdapter)
{
unsigned long rc;
@@ -18414,14 +18468,16 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
pAdapter->device_mode),
req->channel->hw_value, HW_MODE_20_MHZ)) {
hdd_warn("This concurrency combination is not allowed");
- return -ECONNREFUSED;
+ status = -ECONNREFUSED;
+ goto con_chk_failed;
}
} else {
if (!cds_allow_concurrency(
cds_convert_device_mode_to_qdf_type(
pAdapter->device_mode), 0, HW_MODE_20_MHZ)) {
hdd_warn("This concurrency combination is not allowed");
- return -ECONNREFUSED;
+ status = -ECONNREFUSED;
+ goto con_chk_failed;
}
}
@@ -18439,6 +18495,9 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
hdd_err("connect failed");
return status;
}
+
+con_chk_failed:
+ wlan_hdd_cfg80211_clear_privacy(pAdapter);
EXIT();
return status;
}