qcacmn: Bring Up STA without dissociation when AP switches to DFS Channel
AP is configured to operate in Channel 100(HT80), and Zero Wait DFS is enabled. Once PreCAC is complete on DFS Channels,inject radar in Channel 100 and AP moves to another DFS channel 116 and beacons immediately but station associated to AP still does a scan again. When the station receives the Channel Switch Announcement from AP, it dissociates from the AP and scans again. Maximum Switch time Information Element can be used by the Station to to know if the AP has done PreCAC on target channel. Maximum Switch Time IE is part of AP's beacon and is the sum of CAC timeout on the target channel and 1 beacon interval. If PreCAC is done on target channel, the CAC timeout is zero and Maximum Switch time IE is equal to 1 beacon interval. This element is sent to Station along with Channel Switch Announcement. The Station receives the maximum channel switch time element. If the value of maximum channel switch time element is less then or equal to beacon interval, the station associates with the AP seamlessly without dissociation. If the value of the Maximum Channel Switch Time IE is greater than 1 beacon interval, then, the Station has to dissociate from the AP since, ZeroCAC has not been done by the AP. Change-Id: I0301a68c1731cc268b9a6900258261034476446b CRs-Fixed: 2330817
Šī revīzija ir iekļauta:

revīziju iesūtīja
nshrivas

vecāks
268579c204
revīzija
738320eef9
@@ -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.
|
||||
|
@@ -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)
|
||||
{
|
||||
|
Atsaukties uz šo jaunā problēmā
Block a user