diff mbox series

Add an option to remove advanced features

Message ID 20231011151937.157323-1-Chaitanya.Tata@nordicsemi.no
State Changes Requested
Headers show
Series Add an option to remove advanced features | expand

Commit Message

Krishna Chaitanya Oct. 11, 2023, 3:19 p.m. UTC
For a memory constrained system, basic Wi-Fi is enough, so, add a
configuration option to compiled out advanced Wi-Fi features but seldom
used as below:

* RRM
* Robust AV
* WMM-AC

Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no>
---
 hostapd/ctrl_iface.c              |   2 +
 wpa_supplicant/Makefile           |  24 ++++-
 wpa_supplicant/ctrl_iface.c       | 167 ++++++++++++++++--------------
 wpa_supplicant/defconfig          |   9 ++
 wpa_supplicant/events.c           |  18 +++-
 wpa_supplicant/scan.c             |   3 +-
 wpa_supplicant/sme.c              |   7 +-
 wpa_supplicant/wpa_cli.c          |   3 +-
 wpa_supplicant/wpa_supplicant.c   |  35 ++++++-
 wpa_supplicant/wpa_supplicant_i.h |  33 +++---
 10 files changed, 193 insertions(+), 108 deletions(-)

Comments

Jouni Malinen Nov. 7, 2023, 9:01 a.m. UTC | #1
On Wed, Oct 11, 2023 at 08:49:37PM +0530, Chaitanya Tata wrote:
> For a memory constrained system, basic Wi-Fi is enough, so, add a
> configuration option to compiled out advanced Wi-Fi features but seldom
> used as below:
> 
> * RRM
> * Robust AV
> * WMM-AC

It would be fine to make these conditional components in the build,
but..

> diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig
> +# Radio Measurement (IEEE 802.11k)
> +CONFIG_RRM=y
> +
> +# WMM admission control
> +CONFIG_WMM_AC=y
> +
> +# Robust AV streaming for consumer and enterprise Wi-Fi applications 802.11-202 (4.3.24)
> +CONFIG_ROBUST_AV=y

.. this way of doing that would result in unexpected changes to existing
cases when updated hostap.git version since the in-use .config would not
be modified automatically. At minimum, wpa_supplicant/android.config
would need to be updated in similar manner. Another approach would be to
use items like CONFIG_NO_RRM=y to remove functionality that used to be
included by default. There are examples of both of those cases in the
past, e.g., with CONFIG_WEP=y where the goal is to remove WEP from
builds completely while having to maintain it temporarily for Android
and with CONFIG_NO_TKIP=y where there is no immediate goal to remove it
completely, but to provide an option for doing that now and potentially
changing this to remove the functionality in future. That said, there is
no goal of completely removing RRM/WMM-AC/Robust AV in long term.

Please also note that wpa_supplicant/Android.mk would need changes to
avoid breaking Android builds.
Krishna Chaitanya Nov. 7, 2023, 11:18 a.m. UTC | #2
On Tue, Nov 7, 2023 at 2:31 PM Jouni Malinen <j@w1.fi> wrote:
> .. this way of doing that would result in unexpected changes to existing
> cases when updated hostap.git version since the in-use .config would not
> be modified automatically. At minimum, wpa_supplicant/android.config
> would need to be updated in similar manner. Another approach would be to
> use items like CONFIG_NO_RRM=y to remove functionality that used to be
> included by default. There are examples of both of those cases in the
> past, e.g., with CONFIG_WEP=y where the goal is to remove WEP from
> builds completely while having to maintain it temporarily for Android
> and with CONFIG_NO_TKIP=y where there is no immediate goal to remove it
> completely, but to provide an option for doing that now and potentially
> changing this to remove the functionality in future. That said, there is
> no goal of completely removing RRM/WMM-AC/Robust AV in long term.
>
> Please also note that wpa_supplicant/Android.mk would need changes to
> avoid breaking Android builds.

Thanks, I will go with the NO_<feat> approach and submit a v2, also, need to
protect WNM dependencies in MBO.
diff mbox series

Patch

diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c
index f90eb22c4..b1ebb788e 100644
--- a/hostapd/ctrl_iface.c
+++ b/hostapd/ctrl_iface.c
@@ -1299,12 +1299,14 @@  static int hostapd_ctrl_iface_set(struct hostapd_data *hapd, char *cmd)
 			hostapd_disassoc_deny_mac(hapd);
 		} else if (os_strcasecmp(cmd, "accept_mac_file") == 0) {
 			hostapd_disassoc_accept_mac(hapd);
+#ifdef CONFIG_WMM_AC
 		} else if (os_strncmp(cmd, "wme_ac_", 7) == 0 ||
 			   os_strncmp(cmd, "wmm_ac_", 7) == 0) {
 			hapd->parameter_set_count++;
 			if (ieee802_11_update_beacons(hapd->iface))
 				wpa_printf(MSG_DEBUG,
 					   "Failed to update beacons with WMM parameters");
+#endif /* CONFIG_WMM_AC */
 		} else if (os_strcmp(cmd, "wpa_passphrase") == 0 ||
 			   os_strcmp(cmd, "sae_password") == 0 ||
 			   os_strcmp(cmd, "sae_pwe") == 0) {
diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile
index 57620fe79..a0934bb93 100644
--- a/wpa_supplicant/Makefile
+++ b/wpa_supplicant/Makefile
@@ -111,10 +111,7 @@  OBJS += ../src/utils/wpabuf.o
 OBJS += ../src/utils/bitfield.o
 OBJS += ../src/utils/ip_addr.o
 OBJS += ../src/utils/crc32.o
-OBJS += op_classes.o
-OBJS += rrm.o
 OBJS += twt.o
-OBJS += robust_av.o
 OBJS_p = wpa_passphrase.o
 OBJS_p += ../src/utils/common.o
 OBJS_p += ../src/utils/wpa_debug.o
@@ -123,7 +120,6 @@  OBJS_c = wpa_cli.o ../src/common/wpa_ctrl.o
 OBJS_c += ../src/utils/wpa_debug.o
 OBJS_c += ../src/utils/common.o
 OBJS_c += ../src/common/cli.o
-OBJS += wmm_ac.o
 
 ifndef CONFIG_OS
 ifdef CONFIG_NATIVE_WINDOWS
@@ -445,6 +441,25 @@  ifdef CONFIG_NO_ROAMING
 CFLAGS += -DCONFIG_NO_ROAMING
 endif
 
+ifdef CONFIG_RRM
+CFLAGS += -DCONFIG_RRM
+OBJS += rrm.o
+ifdef CONFIG_AP
+OBJS += ../src/ap/rrm.o
+endif
+OBJS += op_classes.o
+endif
+
+ifdef CONFIG_WMM_AC
+CFLAGS += -DCONFIG_WMM_AC
+OBJS += wmm_ac.o
+endif
+
+ifdef CONFIG_ROBUST_AV
+CFLAGS += -DCONFIG_ROBUST_AV
+OBJS += robust_av.o
+endif
+
 include ../src/drivers/drivers.mak
 ifdef CONFIG_AP
 OBJS_d += $(DRV_BOTH_OBJS)
@@ -951,7 +966,6 @@  OBJS += ../src/ap/beacon.o
 OBJS += ../src/ap/bss_load.o
 OBJS += ../src/ap/eap_user_db.o
 OBJS += ../src/ap/neighbor_db.o
-OBJS += ../src/ap/rrm.o
 OBJS += ../src/ap/ieee802_11_ht.o
 ifdef CONFIG_IEEE80211AC
 OBJS += ../src/ap/ieee802_11_vht.o
diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index b14c78f80..47548dffa 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -932,8 +932,10 @@  static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
 			return -1;
 		wnm_set_coloc_intf_elems(wpa_s, elems);
 #endif /* CONFIG_WNM */
+#ifdef CONFIG_ROBUST_AV
 	} else if (os_strcasecmp(cmd, "enable_dscp_policy_capa") == 0) {
 		wpa_s->enable_dscp_policy_capa = !!atoi(value);
+#endif /* CONFIG_ROBUST_AV */
 	} else {
 		value[-1] = '=';
 		ret = wpa_config_process_global(wpa_s->conf, cmd, -1);
@@ -1260,6 +1262,7 @@  static int wpa_supplicant_ctrl_iface_tdls_link_status(
 #endif /* CONFIG_TDLS */
 
 
+#ifdef CONFIG_WMM_AC
 static int wmm_ac_ctrl_addts(struct wpa_supplicant *wpa_s, char *cmd)
 {
 	char *token, *context = NULL;
@@ -1308,7 +1311,7 @@  static int wmm_ac_ctrl_delts(struct wpa_supplicant *wpa_s, char *cmd)
 
 	return wpas_wmm_ac_delts(wpa_s, tsid);
 }
-
+#endif /* CONFIG_WMM_AC */
 
 #ifdef CONFIG_IEEE80211R
 static int wpa_supplicant_ctrl_iface_ft_ds(
@@ -8327,7 +8330,6 @@  static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
 						  list);
 }
 
-
 static int wpas_ctrl_iface_coloc_intf_report(struct wpa_supplicant *wpa_s,
 					     char *cmd)
 {
@@ -8900,7 +8902,9 @@  static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
 	wpa_s->next_scan_bssid_wildcard_ssid = 0;
 	os_free(wpa_s->select_network_scan_freqs);
 	wpa_s->select_network_scan_freqs = NULL;
+#ifdef CONFIG_ROBUST_AV
 	os_memset(&wpa_s->robust_av, 0, sizeof(struct robust_av_data));
+#endif /* CONFIG_ROBUST_AV */
 
 	wpa_bss_flush(wpa_s);
 	if (!dl_list_empty(&wpa_s->bss)) {
@@ -8927,7 +8931,9 @@  static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
 
 	free_bss_tmp_disallowed(wpa_s);
 
+#ifdef CONFIG_ROBUST_AV
 	os_memset(&wpa_s->robust_av, 0, sizeof(struct robust_av_data));
+#endif /* CONFIG_ROBUST_AV */
 
 #ifdef CONFIG_PASN
 	wpas_pasn_auth_stop(wpa_s);
@@ -10559,7 +10565,7 @@  static int wpas_ctrl_vendor_elem_remove(struct wpa_supplicant *wpa_s, char *cmd)
 	return res;
 }
 
-
+#ifdef CONFIG_RRM
 static void wpas_ctrl_neighbor_rep_cb(void *ctx, struct wpabuf *neighbor_rep)
 {
 	struct wpa_supplicant *wpa_s = ctx;
@@ -10662,7 +10668,6 @@  out:
 	wpabuf_free(neighbor_rep);
 }
 
-
 static int wpas_ctrl_iface_send_neighbor_rep(struct wpa_supplicant *wpa_s,
 					     char *cmd)
 {
@@ -10702,7 +10707,7 @@  static int wpas_ctrl_iface_send_neighbor_rep(struct wpa_supplicant *wpa_s,
 
 	return ret;
 }
-
+#endif /* CONFIG_RRM */
 
 static int wpas_ctrl_iface_erp_flush(struct wpa_supplicant *wpa_s)
 {
@@ -11056,76 +11061,6 @@  int wpas_ctrl_cmd_debug_level(const char *cmd)
 }
 
 
-static int wpas_ctrl_iface_configure_mscs(struct wpa_supplicant *wpa_s,
-					  const char *cmd)
-{
-	size_t frame_classifier_len;
-	const char *pos, *end;
-	struct robust_av_data *robust_av = &wpa_s->robust_av;
-	int val;
-
-	/*
-	 * format:
-	 * <add|remove|change> [up_bitmap=<hex byte>] [up_limit=<integer>]
-	 * [stream_timeout=<in TUs>] [frame_classifier=<hex bytes>]
-	 */
-	os_memset(robust_av, 0, sizeof(struct robust_av_data));
-	if (os_strncmp(cmd, "add ", 4) == 0) {
-		robust_av->request_type = SCS_REQ_ADD;
-	} else if (os_strcmp(cmd, "remove") == 0) {
-		robust_av->request_type = SCS_REQ_REMOVE;
-		robust_av->valid_config = false;
-		return wpas_send_mscs_req(wpa_s);
-	} else if (os_strncmp(cmd, "change ", 7) == 0) {
-		robust_av->request_type = SCS_REQ_CHANGE;
-	} else {
-		return -1;
-	}
-
-	pos = os_strstr(cmd, "up_bitmap=");
-	if (!pos)
-		return -1;
-
-	val = hex2byte(pos + 10);
-	if (val < 0)
-		return -1;
-	robust_av->up_bitmap = val;
-
-	pos = os_strstr(cmd, "up_limit=");
-	if (!pos)
-		return -1;
-
-	robust_av->up_limit = atoi(pos + 9);
-
-	pos = os_strstr(cmd, "stream_timeout=");
-	if (!pos)
-		return -1;
-
-	robust_av->stream_timeout = atoi(pos + 15);
-	if (robust_av->stream_timeout == 0)
-		return -1;
-
-	pos = os_strstr(cmd, "frame_classifier=");
-	if (!pos)
-		return -1;
-
-	pos += 17;
-	end = os_strchr(pos, ' ');
-	if (!end)
-		end = pos + os_strlen(pos);
-
-	frame_classifier_len = (end - pos) / 2;
-	if (frame_classifier_len > sizeof(robust_av->frame_classifier) ||
-	    hexstr2bin(pos, robust_av->frame_classifier, frame_classifier_len))
-		return -1;
-
-	robust_av->frame_classifier_len = frame_classifier_len;
-	robust_av->valid_config = true;
-
-	return wpas_send_mscs_req(wpa_s);
-}
-
-
 #ifdef CONFIG_PASN
 static int wpas_ctrl_iface_pasn_start(struct wpa_supplicant *wpa_s, char *cmd)
 {
@@ -11227,6 +11162,75 @@  static int wpas_ctrl_iface_pasn_deauthenticate(struct wpa_supplicant *wpa_s,
 
 #endif /* CONFIG_PASN */
 
+#ifdef CONFIG_ROBUST_AV
+static int wpas_ctrl_iface_configure_mscs(struct wpa_supplicant *wpa_s,
+					  const char *cmd)
+{
+	size_t frame_classifier_len;
+	const char *pos, *end;
+	struct robust_av_data *robust_av = &wpa_s->robust_av;
+	int val;
+
+	/*
+	 * format:
+	 * <add|remove|change> [up_bitmap=<hex byte>] [up_limit=<integer>]
+	 * [stream_timeout=<in TUs>] [frame_classifier=<hex bytes>]
+	 */
+	os_memset(robust_av, 0, sizeof(struct robust_av_data));
+	if (os_strncmp(cmd, "add ", 4) == 0) {
+		robust_av->request_type = SCS_REQ_ADD;
+	} else if (os_strcmp(cmd, "remove") == 0) {
+		robust_av->request_type = SCS_REQ_REMOVE;
+		robust_av->valid_config = false;
+		return wpas_send_mscs_req(wpa_s);
+	} else if (os_strncmp(cmd, "change ", 7) == 0) {
+		robust_av->request_type = SCS_REQ_CHANGE;
+	} else {
+		return -1;
+	}
+
+	pos = os_strstr(cmd, "up_bitmap=");
+	if (!pos)
+		return -1;
+
+	val = hex2byte(pos + 10);
+	if (val < 0)
+		return -1;
+	robust_av->up_bitmap = val;
+
+	pos = os_strstr(cmd, "up_limit=");
+	if (!pos)
+		return -1;
+
+	robust_av->up_limit = atoi(pos + 9);
+
+	pos = os_strstr(cmd, "stream_timeout=");
+	if (!pos)
+		return -1;
+
+	robust_av->stream_timeout = atoi(pos + 15);
+	if (robust_av->stream_timeout == 0)
+		return -1;
+
+	pos = os_strstr(cmd, "frame_classifier=");
+	if (!pos)
+		return -1;
+
+	pos += 17;
+	end = os_strchr(pos, ' ');
+	if (!end)
+		end = pos + os_strlen(pos);
+
+	frame_classifier_len = (end - pos) / 2;
+	if (frame_classifier_len > sizeof(robust_av->frame_classifier) ||
+	    hexstr2bin(pos, robust_av->frame_classifier, frame_classifier_len))
+		return -1;
+
+	robust_av->frame_classifier_len = frame_classifier_len;
+	robust_av->valid_config = true;
+
+	return wpas_send_mscs_req(wpa_s);
+}
 
 static int set_type4_frame_classifier(const char *cmd,
 				      struct type4_params *param)
@@ -11923,6 +11927,7 @@  static int wpas_ctrl_iface_send_dscp_query(struct wpa_supplicant *wpa_s,
 
 	return wpas_send_dscp_query(wpa_s, pos + 12, os_strlen(pos + 12));
 }
+#endif /* CONFIG_ROBUST_AV */
 
 
 static int wpas_ctrl_iface_mlo_signal_poll(struct wpa_supplicant *wpa_s,
@@ -12707,6 +12712,7 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 		reply_len = wpa_supplicant_ctrl_iface_tdls_link_status(
 			wpa_s, buf + 17, reply, reply_size);
 #endif /* CONFIG_TDLS */
+#ifdef CONFIG_WMM_AC
 	} else if (os_strcmp(buf, "WMM_AC_STATUS") == 0) {
 		reply_len = wpas_wmm_ac_status(wpa_s, reply, reply_size);
 	} else if (os_strncmp(buf, "WMM_AC_ADDTS ", 13) == 0) {
@@ -12715,6 +12721,7 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 	} else if (os_strncmp(buf, "WMM_AC_DELTS ", 13) == 0) {
 		if (wmm_ac_ctrl_delts(wpa_s, buf + 13))
 			reply_len = -1;
+#endif /* CONFIG_WMM_AC */
 	} else if (os_strncmp(buf, "SIGNAL_POLL", 11) == 0) {
 		reply_len = wpa_supplicant_signal_poll(wpa_s, reply,
 						       reply_size);
@@ -12851,9 +12858,11 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 	} else if (os_strncmp(buf, "VENDOR_ELEM_REMOVE ", 19) == 0) {
 		if (wpas_ctrl_vendor_elem_remove(wpa_s, buf + 19) < 0)
 			reply_len = -1;
+#ifdef CONFIG_RRM
 	} else if (os_strncmp(buf, "NEIGHBOR_REP_REQUEST", 20) == 0) {
 		if (wpas_ctrl_iface_send_neighbor_rep(wpa_s, buf + 20))
 			reply_len = -1;
+#endif /* CONFIG_RRM */
 	} else if (os_strcmp(buf, "ERP_FLUSH") == 0) {
 		wpas_ctrl_iface_erp_flush(wpa_s);
 	} else if (os_strncmp(buf, "MAC_RAND_SCAN ", 14) == 0) {
@@ -13026,9 +13035,6 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 			reply_len = -1;
 #endif /* CONFIG_DPP3 */
 #endif /* CONFIG_DPP */
-	} else if (os_strncmp(buf, "MSCS ", 5) == 0) {
-		if (wpas_ctrl_iface_configure_mscs(wpa_s, buf + 5))
-			reply_len = -1;
 #ifdef CONFIG_PASN
 	} else if (os_strncmp(buf, "PASN_START ", 11) == 0) {
 		if (wpas_ctrl_iface_pasn_start(wpa_s, buf + 11) < 0)
@@ -13041,6 +13047,10 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 		if (wpas_ctrl_iface_pasn_deauthenticate(wpa_s, buf + 12) < 0)
 			reply_len = -1;
 #endif /* CONFIG_PASN */
+#ifdef CONFIG_ROBUST_AV
+	} else if (os_strncmp(buf, "MSCS ", 5) == 0) {
+		if (wpas_ctrl_iface_configure_mscs(wpa_s, buf + 5))
+			reply_len = -1;
 	} else if (os_strncmp(buf, "SCS ", 4) == 0) {
 		if (wpas_ctrl_iface_configure_scs(wpa_s, buf + 4))
 			reply_len = -1;
@@ -13050,6 +13060,7 @@  char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
 	} else if (os_strncmp(buf, "DSCP_QUERY ", 11) == 0) {
 		if (wpas_ctrl_iface_send_dscp_query(wpa_s, buf + 11))
 			reply_len = -1;
+#endif /* CONFIG_ROBUST_AV */
 	} else if (os_strcmp(buf, "MLO_STATUS") == 0) {
 		reply_len = wpas_ctrl_iface_mlo_status(wpa_s, reply,
 						       reply_size);
diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig
index a4f20d439..c3a1cc130 100644
--- a/wpa_supplicant/defconfig
+++ b/wpa_supplicant/defconfig
@@ -652,3 +652,12 @@  CONFIG_DPP2=y
 # design is still subject to change. As such, this should not yet be enabled in
 # production use.
 #CONFIG_PASN=y
+
+# Radio Measurement (IEEE 802.11k)
+CONFIG_RRM=y
+
+# WMM admission control
+CONFIG_WMM_AC=y
+
+# Robust AV streaming for consumer and enterprise Wi-Fi applications 802.11-202 (4.3.24)
+CONFIG_ROBUST_AV=y
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index f205b91d5..ac827d849 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -386,7 +386,9 @@  void wpa_supplicant_mark_disassoc(struct wpa_supplicant *wpa_s)
 	wpa_s->key_mgmt = 0;
 	wpa_s->allowed_key_mgmts = 0;
 
+#ifdef CONFIG_RRM
 	wpas_rrm_reset(wpa_s);
+#endif /* CONFIG_RRM */
 	wpa_s->wnmsleep_used = 0;
 	wnm_clear_coloc_intf_reporting(wpa_s);
 	wpa_s->disable_mbo_oce = 0;
@@ -2305,9 +2307,11 @@  static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
 	if (sme_proc_obss_scan(wpa_s) > 0)
 		goto scan_work_done;
 
+#ifdef CONFIG_RRM
 	if (own_request && data &&
 	    wpas_beacon_rep_scan_process(wpa_s, scan_res, &data->scan_info) > 0)
 		goto scan_work_done;
+#endif /* CONFIG_RRM */
 
 	if ((wpa_s->conf->ap_scan == 2 && !wpas_wps_searching(wpa_s)))
 		goto scan_work_done;
@@ -3321,10 +3325,12 @@  no_pfs:
 			     data->assoc_info.resp_ies_len);
 #endif /* CONFIG_IEEE80211R */
 
+#ifdef CONFIG_ROBUST_AV
 	if (bssid_known)
 		wpas_handle_assoc_resp_mscs(wpa_s, bssid,
 					    data->assoc_info.resp_ies,
 					    data->assoc_info.resp_ies_len);
+#endif /* CONFIG_ROBUST_AV */
 
 	/* WPA/RSN IE from Beacon/ProbeResp */
 	p = data->assoc_info.beacon_ies;
@@ -3379,8 +3385,10 @@  no_pfs:
 
 	wpa_s->assoc_freq = data->assoc_info.freq;
 
+#ifdef CONFIG_ROBUST_AV
 	wpas_handle_assoc_resp_qos_mgmt(wpa_s, data->assoc_info.resp_ies,
 					data->assoc_info.resp_ies_len);
+#endif /* CONFIG_ROBUST_AV */
 
 	return 0;
 }
@@ -3862,6 +3870,7 @@  static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
 
 	wpas_wps_notify_assoc(wpa_s, bssid);
 
+#ifdef CONFIG_WMM_AC
 	if (data) {
 		wmm_ac_notify_assoc(wpa_s, data->assoc_info.resp_ies,
 				    data->assoc_info.resp_ies_len,
@@ -3870,6 +3879,7 @@  static void wpa_supplicant_event_assoc(struct wpa_supplicant *wpa_s,
 		if (wpa_s->reassoc_same_bss)
 			wmm_ac_restore_tspecs(wpa_s);
 	}
+#endif /* CONFIG_WMM_AC */
 
 #if defined(CONFIG_FILS) || defined(CONFIG_MBO)
 	bss = wpa_bss_get_bssid(wpa_s, bssid);
@@ -4722,10 +4732,12 @@  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
 		" Category=%u DataLen=%d freq=%d MHz",
 		MAC2STR(mgmt->sa), category, (int) plen, freq);
 
+#ifdef CONFIG_WMM_AC
 	if (category == WLAN_ACTION_WMM) {
 		wmm_ac_rx_action(wpa_s, mgmt->da, mgmt->sa, payload, plen);
 		return;
 	}
+#endif /* CONFIG_WMM_AC */
 
 #ifdef CONFIG_IEEE80211R
 	if (category == WLAN_ACTION_FT) {
@@ -4797,6 +4809,7 @@  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
 	}
 #endif /* CONFIG_INTERWORKING */
 
+#ifdef CONFIG_RRM
 	if (category == WLAN_ACTION_RADIO_MEASUREMENT &&
 	    payload[0] == WLAN_RRM_RADIO_MEASUREMENT_REQUEST) {
 		wpas_rrm_handle_radio_measurement_request(wpa_s, mgmt->sa,
@@ -4819,6 +4832,7 @@  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
 							 rssi);
 		return;
 	}
+#endif /* CONFIG_RRM */
 
 #ifdef CONFIG_FST
 	if (mgmt->u.action.category == WLAN_ACTION_FST && wpa_s->fst) {
@@ -4838,7 +4852,7 @@  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
 		return;
 	}
 #endif /* CONFIG_DPP */
-
+#ifdef CONFIG_ROBUST_AV
 	if (category == WLAN_ACTION_ROBUST_AV_STREAMING &&
 	    payload[0] == ROBUST_AV_SCS_RESP) {
 		wpas_handle_robust_av_scs_recv_action(wpa_s, mgmt->sa,
@@ -4859,7 +4873,7 @@  static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
 						 payload + 4, plen - 4);
 		return;
 	}
-
+#endif /* CONFIG_ROBUST_AV */
 	wpas_p2p_rx_action(wpa_s, mgmt->da, mgmt->sa, mgmt->bssid,
 			   category, payload, plen, freq);
 	if (wpa_s->ifmsh)
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index c3984a40c..5e0347221 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -258,9 +258,10 @@  static void wpas_trigger_scan_cb(struct wpa_radio_work *work, int deinit)
 			/* Clear the scan_res_handler */
 			wpa_s->scan_res_handler = NULL;
 		}
-
+#ifdef CONFIG_RRM
 		if (wpa_s->beacon_rep_data.token)
 			wpas_rrm_refuse_request(wpa_s);
+#endif /* CONFIG_RRM */
 
 		return;
 	}
diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c
index bb04652f5..ead939037 100644
--- a/wpa_supplicant/sme.c
+++ b/wpa_supplicant/sme.c
@@ -909,11 +909,12 @@  static void sme_send_authentication(struct wpa_supplicant *wpa_s,
 
 	sme_auth_handle_rrm(wpa_s, bss);
 
+#ifdef CONFIG_RRM
 	wpa_s->sme.assoc_req_ie_len += wpas_supp_op_class_ie(
 		wpa_s, ssid, bss,
 		wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len,
 		sizeof(wpa_s->sme.assoc_req_ie) - wpa_s->sme.assoc_req_ie_len);
-
+#endif /* CONFIG_RRM */
 	if (params.p2p)
 		wpa_drv_get_ext_capa(wpa_s, WPA_IF_P2P_CLIENT);
 	else
@@ -2387,7 +2388,7 @@  void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode,
 	}
 pfs_fail:
 #endif /* CONFIG_DPP2 */
-
+#ifdef CONFIG_RRM
 	wpa_s->mscs_setup_done = false;
 	if (wpa_bss_ext_capab(wpa_s->current_bss, WLAN_EXT_CAPAB_MSCS) &&
 	    wpa_s->robust_av.valid_config) {
@@ -2421,7 +2422,7 @@  pfs_fail:
 		wpabuf_free(mscs_ie);
 	}
 mscs_fail:
-
+#endif /* CONFIG_RRM */
 	if (ssid && ssid->multi_ap_backhaul_sta) {
 		size_t multi_ap_ie_len;
 
diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c
index effc7b3bc..4d557275b 100644
--- a/wpa_supplicant/wpa_cli.c
+++ b/wpa_supplicant/wpa_cli.c
@@ -2830,7 +2830,7 @@  static int wpa_cli_cmd_tdls_link_status(struct wpa_ctrl *ctrl, int argc,
 	return wpa_cli_cmd(ctrl, "TDLS_LINK_STATUS", 1, argc, argv);
 }
 
-
+#ifdef CONFIG_WMM_AC
 static int wpa_cli_cmd_wmm_ac_addts(struct wpa_ctrl *ctrl, int argc,
 				    char *argv[])
 {
@@ -2850,6 +2850,7 @@  static int wpa_cli_cmd_wmm_ac_status(struct wpa_ctrl *ctrl, int argc,
 {
 	return wpa_ctrl_command(ctrl, "WMM_AC_STATUS");
 }
+#endif /* CONFIG_WMM_AC */
 
 
 static int wpa_cli_cmd_tdls_chan_switch(struct wpa_ctrl *ctrl, int argc,
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 69f228919..a8bb5637e 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -582,7 +582,9 @@  static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
 	wpa_tdls_deinit(wpa_s->wpa);
 #endif /* CONFIG_TDLS */
 
+#ifdef CONFIG_WMM_AC
 	wmm_ac_clear_saved_tspecs(wpa_s);
+#endif /* CONFIG_WMM_AC */
 	pmksa_candidate_free(wpa_s->wpa);
 	ptksa_cache_deinit(wpa_s->ptksa);
 	wpa_s->ptksa = NULL;
@@ -698,9 +700,9 @@  static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
 		wpabuf_free(wpa_s->vendor_elem[i]);
 		wpa_s->vendor_elem[i] = NULL;
 	}
-
+#ifdef CONFIG_WMM_AC
 	wmm_ac_notify_disassoc(wpa_s);
-
+#endif /* CONFIG_WMM_AC */
 	wpa_s->sched_scan_plans_num = 0;
 	os_free(wpa_s->sched_scan_plans);
 	wpa_s->sched_scan_plans = NULL;
@@ -715,7 +717,9 @@  static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
 
 	wpabuf_free(wpa_s->lci);
 	wpa_s->lci = NULL;
+#ifdef CONFIG_RRM
 	wpas_clear_beacon_rep_data(wpa_s);
+#endif /* CONFIG_RRM */
 
 #ifdef CONFIG_PMKSA_CACHE_EXTERNAL
 #ifdef CONFIG_MESH
@@ -747,8 +751,10 @@  static void wpa_supplicant_cleanup(struct wpa_supplicant *wpa_s)
 #ifdef CONFIG_PASN
 	wpas_pasn_auth_stop(wpa_s);
 #endif /* CONFIG_PASN */
+#ifdef CONFIG_ROBUST_AV
 	wpas_scs_deinit(wpa_s);
 	wpas_dscp_deinit(wpa_s);
+#endif /* CONFIG_ROBUST_AV */
 }
 
 
@@ -1058,9 +1064,10 @@  void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
 	if (state == WPA_DISCONNECTED || state == WPA_INACTIVE)
 		wpa_supplicant_start_autoscan(wpa_s);
 
+#ifdef CONFIG_WMM_AC
 	if (old_state >= WPA_ASSOCIATED && wpa_s->wpa_state < WPA_ASSOCIATED)
 		wmm_ac_notify_disassoc(wpa_s);
-
+#endif /* CONFIG_WMM_AC */
 	if (wpa_s->wpa_state != old_state) {
 		wpas_notify_state_changed(wpa_s, wpa_s->wpa_state, old_state);
 
@@ -2448,7 +2455,9 @@  void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
 
 	wpa_s->eapol_failed = 0;
 	wpa_s->multi_ap_ie = 0;
+#ifdef CONFIG_WMM_AC
 	wmm_ac_clear_saved_tspecs(wpa_s);
+#endif /* CONFIG_WMM_AC */
 	wpa_s->reassoc_same_bss = 0;
 	wpa_s->reassoc_same_ess = 0;
 #ifdef CONFIG_TESTING_OPTIONS
@@ -2459,7 +2468,9 @@  void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
 		wpa_dbg(wpa_s, MSG_DEBUG, "Re-association to the same ESS");
 		wpa_s->reassoc_same_ess = 1;
 		if (wpa_s->current_bss && wpa_s->current_bss == bss) {
+#ifdef CONFIG_WMM_AC
 			wmm_ac_save_tspecs(wpa_s);
+#endif /* CONFIG_WMM_AC */
 			wpa_s->reassoc_same_bss = 1;
 		} else if (wpa_s->current_bss && wpa_s->current_bss != bss) {
 			os_get_reltime(&wpa_s->roam_start);
@@ -3206,8 +3217,10 @@  static int wpas_populate_wfa_capa(struct wpa_supplicant *wpa_s,
 	size_t wfa_ie_len, buf_len;
 
 	os_memset(wfa_capa, 0, sizeof(wfa_capa));
+#ifdef CONFIG_ROBUST_AV
 	if (wpa_s->enable_dscp_policy_capa)
 		wfa_capa[0] |= WFA_CAPA_QM_DSCP_POLICY;
+#endif /* CONFIG_ROBUST_AV */
 
 	if (wpa_is_non_eht_scs_traffic_desc_supported(bss))
 		wfa_capa[0] |= WFA_CAPA_QM_NON_EHT_SCS_TRAFFIC_DESC;
@@ -3471,13 +3484,14 @@  static u8 * wpas_populate_assoc_ies(
 	os_memset(wpa_s->p2p_ip_addr_info, 0, sizeof(wpa_s->p2p_ip_addr_info));
 #endif /* CONFIG_P2P */
 
+#ifdef CONFIG_RRM
 	if (bss) {
 		wpa_ie_len += wpas_supp_op_class_ie(wpa_s, ssid, bss,
 						    wpa_ie + wpa_ie_len,
 						    max_wpa_ie_len -
 						    wpa_ie_len);
 	}
-
+#endif /* CONFIG_RRM */
 	/*
 	 * Workaround: Add Extended Capabilities element only if the AP
 	 * included this element in Beacon/Probe Response frames. Some older
@@ -3703,6 +3717,7 @@  pfs_fail:
 	if (wpa_s->disable_mscs_support)
 		goto mscs_end;
 #endif /* CONFIG_TESTING_OPTIONS */
+#ifdef CONFIG_RRM
 	if (wpa_bss_ext_capab(bss, WLAN_EXT_CAPAB_MSCS) &&
 	    wpa_s->robust_av.valid_config) {
 		struct wpabuf *mscs_ie;
@@ -3733,7 +3748,7 @@  pfs_fail:
 		wpabuf_free(mscs_ie);
 	}
 mscs_end:
-
+#endif /* CONFIG_RRM */
 	wpa_ie_len = wpas_populate_wfa_capa(wpa_s, bss, wpa_ie, wpa_ie_len,
 					    max_wpa_ie_len);
 
@@ -4017,7 +4032,9 @@  static void wpas_start_assoc_cb(struct wpa_radio_work *work, int deinit)
 	wpa_sm_set_assoc_wpa_ie(wpa_s->wpa, NULL, 0);
 	wpa_sm_set_assoc_rsnxe(wpa_s->wpa, NULL, 0);
 	wpa_s->rsnxe_len = 0;
+#ifdef CONFIG_ROBUST_AV
 	wpa_s->mscs_setup_done = false;
+#endif /* CONFIG_ROBUST_AV */
 
 	wpa_ie = wpas_populate_assoc_ies(wpa_s, bss, ssid, &params, NULL);
 	if (!wpa_ie) {
@@ -4465,8 +4482,10 @@  static void wpa_supplicant_clear_connection(struct wpa_supplicant *wpa_s,
 	if (old_ssid != wpa_s->current_ssid)
 		wpas_notify_network_changed(wpa_s);
 
+#ifdef CONFIG_ROBUST_AV
 	wpas_scs_deinit(wpa_s);
 	wpas_dscp_deinit(wpa_s);
+#endif /* CONFIG_ROBUST_AV */
 	eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
 }
 
@@ -5767,7 +5786,9 @@  wpa_supplicant_alloc(struct wpa_supplicant *parent)
 #ifdef CONFIG_TESTING_OPTIONS
 	dl_list_init(&wpa_s->drv_signal_override);
 #endif /* CONFIG_TESTING_OPTIONS */
+#ifdef CONFIG_ROBUST_AV
 	dl_list_init(&wpa_s->active_scs_ids);
+#endif /* CONFIG_ROBUST_AV */
 
 	return wpa_s;
 }
@@ -7142,7 +7163,9 @@  static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 		wpa_s->extended_capa_len = capa.extended_capa_len;
 		wpa_s->num_multichan_concurrent =
 			capa.num_multichan_concurrent;
+#ifdef CONFIG_WMM_AC
 		wpa_s->wmm_ac_supported = capa.wmm_ac_supported;
+#endif /* CONFIG_WMM_AC */
 		wpa_s->max_num_akms = capa.max_num_akms;
 
 		if (capa.mac_addr_rand_scan_supported)
@@ -7296,7 +7319,9 @@  static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
 	if (wpas_init_ext_pw(wpa_s) < 0)
 		return -1;
 
+#ifdef CONFIG_RRM
 	wpas_rrm_reset(wpa_s);
+#endif /* CONFIG_RRM */
 
 	wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
 
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index c44413e4e..b7cd0c2fb 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -1536,34 +1536,40 @@  struct wpa_supplicant {
 	unsigned int multi_ap_ie:1;
 	unsigned int multi_ap_backhaul:1;
 	unsigned int multi_ap_fronthaul:1;
+#ifdef CONFIG_RRM
 	struct robust_av_data robust_av;
 	bool mscs_setup_done;
+	struct scs_robust_av_data scs_robust_av_req;
+	u8 scs_dialog_token;
+	struct dl_list active_scs_ids;
+	bool ongoing_scs_req;
+	u8 dscp_req_dialog_token;
+	u8 dscp_query_dialog_token;
+	unsigned int enable_dscp_policy_capa:1;
+	unsigned int connection_dscp:1;
+	unsigned int wait_for_dscp_req:1;
+#endif /* CONFIG_RRM */
 
 	bool wps_scan_done; /* Set upon receiving scan results event */
 	bool supp_pbc_active; /* Set for interface when PBC is triggered */
 	bool wps_overlap;
-
 #ifdef CONFIG_PASN
 	struct pasn_data pasn;
 	struct wpa_radio_work *pasn_auth_work;
 	unsigned int pasn_count;
 	struct pasn_auth *pasn_params;
 #endif /* CONFIG_PASN */
-	struct scs_robust_av_data scs_robust_av_req;
-	u8 scs_dialog_token;
+
+	struct wpa_signal_info last_signal_info;
+
+#ifdef CONFIG_PASN
+	struct wpas_pasn pasn;
+	struct wpa_radio_work *pasn_auth_work;
+#endif /* CONFIG_PASN */
 #ifdef CONFIG_TESTING_OPTIONS
 	unsigned int disable_scs_support:1;
 	unsigned int disable_mscs_support:1;
 #endif /* CONFIG_TESTING_OPTIONS */
-	struct dl_list active_scs_ids;
-	bool ongoing_scs_req;
-	u8 dscp_req_dialog_token;
-	u8 dscp_query_dialog_token;
-	unsigned int enable_dscp_policy_capa:1;
-	unsigned int connection_dscp:1;
-	unsigned int wait_for_dscp_req:1;
-
-	struct wpa_signal_info last_signal_info;
 };
 
 
@@ -1700,7 +1706,7 @@  int wpas_twt_send_setup(struct wpa_supplicant *wpa_s, u8 dtok, int exponent,
 			bool flow_type, u8 flow_id, bool protection,
 			u8 twt_channel, u8 control);
 int wpas_twt_send_teardown(struct wpa_supplicant *wpa_s, u8 flags);
-
+#ifdef CONFIG_RRM
 void wpas_rrm_reset(struct wpa_supplicant *wpa_s);
 void wpas_rrm_process_neighbor_rep(struct wpa_supplicant *wpa_s,
 				   const u8 *report, size_t report_len);
@@ -1718,6 +1724,7 @@  void wpas_rrm_handle_link_measurement_request(struct wpa_supplicant *wpa_s,
 					      const u8 *frame, size_t len,
 					      int rssi);
 void wpas_rrm_refuse_request(struct wpa_supplicant *wpa_s);
+#endif /* CONFIG_RRM */
 int wpas_beacon_rep_scan_process(struct wpa_supplicant *wpa_s,
 				 struct wpa_scan_results *scan_res,
 				 struct scan_info *info);