diff mbox series

[v2] tests: Add a unit test for RNR/basic ML element parsing

Message ID 20231128015007.3399996-1-andrei.otcheretianski@intel.com
State Accepted
Headers show
Series [v2] tests: Add a unit test for RNR/basic ML element parsing | expand

Commit Message

Andrei Otcheretianski Nov. 28, 2023, 1:50 a.m. UTC
Going through everything to test parsing of the basic ML element and the
RNR element is not really feasible for MBSSID mode. As such, add a unit
test to excercise parsing the available links from the RNR, basic ML
element and MBSSID-Index element if present.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
---
 tests/Makefile   | 61 +++++++++++++++++++++++++++++-
 tests/test-bss.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 156 insertions(+), 1 deletion(-)
 create mode 100644 tests/test-bss.c

Comments

Jouni Malinen Dec. 2, 2023, 6:58 p.m. UTC | #1
On Tue, Nov 28, 2023 at 03:50:07AM +0200, Andrei Otcheretianski wrote:
> Going through everything to test parsing of the basic ML element and the
> RNR element is not really feasible for MBSSID mode. As such, add a unit
> test to excercise parsing the available links from the RNR, basic ML
> element and MBSSID-Index element if present.

Thanks, applied.
diff mbox series

Patch

diff --git a/tests/Makefile b/tests/Makefile
index 2d2343b640..8ec154bb3e 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -2,7 +2,8 @@  ALL=test-base64 test-md4 test-milenage \
 	test-rsa-sig-ver \
 	test-sha1 \
 	test-https test-https_server \
-	test-sha256 test-aes test-x509v3 test-list test-rc4
+	test-sha256 test-aes test-x509v3 test-list test-rc4 \
+	test-bss
 
 include ../src/build.rules
 
@@ -82,6 +83,63 @@  test-x509v3: $(call BUILDOBJ,test-x509v3.o) $(LIBS)
 	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS)
 
 
+# We could cut this down more by enabling fewer options (above)
+ELIBS += $(SRC)/crypto/libcrypto.a
+ELIBS += $(SRC)/tls/libtls.a
+
+WPAS_SRC=../wpa_supplicant
+SRC=../src
+WPA_LIBS = $(SRC)/common/libcommon.a
+
+CFLAGS += -I$(SRC) -I$(SRC)/utils -I$(WPAS_SRC)
+
+CFLAGS += -DCONFIG_DRIVER_NONE
+CFLAGS += -DIEEE8021X_EAPOL
+
+WPA_OBJS = $(WPAS_SRC)/bssid_ignore.o
+WPA_OBJS += $(WPAS_SRC)/bss.o
+WPA_OBJS += $(WPAS_SRC)/config.o
+WPA_OBJS += $(WPAS_SRC)/config_file.o
+WPA_OBJS += $(WPAS_SRC)/eap_register.o
+WPA_OBJS += $(WPAS_SRC)/events.o
+WPA_OBJS += $(WPAS_SRC)/notify.o
+WPA_OBJS += $(WPAS_SRC)/offchannel.o
+WPA_OBJS += $(WPAS_SRC)/op_classes.o
+WPA_OBJS += $(WPAS_SRC)/robust_av.o
+WPA_OBJS += $(WPAS_SRC)/rrm.o
+WPA_OBJS += $(WPAS_SRC)/scan.o
+WPA_OBJS += $(WPAS_SRC)/wmm_ac.o
+WPA_OBJS += $(WPAS_SRC)/wpa_supplicant.o
+WPA_OBJS += $(WPAS_SRC)/wpas_glue.o
+WPA_OBJS += $(SRC)/rsn_supp/wpa.o
+WPA_OBJS += $(SRC)/rsn_supp/wpa_ft.o
+WPA_OBJS += $(SRC)/rsn_supp/wpa_ie.o
+WPA_OBJS += $(SRC)/rsn_supp/tdls.o
+WPA_OBJS += $(SRC)/rsn_supp/preauth.o
+WPA_OBJS += $(SRC)/rsn_supp/pmksa_cache.o
+WPA_OBJS += $(SRC)/eapol_supp/eapol_supp_sm.o
+WPA_OBJS += $(SRC)/eap_common/eap_common.o
+WPA_OBJS += $(SRC)/eap_peer/eap.o
+WPA_OBJS += $(SRC)/eap_peer/eap_methods.o
+WPA_OBJS += $(SRC)/drivers/driver_common.o
+WPA_OBJS += $(SRC)/drivers/driver_none.o
+WPA_OBJS += $(SRC)/drivers/drivers.o
+WPA_OBJS += $(SRC)/l2_packet/l2_packet_none.o
+
+_OBJS_VAR := WPA_OBJS
+include ../src/objs.mk
+
+_OBJS_VAR := WPA_LIBS
+include ../src/objs.mk
+
+_OBJS_VAR := ELIBS
+include ../src/objs.mk
+
+LIBS=$(SLIBS) $(DLIBS) $(WPA_LIBS) $(ELIBS)
+
+test-bss: $(call BUILDOBJ,test-bss.o) $(WPA_OBJS) $(LIBS)
+	$(LDO) $(LDFLAGS) -o $@ $< $(LLIBS) $(WPA_CFLAGS) $(WPA_OBJS) $(LIBS)
+
 run-tests: $(ALL)
 	./test-aes
 	./test-list
