From e874411d1e05e5c327cbe5810c0924cf68de708b Mon Sep 17 00:00:00 2001 From: Shashikala Prabhu Date: Mon, 25 Jun 2018 10:52:32 +0530 Subject: [PATCH] qcacmn: Configure Allowed Channels and ACS Allowed Channels Description:- 'wifitool athX setprimarychans ch1 ch2 ... chn' will restart athX if current channel is not in primary allowed channel list. 'wifitool athX getprimarychans' to get primary allowed channel list. The channel selected by ACS, random channel selection will be ignored if it's not present in primary allowed channel list. When user sets the channel using iwconfig or doth_chanswitch, if the channel is not present in the primary allowed channel list then HOST does not honour the channel change. Change-Id: If37592d4246334a3c8fb17d44aaead7a6f9e969e CRs-Fixed: 2264102 --- umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h | 19 +++++++++++++++++++ umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h | 5 +++++ .../dispatcher/src/wlan_dfs_init_deinit_api.c | 2 ++ umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c | 12 ++++++++++++ umac/dfs/dispatcher/src/wlan_dfs_utils_api.c | 4 ++++ 5 files changed, 42 insertions(+) diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h index 878617eef9..08cbdc7865 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h @@ -243,4 +243,23 @@ void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, { } #endif + +/** + * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is + * present in the primary allowed channel list or not + * @pdev: Pointer to DFS pdev object. + * @chan_num: Channel number + */ +#if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) +bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, + uint32_t chan_num); + +#else +static inline +bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, + uint32_t chan_num) +{ + return true; +} +#endif #endif /* _WLAN_DFS_MLME_API_H_ */ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h index 940af67758..7e6387c527 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_ucfg_api.h @@ -54,6 +54,9 @@ * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs * channels. * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel. + * @mlme_check_allowed_prim_chanlist: Check whether the given channel is + * present in the primary allowed channel + * list or not. */ struct dfs_to_mlme { QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev, @@ -130,6 +133,8 @@ struct dfs_to_mlme { (struct wlan_objmgr_pdev *pdev); QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan) (struct wlan_objmgr_pdev *pdev, int no_chans_avail); + bool (*mlme_check_allowed_prim_chanlist) + (struct wlan_objmgr_pdev *pdev, uint32_t chan_num); }; extern struct dfs_to_mlme global_dfs_to_mlme; diff --git a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c index 040bfd4680..895f184dfa 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_init_deinit_api.c @@ -83,6 +83,8 @@ void register_dfs_callbacks(void) mlme_dfs_rebuild_chan_list_with_non_dfs_channels; tmp_dfs_to_mlme->mlme_restart_vaps_with_non_dfs_chan = mlme_dfs_restart_vaps_with_non_dfs_chan; + tmp_dfs_to_mlme->mlme_check_allowed_prim_chanlist = + mlme_dfs_check_allowed_prim_chanlist; } #else void register_dfs_callbacks(void) diff --git a/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c index 040744689c..0aa73f9321 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c @@ -305,3 +305,15 @@ void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, no_chans_avail); } #endif + +#if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) +bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, + uint32_t chan_num) +{ + if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist) + return true; + + return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev, + chan_num); +} +#endif diff --git a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c index 62de86f4bb..9a956aa85d 100644 --- a/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c +++ b/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c @@ -22,6 +22,7 @@ * to outside of DFS component. */ #include "wlan_dfs_utils_api.h" +#include "wlan_dfs_mlme_api.h" #include "../../core/src/dfs.h" #include "../../core/src/dfs_zero_cac.h" #include "../../core/src/dfs_etsi_precac.h" @@ -545,6 +546,9 @@ static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev, center_freq = tmp_chan_list[i].dfs_ch_freq; flagext = tmp_chan_list[i].dfs_ch_flagext; + if (!dfs_mlme_check_allowed_prim_chanlist(pdev, chan_num)) + continue; + if ((is_curchan_5g) && WLAN_REG_IS_5GHZ_CH(chan_num)) { chan_list[j].dfs_ch_ieee = chan_num; chan_list[j].dfs_ch_freq = center_freq;