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
此提交包含在:
@@ -19606,7 +19606,20 @@ static int __wlan_hdd_cfg80211_connect(struct wiphy *wiphy,
|
|||||||
return -EALREADY;
|
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) {
|
if (req->channel) {
|
||||||
bool ok = false;
|
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)
|
if (req->channel)
|
||||||
channel = req->channel->hw_value;
|
channel = req->channel->hw_value;
|
||||||
else
|
else
|
||||||
|
@@ -2658,6 +2658,34 @@ static void hdd_update_ipa_component_config(struct hdd_context *hdd_ctx)
|
|||||||
}
|
}
|
||||||
#endif
|
#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
|
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
|
||||||
static enum policy_mgr_con_mode wlan_hdd_get_mode_for_non_connected_vdev(
|
static enum policy_mgr_con_mode wlan_hdd_get_mode_for_non_connected_vdev(
|
||||||
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
|
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;
|
struct policy_mgr_hdd_cbacks hdd_cbacks;
|
||||||
|
|
||||||
|
qdf_mem_zero(&hdd_cbacks, sizeof(hdd_cbacks));
|
||||||
hdd_cbacks.sap_restart_chan_switch_cb =
|
hdd_cbacks.sap_restart_chan_switch_cb =
|
||||||
hdd_sap_restart_chan_switch_cb;
|
hdd_sap_restart_chan_switch_cb;
|
||||||
hdd_cbacks.wlan_hdd_get_channel_for_sap_restart =
|
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 =
|
hdd_cbacks.get_mode_for_non_connected_vdev =
|
||||||
wlan_hdd_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_get_device_mode = hdd_get_device_mode;
|
||||||
|
hdd_cbacks.hdd_wapi_security_sta_exist =
|
||||||
|
hdd_wapi_security_sta_exist;
|
||||||
if (QDF_STATUS_SUCCESS !=
|
if (QDF_STATUS_SUCCESS !=
|
||||||
policy_mgr_register_hdd_cb(psoc, &hdd_cbacks)) {
|
policy_mgr_register_hdd_cb(psoc, &hdd_cbacks)) {
|
||||||
hdd_err("HDD callback registration with policy manager failed");
|
hdd_err("HDD callback registration with policy manager failed");
|
||||||
|
新增問題並參考
封鎖使用者