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
Cette révision appartient à :
Hariharan Basuthkar
2018-11-26 11:19:19 +05:30
révisé par nshrivas
Parent 268579c204
révision 738320eef9
6 fichiers modifiés avec 66 ajouts et 0 suppressions

Voir le fichier

@@ -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;

Voir le fichier

@@ -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

Voir le fichier

@@ -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;