qcacmn: Move the SAP to non DFS channel after STA disconnection

Standalone SAP is not allowed on DFS channel if STA+SAP SCC enabled
on DFS channel. So move the SAP to a non DFS channel as soon as STA
gets disconnect.

CRs-Fixed: 2269249
Change-Id: I27d018739f53997641a7113cfc7c844e02bd7e29
This commit is contained in:
Bala Venkatesh 2018-06-27 12:50:10 +05:30 • committed by nshrivas
commit b5a400ee01
3 changed files with 105 additions and 3 deletions

View file

@ -2426,6 +2426,32 @@ bool policy_mgr_sta_sap_scc_on_lte_coex_chan(
bool policy_mgr_is_valid_for_channel_switch(struct wlan_objmgr_psoc *psoc,
uint8_t channel);
/**
* policy_mgr_update_user_config_sap_chan() - Update user configured channel
* @psoc: poniter to psoc
* @channel: channel to be upated
*
* Return: void
**/
void policy_mgr_update_user_config_sap_chan(
struct wlan_objmgr_psoc *psoc, uint32_t channel);
/**
* policy_mgr_is_sap_restart_required_after_sta_disconnect() - is sap restart
* required
* after sta disconnection
* @psoc: psoc object data
* @intf_ch: sap channel
*
* Check if SAP should be moved to a non dfs channel after STA disconnection.
* This API applicable only for STA+SAP SCC and ini 'sta_sap_scc_on_dfs_chan'
* is enabled.
*
* Return: true if sap restart is required, otherwise false
*/
bool policy_mgr_is_sap_restart_required_after_sta_disconnect(
struct wlan_objmgr_psoc *psoc, uint8_t *intf_ch);
/**
* policy_mgr_is_sta_sap_scc() - check whether SAP is doing SCC with
* STA
@ -2436,4 +2462,5 @@ bool policy_mgr_is_valid_for_channel_switch(struct wlan_objmgr_psoc *psoc,
* Return: true or false
*/
bool policy_mgr_is_sta_sap_scc(struct wlan_objmgr_psoc *psoc, uint8_t sap_ch);
#endif /* __WLAN_POLICY_MGR_API_H */

View file

@ -758,6 +758,19 @@ QDF_STATUS policy_mgr_handle_conc_multiport(struct wlan_objmgr_psoc *psoc,
}
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
void policy_mgr_update_user_config_sap_chan(
struct wlan_objmgr_psoc *psoc, uint32_t channel)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid pm context and failed to update the user config sap channel");
return;
}
pm_ctx->user_config_sap_channel = channel;
}
/**
* policy_mgr_is_restart_sap_allowed() - Check if restart SAP
* allowed during SCC -> MCC switch
@ -820,6 +833,40 @@ bool policy_mgr_is_safe_channel(struct wlan_objmgr_psoc *psoc,
return is_safe;
}
bool policy_mgr_is_sap_restart_required_after_sta_disconnect(
struct wlan_objmgr_psoc *psoc, uint8_t *intf_ch)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
uint8_t sap_chan = policy_mgr_mode_specific_get_channel(psoc,
PM_SAP_MODE);
bool sta_sap_scc_on_dfs_chan =
policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(psoc);
*intf_ch = 0;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid pm context");
return false;
}
policy_mgr_debug("sta_sap_scc_on_dfs_chan %u, sap_chan %u",
sta_sap_scc_on_dfs_chan, sap_chan);
if (!sta_sap_scc_on_dfs_chan ||
!(sap_chan && WLAN_REG_IS_5GHZ_CH(sap_chan) &&
(wlan_reg_get_channel_state(pm_ctx->pdev, sap_chan) ==
CHANNEL_STATE_DFS))) {
return false;
}
*intf_ch = pm_ctx->user_config_sap_channel;
policy_mgr_debug("Standalone SAP is not allowed on DFS channel, Move it to channel %u",
*intf_ch);
return true;
}
/**
* policy_mgr_check_sta_ap_concurrent_ch_intf() - Restart SAP in STA-AP case
* @data: Pointer check concurrent channel work data
@ -1040,12 +1087,28 @@ void policy_mgr_check_concurrent_intf_and_restart_sap(
uint8_t operating_channel[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
uint8_t vdev_id[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
uint32_t cc_count = 0;
bool restart_sap = false;
uint8_t sap_ch;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid context");
return;
}
if (policy_mgr_get_connection_count(psoc) == 1) {
/*
* If STA+SAP sessions are on DFS channel and STA+SAP SCC is
* enabled on DFS channel then move the SAP out of DFS channel
* as soon as STA gets disconnect.
*/
if (policy_mgr_is_sap_restart_required_after_sta_disconnect(
psoc, &sap_ch)) {
policy_mgr_debug("move the SAP to configured channel %u",
sap_ch);
restart_sap = true;
goto sap_restart;
}
}
/*
* force SCC with STA+STA+SAP will need some additional logic
@ -1069,9 +1132,20 @@ void policy_mgr_check_concurrent_intf_and_restart_sap(
return;
}
if ((mcc_to_scc_switch != QDF_MCC_TO_SCC_SWITCH_DISABLE) &&
policy_mgr_valid_sta_channel_check(psoc, operating_channel[0])
&& !pm_ctx->sta_ap_intf_check_work_info) {
sap_restart:
/*
* If sta_sap_scc_on_dfs_chan is true then standalone SAP is not
* allowed on DFS channel. SAP is allowed on DFS channel only when STA
* is already connected on that channel.
* In following condition restart_sap will be true if
* sta_sap_scc_on_dfs_chan is true and SAP is on DFS channel.
* This scenario can come if STA+SAP are operating on DFS channel and
* STA gets disconnected.
*/
if (restart_sap ||
((mcc_to_scc_switch != QDF_MCC_TO_SCC_SWITCH_DISABLE) &&
policy_mgr_valid_sta_channel_check(psoc, operating_channel[0]) &&
!pm_ctx->sta_ap_intf_check_work_info)) {
struct sta_ap_intf_check_work_ctx *work_info;
work_info = qdf_mem_malloc(
sizeof(struct sta_ap_intf_check_work_ctx));

View file

@ -268,6 +268,7 @@ struct policy_mgr_psoc_priv_obj {
qdf_event_t opportunistic_update_done_evt;
qdf_event_t channel_switch_complete_evt;
send_mode_change_event_cb mode_change_cb;
uint32_t user_config_sap_channel;
};
/**