diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index d4b459be8df4..b735bc982d28 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -357,12 +357,14 @@ enum element_ie { /** * enum extn_element_ie :- extended management information element + * @WLAN_EXTN_ELEMID_MAX_CHAN_SWITCH_TIME: Maximum Channel Switch Time IE * @WLAN_EXTN_ELEMID_HECAP: HE capabilities IE * @WLAN_EXTN_ELEMID_HEOP: HE Operation IE * @WLAN_EXTN_ELEMID_MUEDCA: MU-EDCA IE * @WLAN_EXTN_ELEMID_SRP: spatial reuse parameter IE */ enum extn_element_ie { + WLAN_EXTN_ELEMID_MAX_CHAN_SWITCH_TIME = 34, WLAN_EXTN_ELEMID_HECAP = 35, WLAN_EXTN_ELEMID_HEOP = 36, WLAN_EXTN_ELEMID_MUEDCA = 38, diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h index c4087e39df7f..e845f1a88b14 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h @@ -657,6 +657,19 @@ void utils_dfs_reg_update_nol_history_ch(struct wlan_objmgr_pdev *pdev, bool utils_dfs_check_for_cac_start(struct wlan_objmgr_pdev *pdev, bool *continue_current_cac); +/** utils_dfs_is_precac_done() - Check if precac has been done in chosen channel + * @pdev: Pointer to DFS pdev object. + * @wlan_chan: Pointer to wlan channel object that can be accessed by other + * components. + * Wrapper function for dfs_is_precac_done(). This API is called from outside + * the dfs component. + * + * Return: + * * True :If precac is done on channel. + * * False:If precac is not done on channel. + */ +bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev, + struct wlan_channel *wlan_chan); /** * utils_dfs_get_disable_radar_marking - Retrieve the value of disable radar * marking. diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index 8a12d4d13465..e01b4588c54d 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -211,6 +211,37 @@ void utils_dfs_clear_cac_started_chan(struct wlan_objmgr_pdev *pdev) dfs_clear_cac_started_chan(dfs); } +/** utils_fill_dfs_chan_info() - Fill the dfs channel structure with wlan + * channel. + * @chan: Pointer to DFS channel structure. + * @wlan_chan: Pointer to WLAN Channel structure. + * + * Return: void + */ +static void utils_fill_dfs_chan_info(struct dfs_channel *chan, + struct wlan_channel *wlan_chan) +{ + chan->dfs_ch_freq = wlan_chan->ch_freq; + chan->dfs_ch_flags = wlan_chan->ch_flags; + chan->dfs_ch_flagext = wlan_chan->ch_flagext; + chan->dfs_ch_ieee = wlan_chan->ch_ieee; + chan->dfs_ch_vhtop_ch_freq_seg1 = wlan_chan->ch_freq_seg1; + chan->dfs_ch_vhtop_ch_freq_seg2 = wlan_chan->ch_freq_seg2; +} + +bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev, + struct wlan_channel *wlan_chan) +{ + struct wlan_dfs *dfs; + struct dfs_channel chan; + + dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); + if (!dfs) + return false; + utils_fill_dfs_chan_info(&chan, wlan_chan); + return dfs_is_precac_done(dfs, &chan); +} + bool utils_dfs_check_for_cac_start(struct wlan_objmgr_pdev *pdev, bool *continue_current_cac) { diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index 07071232e133..6e6312cd4fea 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -127,6 +127,7 @@ struct element_info { * @ds_param: pointer to ds params * @csa: pointer to csa ie * @xcsa: pointer to extended csa ie + * @mcst: pointer to maximum channel switch time ie * @wpa: pointer to wpa ie * @wcn: pointer to wcn ie * @rsn: pointer to rsn ie @@ -167,6 +168,7 @@ struct ie_list { uint8_t *ds_param; uint8_t *csa; uint8_t *xcsa; + uint8_t *mcst; uint8_t *wpa; uint8_t *wcn; uint8_t *rsn; diff --git a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h index f0e1500d192c..a925164082f9 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_utils_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_utils_api.h @@ -636,6 +636,7 @@ util_scan_copy_beacon_data(struct scan_cache_entry *new_entry, ie_lst->ds_param = conv_ptr(ie_lst->ds_param, old_ptr, new_ptr); ie_lst->csa = conv_ptr(ie_lst->csa, old_ptr, new_ptr); ie_lst->xcsa = conv_ptr(ie_lst->xcsa, old_ptr, new_ptr); + ie_lst->mcst = conv_ptr(ie_lst->mcst, old_ptr, new_ptr); ie_lst->secchanoff = conv_ptr(ie_lst->secchanoff, old_ptr, new_ptr); ie_lst->wpa = conv_ptr(ie_lst->wpa, old_ptr, new_ptr); ie_lst->wcn = conv_ptr(ie_lst->wcn, old_ptr, new_ptr); @@ -1356,6 +1357,20 @@ util_scan_entry_mlme_info(struct scan_cache_entry *scan_entry) return &(scan_entry->mlme_info); } +/** +* util_scan_entry_mcst() - function to read mcst IE +* @scan_entry:scan entry +* +* API, function to read mcst IE +* +* Return: mcst or NULL if ie is not present +*/ +static inline uint8_t* +util_scan_entry_mcst(struct scan_cache_entry *scan_entry) +{ + return scan_entry->ie_list.mcst; +} + /** * util_scan_entry_hecap() - function to read he caps vendor ie * @scan_entry: scan entry diff --git a/umac/scan/dispatcher/src/wlan_scan_utils_api.c b/umac/scan/dispatcher/src/wlan_scan_utils_api.c index 456a6b42beb7..d99dd1f1f428 100644 --- a/umac/scan/dispatcher/src/wlan_scan_utils_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_utils_api.c @@ -358,6 +358,9 @@ util_scan_parse_extn_ie(struct scan_cache_entry *scan_params, struct extn_ie_header *extn_ie = (struct extn_ie_header *) ie; switch (extn_ie->ie_extn_id) { + case WLAN_EXTN_ELEMID_MAX_CHAN_SWITCH_TIME: + scan_params->ie_list.mcst = (uint8_t *)ie; + break; case WLAN_EXTN_ELEMID_SRP: scan_params->ie_list.srp = (uint8_t *)ie; break;