qcacld-3.0: Process update ch_width request as per omn ie

AP sends "Operating Mode Notification" IE having max supported
channel width (say ap operating bw) via beacon/probe response/
association/re-association response frame.

When datapath detect leaky AP, to enable/disable, userspace
sends ch_width update to host.

Step 1. If STA founds OMN IE present in above frame, host
sends update channel width (say new AP operating BW is
80 MHz) ind via WMI_PEER_SET_PARAM_CMDID with param id 4
(WMI_HOST_PEER_CHWIDTH).

Step 2: After ch_width update to 80 MHz in FW at step 1,
if host receives a update ch_width (to 160 MHz) request
from userspace on leaky AP detection disable. Host updates
its internal channel info structure with new BW and sends
update indication to FW via WMI_VDEV_SET_PARAM_CMDID
with param id WMI_VDEV_PARAM_CHWIDTH_WITH_NOTIFY.

In case, if host allows ch_width update greater than ch_width
present in OMN IE (ap operating bw), FW only disable leaky
detection but did not update Rx/Tx BW as per new ch_width as
ap operating bw is still 80 MHz (configured at step 1).
This leads to out of sync for value of ch_width in host and
FW and IOT issues.

To keep host and FW in sync with current AP's operating BW,
add a sanity check and reject request before updating internal
channel info structure in host if new ch_width (coming from
user space) is greater than ap operating bw present OMN IE.

Change-Id: Iedc1706e32b9e08512ca6c9b98162902cd32f976
CRs-Fixed: 3732557
This commit is contained in:
Abhinav Kumar
2024-02-12 08:33:54 -08:00
committed by Ravindra Konda
parent 6da4ac706f
commit 36b79ad01e
9 changed files with 58 additions and 10 deletions

View File

@@ -7852,7 +7852,7 @@ wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
{
QDF_STATUS status;
wmi_host_channel_width wmi_chan_width;
enum phy_ch_width associated_ch_width;
enum phy_ch_width associated_ch_width, omn_ie_ch_width;
struct wlan_channel *des_chan;
struct mlme_legacy_priv *mlme_priv;
qdf_freq_t sec_2g_freq = 0;
@@ -7865,6 +7865,14 @@ wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
if (!des_chan)
return QDF_STATUS_E_INVAL;
omn_ie_ch_width =
mlme_priv->connect_info.assoc_chan_info.omn_ie_ch_width;
if (omn_ie_ch_width != CH_WIDTH_INVALID && ch_width > omn_ie_ch_width) {
mlme_debug("vdev %d: Invalid new chwidth:%d, omn_ie_cw:%d",
vdev_id, ch_width, omn_ie_ch_width);
return QDF_STATUS_E_INVAL;
}
associated_ch_width =
mlme_priv->connect_info.assoc_chan_info.assoc_ch_width;
if (associated_ch_width == CH_WIDTH_INVALID ||