qcacld-3.0: Limit concurrency of STA(WAPI)

When STA role is coexisting with other sessions(P2P, SAP or IBSS),
WAPI encryption mode is not allowed.
Add a new API to check if the connection/start request should
be rejected when:
1) A STA with WAPI encryption is to be connected while there
   is at least one concurrent session already running.
2) A new session is to be started while there is already a STA
   connection with WAPI encryption enabled.

Change-Id: Id3cc90a63a1b502a3a0783ebbc1af33f96620559
CRs-Fixed: 2271280
このコミットが含まれているのは:
Liangwei Dong
2018-07-16 06:41:55 -04:00
committed by nshrivas
コミット 3fa5cba537
2個のファイルの変更45行の追加10行の削除

ファイルの表示

@@ -19606,7 +19606,20 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
return -EALREADY;
}
/* Check for max concurrent connections after doing disconnect if any */
/*initialise security parameters */
status = wlan_hdd_cfg80211_set_privacy(adapter, req);
if (status < 0) {
hdd_err("Failed to set security params");
return status;
}
/*
* Check for max concurrent connections after doing disconnect if any,
* must be called after the invocation of wlan_hdd_cfg80211_set_privacy
* so privacy is already set for the current adapter before it's
* checked against concurrency.
*/
if (req->channel) {
bool ok = false;
@@ -19659,14 +19672,6 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
}
}
/*initialise security parameters */
status = wlan_hdd_cfg80211_set_privacy(adapter, req);
if (0 > status) {
hdd_err("Failed to set security params");
return status;
}
if (req->channel)
channel = req->channel->hw_value;
else

ファイルの表示

@@ -2658,6 +2658,34 @@ static void hdd_update_ipa_component_config(struct hdd_context *hdd_ctx)
}
#endif
#ifdef FEATURE_WLAN_WAPI
/**
* hdd_wapi_security_sta_exist() - return wapi security sta exist or not
*
* This API returns the wapi security station exist or not
*
* Return: true - wapi security station exist
*/
static bool hdd_wapi_security_sta_exist(void)
{
struct hdd_adapter *adapter = NULL;
struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
hdd_for_each_adapter(hdd_ctx, adapter) {
if ((adapter->device_mode == QDF_STA_MODE) &&
adapter->wapi_info.wapi_mode &&
(adapter->wapi_info.wapi_auth_mode != WAPI_AUTH_MODE_OPEN))
return true;
}
return false;
}
#else
static bool hdd_wapi_security_sta_exist(void)
{
return false;
}
#endif
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
static enum policy_mgr_con_mode wlan_hdd_get_mode_for_non_connected_vdev(
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
@@ -2680,6 +2708,7 @@ static void hdd_register_policy_manager_callback(
{
struct policy_mgr_hdd_cbacks hdd_cbacks;
qdf_mem_zero(&hdd_cbacks, sizeof(hdd_cbacks));
hdd_cbacks.sap_restart_chan_switch_cb =
hdd_sap_restart_chan_switch_cb;
hdd_cbacks.wlan_hdd_get_channel_for_sap_restart =
@@ -2687,7 +2716,8 @@ static void hdd_register_policy_manager_callback(
hdd_cbacks.get_mode_for_non_connected_vdev =
wlan_hdd_get_mode_for_non_connected_vdev;
hdd_cbacks.hdd_get_device_mode = hdd_get_device_mode;
hdd_cbacks.hdd_wapi_security_sta_exist =
hdd_wapi_security_sta_exist;
if (QDF_STATUS_SUCCESS !=
policy_mgr_register_hdd_cb(psoc, &hdd_cbacks)) {
hdd_err("HDD callback registration with policy manager failed");