wlan-ap-Telecominfraproject/feeds/qca/hostapd/patches/d00-009-hostapd-update-muedca-params.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

294 lines
9.3 KiB
Diff

--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -1359,6 +1359,11 @@ static int hostapd_ctrl_iface_set(struct
} else if (os_strncmp(cmd, "wme_ac_", 7) == 0 ||
os_strncmp(cmd, "wmm_ac_", 7) == 0) {
hapd->parameter_set_count++;
+ /* Incrementing MU-EDCA Parameter Set Update Count*/
+ hapd->iface->conf->he_mu_edca.he_qos_info =
+ (hapd->iface->conf->he_mu_edca.he_qos_info & 0xf0) |
+ ((hapd->iface->conf->he_mu_edca.he_qos_info + 1) &
+ 0xf);
if (ieee802_11_update_beacons(hapd->iface))
wpa_printf(MSG_DEBUG,
"Failed to update beacons with WMM parameters");
--- a/src/ap/drv_callbacks.c
+++ b/src/ap/drv_callbacks.c
@@ -1937,6 +1937,39 @@ static void hostapd_event_wds_sta_interf
ifname, MAC2STR(addr));
}
+static void hostapd_event_update_muedca_params(struct hostapd_data *hapd,
+ struct update_muedca *params)
+{
+ int i;
+ u8 updated_count;
+
+ /* Update current MU-EDCA parameters */
+ for (i = 0; i < 3; i++) {
+ hapd->iface->conf->he_mu_edca.he_mu_ac_be_param[i] =
+ params->he_mu_ac_be_param[i];
+ hapd->iface->conf->he_mu_edca.he_mu_ac_bk_param[i] =
+ params->he_mu_ac_bk_param[i];
+ hapd->iface->conf->he_mu_edca.he_mu_ac_vo_param[i] =
+ params->he_mu_ac_vo_param[i];
+ hapd->iface->conf->he_mu_edca.he_mu_ac_vi_param[i] =
+ params->he_mu_ac_vi_param[i];
+ }
+
+ /* Increment Parameter Set Update Count for MU-EDCA and WME EDCA only
+ * if any STA is connected
+ */
+ if (hapd->num_sta) {
+ updated_count = (hapd->iface->conf->he_mu_edca.he_qos_info + 1) & 0xf;
+ hapd->iface->conf->he_mu_edca.he_qos_info &= 0xf0;
+ hapd->iface->conf->he_mu_edca.he_qos_info |= updated_count;
+ hapd->parameter_set_count++;
+ }
+
+ /* Update beacon with updated MU-EDCA parameters */
+ if (ieee802_11_update_beacons(hapd->iface))
+ wpa_printf(MSG_DEBUG,
+ "Failed to update beacons with MU-EDCA parameters");
+}
#ifdef CONFIG_OWE
static int hostapd_notif_update_dh_ie(struct hostapd_data *hapd,
@@ -2276,6 +2309,9 @@ void hostapd_wpa_event(void *ctx, enum w
hostapd_cleanup_cca_params(hapd);
break;
#endif /* CONFIG_IEEE80211AX */
+ case EVENT_UPDATE_MUEDCA_PARAMS:
+ hostapd_event_update_muedca_params(hapd, &data->update_muedca);
+ break;
default:
wpa_printf(MSG_DEBUG, "Unknown event %d", event);
break;
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -2774,6 +2774,9 @@ hostapd_alloc_bss_data(struct hostapd_if
dl_list_init(&hapd->sae_commit_queue);
#endif /* CONFIG_SAE */
+ if (conf && conf->ieee80211ax && hapd->iface)
+ hapd->parameter_set_count = hapd->iface->conf->he_mu_edca.he_qos_info & 0xf;
+
return hapd;
}
@@ -4026,6 +4029,10 @@ static int hostapd_fill_csa_settings(str
hapd->cs_count = settings->cs_count;
hapd->cs_block_tx = settings->block_tx;
+ /* reset MU-EDCA and WME EDCA parameter set count */
+ hapd->iface->conf->he_mu_edca.he_qos_info &= 0xfff0;
+ hapd->parameter_set_count = 0;
+
ret = hostapd_build_beacon_data(hapd, &settings->beacon_csa);
if (ret) {
free_beacon_data(&settings->beacon_after);
--- a/src/ap/ieee802_11_he.c
+++ b/src/ap/ieee802_11_he.c
@@ -18,6 +18,7 @@
#include "sta_info.h"
#include "ieee802_11.h"
#include "dfs.h"
+#include "wmm.h"
static u8 ieee80211_he_ppet_size(u8 ppe_thres_hdr, const u8 *phy_cap_info)
{
@@ -290,9 +291,16 @@ u8 * hostapd_eid_he_operation(struct hos
u8 * hostapd_eid_he_mu_edca_parameter_set(struct hostapd_data *hapd, u8 *eid)
{
struct ieee80211_he_mu_edca_parameter_set *edca;
+ struct hostapd_wmm_ac_params wmmp[WMM_AC_NUM];
u8 *pos;
size_t i;
+ /* Updating WME Parameter Set Count to avoid mismatch */
+ os_memset(wmmp, 0, sizeof(wmmp));
+
+ if (hapd->conf->wmm_enabled)
+ wmm_calc_regulatory_limit(hapd, wmmp);
+
pos = (u8 *) &hapd->iface->conf->he_mu_edca;
for (i = 0; i < sizeof(*edca); i++) {
if (pos[i])
--- a/src/ap/wmm.c
+++ b/src/ap/wmm.c
@@ -68,8 +68,8 @@ wmm_set_regulatory_limit(const struct ho
/*
* Calculate WMM regulatory limit if any.
*/
-static void wmm_calc_regulatory_limit(struct hostapd_data *hapd,
- struct hostapd_wmm_ac_params *acp)
+void wmm_calc_regulatory_limit(struct hostapd_data *hapd,
+ struct hostapd_wmm_ac_params *acp)
{
struct hostapd_hw_modes *mode = hapd->iface->current_mode;
int c;
@@ -98,6 +98,10 @@ static void wmm_calc_regulatory_limit(st
os_memcpy(hapd->iface->prev_wmm, acp,
sizeof(hapd->iconf->wmm_ac_params));
hapd->parameter_set_count++;
+ /* Incrementing MU-EDCA Parameter Set Update Count*/
+ hapd->iface->conf->he_mu_edca.he_qos_info =
+ (hapd->iface->conf->he_mu_edca.he_qos_info & 0xf0) |
+ ((hapd->iface->conf->he_mu_edca.he_qos_info + 1) & 0xf);
}
}
--- a/src/ap/wmm.h
+++ b/src/ap/wmm.h
@@ -13,6 +13,8 @@
struct ieee80211_mgmt;
struct wmm_tspec_element;
+void wmm_calc_regulatory_limit(struct hostapd_data *hapd,
+ struct hostapd_wmm_ac_params *acp);
u8 * hostapd_eid_wmm(struct hostapd_data *hapd, u8 *eid);
int hostapd_eid_wmm_valid(struct hostapd_data *hapd, const u8 *eid,
size_t len);
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -5694,6 +5694,16 @@ enum wpa_event_type {
EVENT_LINK_CH_SWITCH_STARTED,
/**
+ * EVENT_UPDATE_MUEDCA_PARAMS - Updated MU-EDCA parameters received
+ *
+ * this event is emitted when updated MU-EDCA parameters from driver
+ * are received. updated MU-EDCA parameters need to be updated in
+ * beacon.
+ */
+ EVENT_UPDATE_MUEDCA_PARAMS,
+
+
+ /**
* EVENT_TID_LINK_MAP - MLD event to set TID-to-link mapping
*
* This event is used by the driver to indicate the received TID-to-link
@@ -6631,6 +6641,16 @@ union wpa_event_data {
struct pasn_auth pasn_auth;
/**
+ * struct update_muedca - Data for EVENT_UPDATE_MU_EDCA_PARAMS
+ */
+ struct update_muedca {
+ u8 he_mu_ac_be_param[3];
+ u8 he_mu_ac_bk_param[3];
+ u8 he_mu_ac_vi_param[3];
+ u8 he_mu_ac_vo_param[3];
+ } update_muedca;
+
+ /**
* struct port_authorized - Data for EVENT_PORT_AUTHORIZED
*/
struct port_authorized {
--- a/src/drivers/driver_common.c
+++ b/src/drivers/driver_common.c
@@ -98,6 +98,7 @@ const char * event_to_string(enum wpa_ev
E2S(PASN_AUTH);
E2S(LINK_CH_SWITCH);
E2S(LINK_CH_SWITCH_STARTED);
+ E2S(UPDATE_MUEDCA_PARAMS);
E2S(TID_LINK_MAP);
E2S(LINK_RECONFIG);
}
--- a/src/drivers/driver_nl80211_event.c
+++ b/src/drivers/driver_nl80211_event.c
@@ -184,6 +184,7 @@ static const char * nl80211_command_to_s
C2S(NL80211_CMD_ADD_LINK_STA)
C2S(NL80211_CMD_MODIFY_LINK_STA)
C2S(NL80211_CMD_REMOVE_LINK_STA)
+ C2S(NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS)
C2S(NL80211_CMD_SET_HW_TIMESTAMP)
C2S(__NL80211_CMD_AFTER_LAST)
}
@@ -3533,6 +3534,35 @@ static void nl80211_sta_opmode_change_ev
wpa_supplicant_event(drv->ctx, EVENT_STATION_OPMODE_CHANGED, &ed);
}
+static void nl80211_update_muedca_params_event(struct wpa_driver_nl80211_data *drv,
+ struct nlattr **tb)
+{
+ struct host_update_muedca {
+ u8 mu_qos_info;
+ u8 ac_be[3];
+ u8 ac_bk[3];
+ u8 ac_vi[3];
+ u8 ac_vo[3];
+ };
+
+ struct host_update_muedca *rx_muedca_params;
+ union wpa_event_data ed;
+ int i;
+
+ if (!tb[NL80211_ATTR_HE_MUEDCA_PARAMS])
+ return;
+
+ rx_muedca_params = nla_data(tb[NL80211_ATTR_HE_MUEDCA_PARAMS]);
+
+ for (i = 0; i< 3; i++) {
+ ed.update_muedca.he_mu_ac_be_param[i] = rx_muedca_params->ac_be[i];
+ ed.update_muedca.he_mu_ac_bk_param[i] = rx_muedca_params->ac_bk[i];
+ ed.update_muedca.he_mu_ac_vi_param[i] = rx_muedca_params->ac_vi[i];
+ ed.update_muedca.he_mu_ac_vo_param[i] = rx_muedca_params->ac_vo[i];
+ }
+
+ wpa_supplicant_event(drv->ctx, EVENT_UPDATE_MUEDCA_PARAMS, &ed);
+}
static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv,
struct nlattr **tb)
@@ -3974,6 +4004,9 @@ static void do_process_drv_event(struct
nl80211_color_change_announcement_completed(drv);
break;
#endif /* CONFIG_IEEE80211AX */
+ case NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS:
+ nl80211_update_muedca_params_event(drv, tb);
+ break;
default:
wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event "
"(cmd=%d)", cmd);
--- a/src/drivers/nl80211_copy.h
+++ b/src/drivers/nl80211_copy.h
@@ -1309,6 +1309,11 @@
* The number of peers that HW timestamping can be enabled for concurrently
* is indicated by %NL80211_ATTR_MAX_HW_TIMESTAMP_PEERS.
*
+ * @NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS: Updated MU-EDCA parameters from driver.
+ * This event is used to update MU-EDCA parameters in Beacon frame, which
+ * were indicated by driver and now need to be reflected in
+ * Beacon frame.
+ *
* @NL80211_CMD_MAX: highest used command number
* @__NL80211_CMD_AFTER_LAST: internal use
*/
@@ -1562,6 +1567,7 @@ enum nl80211_commands {
NL80211_CMD_SET_HW_TIMESTAMP,
+ NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS,
/* add new commands above here */
/* used to define NL80211_CMD_MAX below */
@@ -2781,6 +2787,9 @@ enum nl80211_commands {
* the incoming frame RX timestamp.
* @NL80211_ATTR_TD_BITMAP: Transition Disable bitmap, for subsequent
* (re)associations.
+ * @NL80211_ATTR_HE_MUEDCA_PARAMS: MU-EDCA AC parameters for the
+ * NL80211_CMD_UPDATE_HE_MUEDCA_PARAMS command.
+ *
*
* @NL80211_ATTR_PUNCT_BITMAP: (u32) Preamble puncturing bitmap, lowest
* bit corresponds to the lowest 20 MHz channel. Each bit set to 1
@@ -3341,6 +3350,7 @@ enum nl80211_attrs {
NL80211_ATTR_EMA_RNR_ELEMS,
+ NL80211_ATTR_HE_MUEDCA_PARAMS,
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,