diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index 4325114efe73..7796d6ef4fbe 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -1223,6 +1223,7 @@ struct policy_mgr_sme_cbacks { * encryption type. * @hdd_is_chan_switch_in_progress: Check if in any adater channel switch is in * progress + * @wlan_hdd_set_sap_csa_reason: Set the sap csa reason in cases like NAN. */ struct policy_mgr_hdd_cbacks { void (*sap_restart_chan_switch_cb)(struct wlan_objmgr_psoc *psoc, @@ -1239,6 +1240,8 @@ struct policy_mgr_hdd_cbacks { enum QDF_OPMODE (*hdd_get_device_mode)(uint32_t session_id); bool (*hdd_wapi_security_sta_exist)(void); bool (*hdd_is_chan_switch_in_progress)(void); + void (*wlan_hdd_set_sap_csa_reason)(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t reason); }; diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c index 8218f7934c76..d132af57d4a6 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c @@ -34,6 +34,7 @@ #include "qdf_platform.h" #include "wlan_nan_api.h" #include "nan_ucfg_api.h" +#include "sap_api.h" enum policy_mgr_conc_next_action (*policy_mgr_get_current_pref_hw_mode_ptr) (struct wlan_objmgr_psoc *psoc); @@ -1555,6 +1556,11 @@ void policy_mgr_nan_sap_post_enable_conc_check(struct wlan_objmgr_psoc *psoc) policy_mgr_debug("Force SCC for NAN+SAP Ch: %d", WLAN_REG_IS_5GHZ_CH(sap_ch) ? nan_ch_5g : nan_ch_2g); + if (pm_ctx->hdd_cbacks.wlan_hdd_set_sap_csa_reason) + pm_ctx->hdd_cbacks.wlan_hdd_set_sap_csa_reason(psoc, + sap_info->vdev_id, + CSA_REASON_CONCURRENT_NAN_EVENT); + if (WLAN_REG_IS_5GHZ_CH(sap_ch)) { policy_mgr_change_sap_channel_with_csa(psoc, sap_info->vdev_id, nan_ch_5g, @@ -1608,6 +1614,11 @@ void policy_mgr_nan_sap_post_disable_conc_check(struct wlan_objmgr_psoc *psoc) policy_mgr_err("wait for event failed, still continue with channel switch"); } + if (pm_ctx->hdd_cbacks.wlan_hdd_set_sap_csa_reason) + pm_ctx->hdd_cbacks.wlan_hdd_set_sap_csa_reason(psoc, + sap_info->vdev_id, + CSA_REASON_CONCURRENT_NAN_EVENT); + policy_mgr_change_sap_channel_with_csa(psoc, sap_info->vdev_id, sap_ch, policy_mgr_get_ch_width( diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 369170fc827c..24e6e1ca9696 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -9960,6 +9960,8 @@ static int hdd_update_acs_channel(struct hdd_adapter *adapter, uint8_t reason, sap_config->acs_cfg.ch_width = channel_list->chan_width; hdd_ap_ctx->sap_config.ch_width_orig = channel_list->chan_width; + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, adapter->vdev_id, + CSA_REASON_LTE_COEX); hdd_switch_sap_channel(adapter, sap_config->acs_cfg.pri_ch, true); break; @@ -16252,6 +16254,9 @@ bool wlan_hdd_handle_sap_sta_dfs_conc(struct hdd_adapter *adapter, hostapd_state = WLAN_HDD_GET_HOSTAP_STATE_PTR(ap_adapter); qdf_event_reset(&hostapd_state->qdf_event); + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, ap_adapter->vdev_id, + CSA_REASON_STA_CONNECT_DFS_TO_NON_DFS); + status = wlansap_set_channel_change_with_csa( WLAN_HDD_GET_SAP_CTX_PTR(ap_adapter), channel, hdd_ap_ctx->sap_config.ch_width_orig, false); @@ -21106,6 +21111,8 @@ static int __wlan_hdd_cfg80211_channel_switch(struct wiphy *wiphy, if ((QDF_P2P_GO_MODE != adapter->device_mode) && (QDF_SAP_MODE != adapter->device_mode)) return -ENOTSUPP; + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, adapter->vdev_id, + CSA_REASON_USER_INITIATED); freq = csa_params->chandef.chan->center_freq; channel = cds_freq_to_chan(freq); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 4306e50048e7..9880de83784e 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1140,6 +1140,9 @@ static void __wlan_hdd_sap_pre_cac_success(struct hdd_adapter *adapter) * switch to the pre CAC DFS channel, there is no CAC again. */ wlan_hdd_set_pre_cac_complete_status(ap_adapter, true); + + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, ap_adapter->vdev_id, + CSA_REASON_PRE_CAC_SUCCESS); i = hdd_softap_set_channel_change(ap_adapter->dev, ap_adapter->pre_cac_chan, CH_WIDTH_MAX, false); @@ -2591,6 +2594,8 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event, case eSAP_ECSA_CHANGE_CHAN_IND: hdd_debug("Channel change indication from peer for channel %d", sap_event->sapevt.sap_chan_cng_ind.new_chan); + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, adapter->vdev_id, + CSA_REASON_PEER_ACTION_FRAME); if (hdd_softap_set_channel_change(dev, sap_event->sapevt.sap_chan_cng_ind.new_chan, CH_WIDTH_MAX, false)) @@ -3072,6 +3077,20 @@ void hdd_sap_restart_chan_switch_cb(struct wlan_objmgr_psoc *psoc, channel_bw, forced); } +void wlan_hdd_set_sap_csa_reason(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + uint8_t reason) +{ + struct sap_context *sap_ctx; + struct hdd_adapter *ap_adapter = wlan_hdd_get_adapter_from_vdev( + psoc, vdev_id); + if (!ap_adapter) { + hdd_err("ap adapter is NULL"); + return; + } + sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(ap_adapter); + sap_ctx->csa_reason = reason; +} + QDF_STATUS wlan_hdd_get_channel_for_sap_restart( struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, uint8_t *channel, @@ -3170,6 +3189,8 @@ sap_restart: hdd_ap_ctx->sap_config.channel, intf_ch); ch_params.ch_width = CH_WIDTH_MAX; hdd_ap_ctx->bss_stop_reason = BSS_STOP_DUE_TO_MCC_SCC_SWITCH; + hdd_ap_ctx->sap_context->csa_reason = + CSA_REASON_CONCURRENT_STA_CHANGED_CHANNEL; wlan_reg_set_channel_params(hdd_ctx->pdev, intf_ch, diff --git a/core/hdd/src/wlan_hdd_hostapd.h b/core/hdd/src/wlan_hdd_hostapd.h index ab00e7e12429..615083ff9f2f 100644 --- a/core/hdd/src/wlan_hdd_hostapd.h +++ b/core/hdd/src/wlan_hdd_hostapd.h @@ -89,6 +89,20 @@ QDF_STATUS wlan_hdd_get_channel_for_sap_restart( uint8_t *sec_ch); #endif +/** + * wlan_hdd_set_sap_csa_reason() - Function to set + * sap csa reason + * @psoc: PSOC object information + * @vdev_id: vdev id + * @reason: reason to be updated + * + * This function sets the reason for SAP channel switch + * + * Return: None + * + */ +void wlan_hdd_set_sap_csa_reason(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + uint8_t reason); eCsrEncryptionType hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4]); diff --git a/core/hdd/src/wlan_hdd_hostapd_wext.c b/core/hdd/src/wlan_hdd_hostapd_wext.c index 014fa79ed781..5e32500d7988 100644 --- a/core/hdd/src/wlan_hdd_hostapd_wext.c +++ b/core/hdd/src/wlan_hdd_hostapd_wext.c @@ -466,6 +466,9 @@ static __iw_softap_setparam(struct net_device *dev, case QCSAP_PARAM_SET_CHANNEL_CHANGE: if ((QDF_SAP_MODE == adapter->device_mode) || (QDF_P2P_GO_MODE == adapter->device_mode)) { + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, + adapter->vdev_id, + CSA_REASON_USER_INITIATED); hdd_debug("SET Channel Change to new channel= %d", set_value); ret = hdd_softap_set_channel_change(dev, set_value, diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 94978ff49106..a6aa4d50f8ab 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -7015,6 +7015,8 @@ static int drv_cmd_set_channel_switch(struct hdd_adapter *adapter, hdd_debug("CH:%d BW:%d", chan_number, chan_bw); + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, adapter->vdev_id, + CSA_REASON_USER_INITIATED); status = hdd_softap_set_channel_change(dev, chan_number, width, true); if (status) { hdd_err("Set channel change fail"); diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index ef44eebb79ba..5f1362b2745f 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2735,6 +2735,8 @@ static void hdd_register_policy_manager_callback( hdd_wapi_security_sta_exist; hdd_cbacks.hdd_is_chan_switch_in_progress = hdd_is_chan_switch_in_progress; + hdd_cbacks.wlan_hdd_set_sap_csa_reason = + wlan_hdd_set_sap_csa_reason; if (QDF_STATUS_SUCCESS != policy_mgr_register_hdd_cb(psoc, &hdd_cbacks)) { @@ -8840,9 +8842,13 @@ void hdd_unsafe_channel_restart_sap(struct hdd_context *hdd_ctxt) hdd_ctxt->acs_policy.acs_channel = AUTO_CHANNEL_SELECT; ucfg_mlme_get_sap_internal_restart(hdd_ctxt->psoc, &value); - if (value) + if (value) { + wlan_hdd_set_sap_csa_reason(hdd_ctxt->psoc, + adapter->vdev_id, + CSA_REASON_UNSAFE_CHANNEL); hdd_switch_sap_channel(adapter, restart_chan, true); + } else { hdd_debug("sending coex indication"); wlan_hdd_send_svc_nlink_msg( @@ -8912,6 +8918,8 @@ static void hdd_lte_coex_restart_sap(struct hdd_adapter *adapter, wlan_hdd_send_svc_nlink_msg(hdd_ctx->radio_index, WLAN_SVC_LTE_COEX_IND, NULL, 0); + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, adapter->vdev_id, + CSA_REASON_LTE_COEX); hdd_switch_sap_channel(adapter, restart_chan, true); } @@ -15078,7 +15086,8 @@ void hdd_check_and_restart_sap_with_non_dfs_acs(void) if (!restart_chan || wlan_reg_is_dfs_ch(hdd_ctx->pdev, restart_chan)) restart_chan = SAP_DEFAULT_5GHZ_CHANNEL; - + wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, ap_adapter->vdev_id, + CSA_REASON_STA_CONNECT_DFS_TO_NON_DFS); hdd_switch_sap_channel(ap_adapter, restart_chan, true); } } diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 0ce31e10c248..58d6094068d0 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -466,6 +466,31 @@ enum sap_acs_dfs_mode { ACS_DFS_MODE_DEPRIORITIZE }; +/** + * enum sap_csa_reason_code - SAP channel switch reason code + * @CSA_REASON_UNKNOWN: Unknown reason + * @CSA_REASON_STA_CONNECT_DFS_TO_NON_DFS: STA connection from DFS to NON DFS. + * @CSA_REASON_USER_INITIATED: User initiated form north bound. + * @CSA_REASON_PEER_ACTION_FRAME: Action frame received on sta iface. + * @CSA_REASON_PRE_CAC_SUCCESS: Pre CAC success. + * @CSA_REASON_CONCURRENT_STA_CHANGED_CHANNEL: concurrent sta changed channel. + * @CSA_REASON_UNSAFE_CHANNEL: Unsafe channel. + * @CSA_REASON_LTE_COEX: LTE coex. + * @CSA_REASON_CONCURRENT_NAN_EVENT: NAN concurrency. + * + */ +enum sap_csa_reason_code { + CSA_REASON_UNKNOWN, + CSA_REASON_STA_CONNECT_DFS_TO_NON_DFS, + CSA_REASON_USER_INITIATED, + CSA_REASON_PEER_ACTION_FRAME, + CSA_REASON_PRE_CAC_SUCCESS, + CSA_REASON_CONCURRENT_STA_CHANGED_CHANNEL, + CSA_REASON_UNSAFE_CHANNEL, + CSA_REASON_LTE_COEX, + CSA_REASON_CONCURRENT_NAN_EVENT +}; + struct sap_config { tSap_SSIDInfo_t SSIDinfo; eCsrPhyMode SapHw_mode; /* Wireless Mode */ diff --git a/core/sap/src/sap_internal.h b/core/sap/src/sap_internal.h index 418832e1b0a5..cc4a25dfba48 100644 --- a/core/sap/src/sap_internal.h +++ b/core/sap/src/sap_internal.h @@ -146,6 +146,7 @@ struct sap_context { * track of state machine */ enum sap_fsm_state fsm_state; + enum sap_csa_reason_code csa_reason; /* Actual storage for AP and self (STA) SSID */ tCsrSSIDInfo SSIDList[2]; diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c index b8deb1b2f7a7..7351914f4365 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -335,6 +335,7 @@ QDF_STATUS sap_init_ctx(struct sap_context *sap_ctx, sap_ctx->SSIDList[0].ssidHidden; sap_ctx->csr_roamProfile.BSSIDs.numOfBSSIDs = 1; /* This is true for now. */ + sap_ctx->csa_reason = CSA_REASON_UNKNOWN; sap_ctx->csr_roamProfile.BSSIDs.bssid = &sap_ctx->bssid; sap_ctx->csr_roamProfile.csrPersona = mode; qdf_mem_copy(sap_ctx->self_mac_addr, addr, QDF_MAC_ADDR_SIZE); @@ -1328,6 +1329,38 @@ static inline void sap_start_csa_restart(struct mac_context *mac, sme_csa_restart(mac, sap_ctx->sessionId); } +/** + * sap_get_csa_reason_str() - Get csa reason in string + * @reason: sap reason enum value + * + * Return: string reason + */ +static char *sap_get_csa_reason_str(enum sap_csa_reason_code reason) +{ + switch (reason) { + case CSA_REASON_UNKNOWN: + return "UNKNOWN"; + case CSA_REASON_STA_CONNECT_DFS_TO_NON_DFS: + return "STA_CONNECT_DFS_TO_NON_DFS"; + case CSA_REASON_USER_INITIATED: + return "USER_INITIATED"; + case CSA_REASON_PEER_ACTION_FRAME: + return "PEER_ACTION_FRAME"; + case CSA_REASON_PRE_CAC_SUCCESS: + return "PRE_CAC_SUCCESS"; + case CSA_REASON_CONCURRENT_STA_CHANGED_CHANNEL: + return "CONCURRENT_STA_CHANGED_CHANNEL"; + case CSA_REASON_UNSAFE_CHANNEL: + return "UNSAFE_CHANNEL"; + case CSA_REASON_LTE_COEX: + return "LTE_COEX"; + case CSA_REASON_CONCURRENT_NAN_EVENT: + return "CONCURRENT_NAN_EVENT"; + default: + return "UNKNOWN"; + } +} + /** * wlansap_set_channel_change_with_csa() - Set channel change with CSA * @sap_ctx: Pointer to SAP context @@ -1373,10 +1406,12 @@ QDF_STATUS wlansap_set_channel_change_with_csa(struct sap_context *sap_ctx, return QDF_STATUS_E_FAULT; } QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, - "%s: sap chan:%d target:%d conn on 5GHz:%d", + "%s: sap chan:%d target:%d conn on 5GHz:%d, csa_reason:%s(%d)", __func__, sap_ctx->channel, targetChannel, policy_mgr_is_any_mode_active_on_band_along_with_session( - mac->psoc, sap_ctx->sessionId, POLICY_MGR_BAND_5)); + mac->psoc, sap_ctx->sessionId, POLICY_MGR_BAND_5), + sap_get_csa_reason_str(sap_ctx->csa_reason), + sap_ctx->csa_reason); sta_sap_scc_on_dfs_chan = policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(mac->psoc);