qcacld-3.0: Parse Channel Switch Wrapper IE in CSA event

“New channel width” information is not present in CSA event
received by host. When STA processes CSA beacon & CSA action frame
and moves to new channel, “New channel width” & "new channel center
frequencies" are not applied.

Firmware adds "Channel switch wrapper IE" information in CSA event and
sets "WMI_CSWRAP_IE_EXTENDED_PRESENT" bit in ies_present_flag.

Channel switch wrapper ie elemets are parsed to get Wide Bandwidth
Channel Switch information.

Change-Id: I095c49ae5a78cbfa8947e98cc39ec647aa7f3d27
CRs-Fixed: 2571406
This commit is contained in:
Abhishek Ambure 2019-11-15 18:22:45 +05:30 • committed by nshrivas
commit 0ceb5ca620

View file

@ -1071,6 +1071,32 @@ int wma_unified_csa_offload_enable(tp_wma_handle wma, uint8_t vdev_id)
}
#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
static uint8_t *
wma_parse_ch_switch_wrapper_ie(uint8_t *ch_wr_ie, uint8_t sub_ele_id)
{
uint8_t len = 0, sub_ele_len = 0;
struct ie_header *ele;
ele = (struct ie_header *)ch_wr_ie;
if (ele->ie_id != WLAN_ELEMID_CHAN_SWITCH_WRAP ||
ele->ie_len == 0)
return NULL;
len = ele->ie_len;
ele = (struct ie_header *)(ch_wr_ie + sizeof(struct ie_header));
while (len > 0) {
sub_ele_len = sizeof(struct ie_header) + ele->ie_len;
len -= sub_ele_len;
if (ele->ie_id == sub_ele_id)
return (uint8_t *)ele;
ele = (struct ie_header *)((uint8_t *)ele + sub_ele_len);
}
return NULL;
}
/**
* wma_csa_offload_handler() - CSA event handler
* @handle: wma handle
@ -1148,12 +1174,32 @@ int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len)
csa_offload_event->new_ch_width = wb_ie->new_ch_width;
csa_offload_event->new_ch_freq_seg1 = wb_ie->new_ch_freq_seg1;
csa_offload_event->new_ch_freq_seg2 = wb_ie->new_ch_freq_seg2;
} else if (csa_event->ies_present_flag &
WMI_CSWRAP_IE_EXTENDED_PRESENT) {
wb_ie = (struct ieee80211_ie_wide_bw_switch *)
wma_parse_ch_switch_wrapper_ie(
(uint8_t *)&csa_event->cswrap_ie_extended,
WLAN_ELEMID_WIDE_BAND_CHAN_SWITCH);
if (wb_ie) {
csa_offload_event->new_ch_width = wb_ie->new_ch_width;
csa_offload_event->new_ch_freq_seg1 =
wb_ie->new_ch_freq_seg1;
csa_offload_event->new_ch_freq_seg2 =
wb_ie->new_ch_freq_seg2;
csa_event->ies_present_flag |= WMI_WBW_IE_PRESENT;
}
}
csa_offload_event->ies_present_flag = csa_event->ies_present_flag;
WMA_LOGD("CSA: New Channel = %d BSSID:%pM",
csa_offload_event->channel, csa_offload_event->bssId);
WMA_LOGD("CSA: IEs Present Flag = 0x%x new ch width = %d ch center freq1 = %d ch center freq2 = %d new op class = %d",
csa_event->ies_present_flag,
csa_offload_event->new_ch_width,
csa_offload_event->new_ch_freq_seg1,
csa_offload_event->new_ch_freq_seg2,
csa_offload_event->new_op_class);
cur_chan = cds_freq_to_chan(intr[vdev_id].mhz);
/*