wlan-ap-Telecominfraproject/feeds/qca/hostapd/patches/r04-007-hostapd-Add-NL-attribute-to-set-critical-update-para.patch
John Crispin 008ca9618d
Some checks failed
Build OpenWrt/uCentral images / build (cig_wf186h) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf186w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf188n) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf189) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cig_wf196) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-a1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (cybertan_eww631-b1) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap102) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap104) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap105) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap111) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_eap112) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (edgecore_oap101e-6e) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_3) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4x_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xe) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi) (push) Has been cancelled
Build OpenWrt/uCentral images / build (hfcl_ion4xi_w) (push) Has been cancelled
Build OpenWrt/uCentral images / build (indio_um-305ax) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sercomm_ap72tip) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630c-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-211g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (sonicfi_rap630w-311g) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-id2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (udaya_a6-od2) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr5018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018) (push) Has been cancelled
Build OpenWrt/uCentral images / build (wallys_dr6018-v4) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax820) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_ax840) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap640) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap650) (push) Has been cancelled
Build OpenWrt/uCentral images / build (yuncore_fap655) (push) Has been cancelled
Build OpenWrt/uCentral images / trigger-testing (push) Has been cancelled
Build OpenWrt/uCentral images / create-x64_vm-ami (push) Has been cancelled
ipq95xx: import ath12.4-cs kernel and drivers
Signed-off-by: John Crispin <john@phrozen.org>
2024-10-20 09:25:13 +02:00

327 lines
10 KiB
Diff