@@ -90,6 +148,7 @@  run-tests: $(ALL)
 	./test-rsa-sig-ver
 	./test-sha1
 	./test-sha256
+	./test-bss
 	@echo
 	@echo All tests completed successfully.
 
diff --git a/tests/test-bss.c b/tests/test-bss.c
new file mode 100644
index 0000000000..3e0900140c
--- /dev/null
+++ b/tests/test-bss.c
@@ -0,0 +1,96 @@ 
+/*
+ * WPA BSS parsing - test program
+ * Copyright (C) 2023 Intel Corporation
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include <assert.h>
+
+#include "utils/includes.h"
+
+#include "utils/common.h"
+#include "wpa_supplicant_i.h"
+#include "bss.h"
+
+#define ASSERT_CMP_INT(a, cmp, b) { \
+	ssize_t __a = (a); ssize_t __b = (b);		\
+		if (!(__a cmp __b)) {			\
+			wpa_printf(MSG_ERROR, "Assertion failed: %ld %s %ld", \
+				   __a, #cmp, __b);	\
+			abort();			\
+		}					\
+	}
+
+void test_parse_basic_ml(struct wpa_supplicant *wpa_s, u8 mld_id)
+{
+	const u8 mld_ie[] = {
+		/* RNR */
+		WLAN_EID_REDUCED_NEIGHBOR_REPORT, 40,
+		0x00, 0x10, 0x51, 0x01, 0xff, 0x00, 0x11, 0x22,
+		0x33, 0x44, 0x01, 0x68, 0x05, 0x2d, 0xa6, 0x42,
+		0xfe, mld_id, 0x10, 0x00, 0x00, 0x10, 0x51, 0x06,
+		0xff, 0x00, 0x11, 0x22, 0x33, 0x44, 0x02, 0x68,
+		0x05, 0x2d, 0xa6, 0x42, 0xfe, mld_id, 0x11, 0x00,
+		/* basic ML */
+		WLAN_EID_EXTENSION, 1 + 15, WLAN_EID_EXT_MULTI_LINK,
+		0xb0, 0x01, 0x0d, 0x02, 0x00, 0x00, 0x00, 0x07,
+		0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+	};
+	const u8 mbssid_idx_ie[] = {
+		WLAN_EID_MULTIPLE_BSSID_INDEX, 1, mld_id,
+	};
+	struct {
+		struct wpa_bss bss;
+		u8 ies[sizeof(mld_ie) + sizeof(mbssid_idx_ie)];
+	} bss;
+	u8 ap_mld_addr[ETH_ALEN];
+	u16 missing_links;
+	u8 ret;
+	u8 ap_mld_id;
+
+	memcpy(bss.bss.ies, mld_ie, sizeof(mld_ie));
+	bss.bss.ie_len = sizeof(mld_ie);
+
+	if (mld_id > 0) {
+		memcpy(bss.bss.ies + sizeof(mld_ie), mbssid_idx_ie,
+		       sizeof(mbssid_idx_ie));
+		bss.bss.ie_len += sizeof(mbssid_idx_ie);
+	}
+
+	ret = wpa_bss_parse_basic_ml_element(wpa_s, &bss.bss, ap_mld_addr,
+					     &missing_links, NULL, &ap_mld_id);
+
+	ASSERT_CMP_INT(ret, ==, 0);
+	ASSERT_CMP_INT(bss.bss.n_mld_links, ==, 1);
+	ASSERT_CMP_INT(missing_links, ==, 0x0002);
+	ASSERT_CMP_INT(ap_mld_id, ==, mld_id);
+}
+
+#define RUN_TEST(func, ...) do {			\
+		func(wpa_s, __VA_ARGS__);		\
+		printf("\nok " #func " " #__VA_ARGS__ "\n\n");		\
+	} while (false)
+
+int main(void)
+{
+	struct wpa_interface iface = {
+		.ifname = "dummy",
+	};
+	struct wpa_global *global;
+	struct wpa_params params = {
+		.wpa_debug_level = MSG_DEBUG,
+	};
+	struct wpa_supplicant *wpa_s;
+
+	global = wpa_supplicant_init(&params);
+
+	wpa_s = wpa_supplicant_add_iface(global, &iface, NULL);
+	assert(wpa_s);
+
+	RUN_TEST(test_parse_basic_ml, 0);
+	RUN_TEST(test_parse_basic_ml, 1);
+
+	return 0;
+}