[PATCH 39/42] tests: Add some MLD association tests
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Mon Nov 20 15:51:53 PST 2023
From: Benjamin Berg <benjamin.berg at intel.com>
Test ML association, automatic link discovery using ML probe requests
and marking BSSs as failed after an ML assoication failure, if the
corresponding link also rejected the association.
Signed-off-by: Benjamin Berg <benjamin.berg at intel.com>
---
tests/hwsim/test_eht.py | 112 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 112 insertions(+)
diff --git a/tests/hwsim/test_eht.py b/tests/hwsim/test_eht.py
index 7fb737e75e..75935a42cd 100644
--- a/tests/hwsim/test_eht.py
+++ b/tests/hwsim/test_eht.py
@@ -10,6 +10,7 @@ from hwsim import HWSimRadio
import hwsim_utils
from wpasupplicant import WpaSupplicant
import re
+from tshark import run_tshark
def eht_verify_wifi_version(dev):
status = dev.get_status()
@@ -672,3 +673,114 @@ def test_eht_ml_probe_req(dev, apdev):
"CTRL-EVENT-SCAN-FAILED"], timeout=10)
if ev is None:
raise Exception("ML_PROBE_REQ did not result in scan results")
+
+def test_eht_mld_connect_probes(dev, apdev, params):
+ """MLD client sends ML probe to connect to not discovered links"""
+
+ with HWSimRadio(use_mlo=True) as (hapd_radio, hapd_iface), \
+ HWSimRadio(use_mlo=True) as (wpas_radio, wpas_iface):
+
+ wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
+ wpas.interface_add(wpas_iface)
+
+ ssid = "mld_ap"
+ passphrase = 'qwertyuiop'
+ link_params = eht_mld_ap_wpa2_params(ssid, passphrase, mfp="2", key_mgmt="SAE", pwe='2')
+ link_params['channel'] = '1'
+ link_params['bssid'] = '00:11:22:33:44:01'
+ hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
+
+ link_params['channel'] = '6'
+ link_params['bssid'] = '00:11:22:33:44:02'
+ hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
+
+ wpas.set("sae_pwe", "1")
+ wpas.connect(ssid, sae_password= passphrase, ieee80211w="2",
+ key_mgmt="SAE", scan_freq="2412")
+
+ out = run_tshark(os.path.join(params['logdir'], 'hwsim0.pcapng'),
+ 'wlan.fc.type_subtype == 0x0004 && wlan.ext_tag.number == 107 && wlan.ext_tag.data == 11:00:02:00:00:02:11:00',
+ display=['frame.number'])
+ if not out.splitlines():
+ raise Exception('ML probe request not found')
+
+ # probe response has the ML element, which will be fragmented
+ out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
+ "wlan.fc.type_subtype == 0x0005 && wlan.ext_tag.number == 107 && wlan.ext_tag.length == 254",
+ display=['frame.number'])
+ if not out.splitlines():
+ raise Exception('ML probe response not found')
+
+ eht_verify_status(wpas, hapd0, 2412, 20, is_ht=True, mld=True, valid_links=3, active_links=3)
+ traffic_test(wpas, hapd0)
+ traffic_test(wpas, hapd1)
+
+
+def test_eht_tx_link_rejected_connect_other(dev, apdev, params):
+ """EHT MLD AP with MLD client being rejected on TX link, but then connecting on second link"""
+
+ with HWSimRadio(use_mlo=True) as (hapd_radio, hapd_iface), \
+ HWSimRadio(use_mlo=True) as (wpas_radio, wpas_iface):
+
+ wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
+ wpas.interface_add(wpas_iface)
+
+ ssid = "mld_ap"
+ passphrase = 'qwertyuiop'
+ link_params = eht_mld_ap_wpa2_params(ssid, passphrase, mfp="2", key_mgmt="SAE", pwe='2')
+ link_params['channel'] = '1'
+ link_params['bssid'] = '00:11:22:33:44:01'
+ hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
+
+ link_params['channel'] = '6'
+ link_params['bssid'] = '00:11:22:33:44:02'
+ hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
+
+ wpas.set("sae_pwe", "1")
+ with fail_test(hapd0, 1, "hostapd_get_aid"):
+ wpas.connect(ssid, sae_password=passphrase, ieee80211w="2",
+ key_mgmt="SAE", scan_freq="2412")
+
+ eht_verify_status(wpas, hapd1, 2437, 20, is_ht=True, mld=True, valid_links=2, active_links=2)
+ traffic_test(wpas, hapd0)
+ traffic_test(wpas, hapd1)
+
+
+def test_eht_all_links_rejected(dev, apdev, params):
+ """EHT MLD AP with MLD client ignores all rejected links"""
+
+ with HWSimRadio(use_mlo=True) as (hapd_radio, hapd_iface), \
+ HWSimRadio(use_mlo=True) as (wpas_radio, wpas_iface):
+
+ wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
+ wpas.interface_add(wpas_iface)
+
+ ssid = "mld_ap"
+ passphrase = 'qwertyuiop'
+ link_params = eht_mld_ap_wpa2_params(ssid, passphrase, mfp="2", key_mgmt="SAE", pwe='2')
+ link_params['channel'] = '1'
+ link_params['bssid'] = '00:11:22:33:44:01'
+ hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
+
+ link_params['channel'] = '6'
+ link_params['bssid'] = '00:11:22:33:44:02'
+ hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
+ wpas.set("mld_connect_bssid_pref", "00:11:22:33:44:01")
+ wpas.set("sae_pwe", "1")
+
+ with fail_test(hapd0, 1, "hostapd_get_aid", 1, "hostapd_process_assoc_ml_info"):
+ wpas.connect(ssid, sae_password=passphrase, ieee80211w="2",
+ key_mgmt="SAE", scan_freq="2412", wait_connect=False)
+ ev = wpas.wait_event(['CTRL-EVENT-ASSOC-REJECT'])
+ if not ev:
+ raise Exception('Rejection not found')
+
+ ev1 = wpas.wait_event(['Added BSSID'])
+ ev2 = wpas.wait_event(['Added BSSID'])
+ if (not ev1 or not ev2) or \
+ not ((hapd0.own_addr() in ev1 and hapd1.own_addr() in ev2) or
+ (hapd1.own_addr() in ev1 and hapd0.own_addr() in ev2)):
+ raise Exception('Not all BSSs were added to the ignore list')
+
+ # After this message, a new scan clears the ignore and the STA connects
+ wpas.wait_connected(timeout=15)
--
2.38.1
More information about the Hostap
mailing list