From 92dcec1419c26192f860f3d571459429c59c2df9 Mon Sep 17 00:00:00 2001
From: Yuvarani V <quic_yuvarani@quicinc.com>
Date: Mon, 4 Dec 2023 01:29:37 +0530
Subject: [PATCH] hostapd: Add NL attribute to set critical update params
Detect Category-1 critical update like CSA, eCSA, CCA element id inclusion
and set critical update attribute.
Detect Category-2 critical update like EHTOP, HEOP, VHTOP, HTOP, WMM,
MU_EDCA and spatial reuse element id modification and set
critical update attribute.
Signed-off-by: Rathees Kumar R Chinannan <quic_rrchinan@quicinc.com>
Signed-off-by: Yuvarani V <quic_yuvarani@quicinc.com>
---
src/ap/beacon.c | 63 ++++++++++++++++++++++++++++++++++++
src/ap/hostapd.h | 23 +++++++++++++
src/drivers/driver.h | 4 +++
src/drivers/driver_nl80211.c | 22 +++++++++++++
src/drivers/nl80211_copy.h | 18 +++++++++++
5 files changed, 130 insertions(+)
--- a/src/ap/beacon.c
+++ b/src/ap/beacon.c
@@ -13,6 +13,7 @@
#ifndef CONFIG_NATIVE_WINDOWS
#include "utils/common.h"
+#include "utils/crc32.h"
#include "common/ieee802_11_defs.h"
#include "common/ieee802_11_common.h"
#include "common/hw_features_common.h"
@@ -2118,6 +2119,31 @@ static u8 * hostapd_fils_discovery(struc
#endif /* CONFIG_FILS */
+#ifdef CONFIG_IEEE80211BE
+static void hostapd_eid_update_cu_info(struct hostapd_data *hapd, u8 *elemid_modified,
+ const u8 *eid_pos, size_t eid_len,
+ enum elemid_cu eid_cu)
+{
+ u32 hash;
+
+ if (!hapd->conf->mld_ap)
+ return;
+ if (!eid_pos || (eid_len == 0) || (eid_len > 255))
+ return;
+ if (eid_cu >= ELEMID_CU_PARAM_MAX)
+ return;
+
+ hash = ieee80211_crc32(eid_pos, eid_len);
+ if ((hapd->cu_eid[eid_cu].eid_len != eid_len) ||
+ (hapd->cu_eid[eid_cu].hash != hash)) {
+ hapd->cu_eid[eid_cu].eid_len = eid_len;
+ hapd->cu_eid[eid_cu].hash = hash;
+ *elemid_modified |= BIT(eid_cu);
+ }
+}
+#endif
+
+
int ieee802_11_build_ap_params(struct hostapd_data *hapd,
struct wpa_driver_ap_params *params)
{
@@ -2130,6 +2156,8 @@ int ieee802_11_build_ap_params(struct ho
u16 capab_info;
u8 *pos, *tailpos, *tailend, *csa_pos;
bool complete = false;
+ u8 *startpos;
+ u8 elemid_modified = 0;
#endif /* NEED_AP_MLME */
os_memset(params, 0, sizeof(*params));
@@ -2297,8 +2325,14 @@ int ieee802_11_build_ap_params(struct ho
tailpos = hostapd_eid_supported_op_classes(hapd, tailpos);
tailpos = hostapd_eid_ht_capabilities(hapd, tailpos);
+ startpos = tailpos;
tailpos = hostapd_eid_ht_operation(hapd, tailpos);
+#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_HTOP);
+#endif
+
if (hapd->iconf->mbssid && hapd->iconf->num_bss > 1) {
if (ieee802_11_build_ap_params_mbssid(hapd, params)) {
os_free(head);
@@ -2336,7 +2370,12 @@ int ieee802_11_build_ap_params(struct ho
if (hapd->iconf->ieee80211ac && !hapd->conf->disable_11ac &&
!is_6ghz_op_class(hapd->iconf->op_class)) {
tailpos = hostapd_eid_vht_capabilities(hapd, tailpos, 0);
+ startpos = tailpos;
tailpos = hostapd_eid_vht_operation(hapd, tailpos);
+#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_VHTOP);
+#endif
tailpos = hostapd_eid_txpower_envelope(hapd, tailpos);
}
#endif /* CONFIG_IEEE80211AC */
@@ -2364,16 +2403,31 @@ int ieee802_11_build_ap_params(struct ho
tailpos = hostapd_eid_he_capab(hapd, tailpos,
IEEE80211_MODE_AP);
+ startpos = tailpos;
tailpos = hostapd_eid_he_operation(hapd, tailpos);
+#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_EXT_HEOP);
+#endif
/* BSS Color Change Announcement element */
cca_pos = hostapd_eid_cca(hapd, tailpos);
if (cca_pos != tailpos)
hapd->cca_c_off_beacon = cca_pos - tail - 2;
tailpos = cca_pos;
+ startpos = tailpos;
tailpos = hostapd_eid_spatial_reuse(hapd, tailpos);
+#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_SPATIAL_REUSE);
+#endif
+ startpos = tailpos;
tailpos = hostapd_eid_he_mu_edca_parameter_set(hapd, tailpos);
+#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_MU_EDCA);
+#endif
tailpos = hostapd_eid_he_6ghz_band_cap(hapd, tailpos);
}
#endif /* CONFIG_IEEE80211AX */
@@ -2385,7 +2439,10 @@ int ieee802_11_build_ap_params(struct ho
true);
tailpos = hostapd_eid_eht_capab(hapd, tailpos,
IEEE80211_MODE_AP);
+ startpos = tailpos;
tailpos = hostapd_eid_eht_operation(hapd, tailpos, IEEE80211_MODE_AP);
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_EXT_EHTOP);
tailpos = hostapd_eid_vendor_240mhz(hapd, tailpos, IEEE80211_MODE_AP);
}
#endif /* CONFIG_IEEE80211BE */
@@ -2400,8 +2457,11 @@ int ieee802_11_build_ap_params(struct ho
tailpos = hostapd_get_osen_ie(hapd, tailpos, tailend - tailpos);
/* Wi-Fi Alliance WMM */
+ startpos = tailpos;
tailpos = hostapd_eid_wmm(hapd, tailpos);
#ifdef CONFIG_IEEE80211BE
+ hostapd_eid_update_cu_info(hapd, &elemid_modified, startpos,
+ tailpos-startpos, ELEMID_CU_PARAM_WMM);
tailpos = hostapd_add_scs_cap(tailpos, false, true);
#endif
#ifdef CONFIG_WPS
@@ -2537,6 +2597,9 @@ int ieee802_11_build_ap_params(struct ho
params->beacon_tx_mode = hapd->conf->beacon_tx_mode;
+ if (hapd->conf->mld_ap && elemid_modified)
+ params->elemid_modified = 1;
+
#ifdef CONFIG_IEEE80211BE
if (hapd->conf->mld_ap && hapd->iconf->ieee80211be &&
!hapd->conf->disable_11be) {
--- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h
@@ -194,6 +194,27 @@ struct rx_critical_param {
};
/**
+ * enum elemid_cu - used for detecting element id modification
+ * category 2 critical update
+ */
+enum elemid_cu {
+ ELEMID_CU_PARAM_EXT_EHTOP = 0,
+ ELEMID_CU_PARAM_EXT_HEOP,
+ ELEMID_CU_PARAM_VHTOP,
+ ELEMID_CU_PARAM_HTOP,
+ ELEMID_CU_PARAM_WMM,
+ ELEMID_CU_PARAM_MU_EDCA,
+ ELEMID_CU_PARAM_SPATIAL_REUSE,
+
+ ELEMID_CU_PARAM_MAX,
+};
+
+struct elemid_cu_param {
+ u8 eid_len;
+ u32 hash;
+};
+
+/**
* struct hostapd_data - hostapd per-BSS data structure
*/
struct hostapd_data {
@@ -505,6 +526,8 @@ struct hostapd_data {
#endif /* CONFIG_CTRL_IFACE_UDP */
struct rx_critical_param rx_cu_param;
+ /*Element ID critical update data*/
+ struct elemid_cu_param cu_eid[ELEMID_CU_PARAM_MAX];
#ifdef CONFIG_IEEE80211BE
struct hostapd_mld *mld;
struct dl_list link;
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1902,6 +1902,10 @@ struct wpa_driver_ap_params {
/* Unsolicited broadcast Probe Response data*/
struct unsol_bcast_probe_resp ubpr;
+ /* critical_update_flag - critical update flag*/
+ bool elemid_added;
+ bool elemid_modified;
+
/**
* allowed_freqs - List of allowed 20 MHz channel center frequencies in
* MHz for AP operation. Drivers which support this parameter will
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -5063,6 +5063,7 @@ static int wpa_driver_nl80211_set_ap(voi
#ifdef CONFIG_MESH
struct wpa_driver_mesh_bss_params mesh_params;
#endif /* CONFIG_MESH */
+ u8 critical_update = 0;
if (params->mld_ap) {
size_t i;
@@ -5399,6 +5400,14 @@ static int wpa_driver_nl80211_set_ap(voi
goto fail;
#endif /* CONFIG_FILS */
+ if (bss->n_links && (params->elemid_added || params->elemid_modified)) {
+ if (params->elemid_added)
+ critical_update |= NL80211_CU_ELEMID_ADDED;
+ if (params->elemid_modified)
+ critical_update |= NL80211_CU_ELEMID_MODIFIED;
+ if (nla_put_u8(msg, NL80211_ATTR_SET_CRITICAL_UPDATE, critical_update))
+ goto fail;
+ }
if (params->punct_bitmap) {
wpa_printf(MSG_DEBUG, "nl80211: Puncturing bitmap=0x%04x",
params->punct_bitmap);
@@ -11213,6 +11222,7 @@ static int nl80211_switch_channel(void *
int ret = -ENOBUFS;
int csa_off_len = 0;
int i;
+ u8 critical_update = 0;
wpa_printf(MSG_DEBUG,
"nl80211: Channel switch request (cs_count=%u block_tx=%u freq=%d channel=%d sec_channel_offset=%d width=%d cf1=%d cf2=%d puncturing_bitmap=0x%04x%s%s%s puncturing bitmap=0x%04x, ru_punct_ofdma=%u)",
@@ -11350,6 +11360,12 @@ static int nl80211_switch_channel(void *
goto fail;
#endif /* CONFIG_IEEE80211AX */
+ if (bss->n_links) {
+ critical_update |= NL80211_CU_ELEMID_ADDED;
+ if (nla_put_u8(msg, NL80211_ATTR_SET_CRITICAL_UPDATE, critical_update))
+ goto fail;
+ }
+
ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG, "nl80211: switch_channel failed err=%d (%s)",
@@ -11374,6 +11390,7 @@ static int nl80211_switch_color(void *pr
struct nlattr *beacon_cca;
struct nl_msg *msg;
int ret = -ENOBUFS;
+ u8 critical_update = 0;
wpa_printf(MSG_DEBUG,
"nl80211: Color change request (cca_count=%u color=%d)",
@@ -11447,6 +11464,11 @@ static int nl80211_switch_color(void *pr
goto error;
}
+ if (bss->n_links) {
+ critical_update |= NL80211_CU_ELEMID_ADDED;
+ if (nla_put_u8(msg, NL80211_ATTR_SET_CRITICAL_UPDATE, critical_update))
+ goto error;
+ }
ret = send_and_recv_msgs(drv, msg, NULL, NULL, NULL, NULL);
if (ret) {
wpa_printf(MSG_DEBUG,
--- a/src/drivers/nl80211_copy.h
+++ b/src/drivers/nl80211_copy.h
@@ -2842,7 +2842,9 @@ enum nl80211_commands {
* @NL80211_ATTR_RXMGMT_CRITICAL_UPDATE: Nested attribute listing the critical
* update for each MLD. In each nested item, it contains attributes
* defined in &enum nl80211_cu_attrs.
-
+ * @NL80211_ATTR_SET_CRITICAL_UPDATE: set critical update for the bss
+ * (see &enum nl80211_set_cu).
+ *
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
@@ -3400,6 +3402,7 @@ enum nl80211_attrs {
NL80211_ATTR_ADD_MULTI_CHAN,
NL80211_ATTR_DEL_MULTI_CHAN,
NL80211_ATTR_RXMGMT_CRITICAL_UPDATE,
+ NL80211_ATTR_SET_CRITICAL_UPDATE,
/* add attributes here, update the policy in nl80211.c */
@@ -6061,6 +6064,21 @@ enum plink_actions {
NUM_NL80211_PLINK_ACTIONS,
};
+/**
+ * enum nl80211_set_cu - set critical update params
+ *
+ * @NL80211_CU_UNSPEC: reserved
+ * @NL80211_CU_ELEMID_ADDED: Critical update - Element id added
+ * @NL80211_CU_ELEMID_MODIFIED: Critical update - Element id Modified
+ * @NUM_NL80211_CUS: number of CU attributes
+ */
+enum nl80211_set_cu {
+ NL80211_CU_UNSPEC,
+ NL80211_CU_ELEMID_ADDED,
+ NL80211_CU_ELEMID_MODIFIED,
+
+ NUM_NL80211_CUS,
+};
#define NL80211_KCK_LEN 16
#define NL80211_KEK_LEN 16