[PATCH v4 5/6] tests: MLO: use link ID to access control sockets

Aditya Kumar Singh quic_adisi at quicinc.com
Mon Aug 12 21:41:38 PDT 2024


With MLO, each BSS will create sockets under the given ctrl_iface
directory with the socket name being '<ifname>_link<link_ID>'.

Make necessary changes in MLO related test cases so that it can access
the new socket and proceed further as expected.

Signed-off-by: Aditya Kumar Singh <quic_adisi at quicinc.com>
---
 tests/hwsim/hostapd.py           | 27 +++++++---
 tests/hwsim/test_eht.py          | 92 +++++++++++++++++++++++++++-----
 tests/hwsim/test_rsn_override.py |  2 +
 3 files changed, 101 insertions(+), 20 deletions(-)

diff --git a/tests/hwsim/hostapd.py b/tests/hwsim/hostapd.py
index 73819941b53a..8ed80588b2ee 100644
--- a/tests/hwsim/hostapd.py
+++ b/tests/hwsim/hostapd.py
@@ -165,15 +165,21 @@ class HostapdGlobal:
 
 class Hostapd:
     def __init__(self, ifname, bssidx=0, hostname=None, ctrl=hapd_ctrl,
-                 port=8877, remote_cli=False):
+                 port=8877, remote_cli=False, link=None):
         self.hostname = hostname
         self.host = remotehost.Host(hostname, ifname)
         self.ifname = ifname
         self.remote_cli = remote_cli
         if hostname is None:
-            self.ctrl = wpaspy.Ctrl(os.path.join(ctrl, ifname))
-            self.mon = wpaspy.Ctrl(os.path.join(ctrl, ifname))
-            self.dbg = ifname
+            if link is None:
+                self.ctrl = wpaspy.Ctrl(os.path.join(ctrl, ifname))
+                self.mon = wpaspy.Ctrl(os.path.join(ctrl, ifname))
+                self.dbg = ifname
+            else:
+                ifname = ifname + "_link" + link
+                self.ctrl = wpaspy.Ctrl(os.path.join(ctrl, ifname))
+                self.mon = wpaspy.Ctrl(os.path.join(ctrl, ifname))
+                self.dbg = ifname
         else:
             if remote_cli:
                 self.ctrl = RemoteCtrl(ctrl, port, hostname=hostname,
@@ -784,6 +790,13 @@ def add_mld_link(apdev, params):
         hostname = None
         port = 8878
 
+    if "link_id" not in params:
+        raise Exception("Link ID not passed in param")
+
+    link_id = params["link_id"]
+    # Delete the 'link_id' key from params or else it will be added in config
+    del params["link_id"]
+
     hapd_global = HostapdGlobal(apdev)
     confname, ctrl_iface = cfg_mld_link_file(ifname, params)
     hapd_global.send_file(confname, confname)
@@ -793,7 +806,8 @@ def add_mld_link(apdev, params):
         if str(e) == "Could not add hostapd link":
             raise utils.HwsimSkip("No MLO support in hostapd")
     port = hapd_global.get_ctrl_iface_port(ifname)
-    hapd = Hostapd(ifname, hostname=hostname, ctrl=ctrl_iface, port=port)
+    hapd = Hostapd(ifname, hostname=hostname, ctrl=ctrl_iface, port=port,
+                   link=link_id)
     if not hapd.ping():
         raise Exception("Could not ping hostapd")
     return hapd
@@ -1067,9 +1081,6 @@ def cfg_mld_link_file(ifname, params):
     fd, fname = tempfile.mkstemp(dir='/tmp', prefix=conf + '-')
     f = os.fdopen(fd, 'w')
 
-    if idx != 0:
-        ctrl_iface="/var/run/hostapd_%d" % idx
-
     f.write("ctrl_interface=%s\n" % ctrl_iface)
     f.write("driver=nl80211\n")
     f.write("ieee80211n=1\n")
diff --git a/tests/hwsim/test_eht.py b/tests/hwsim/test_eht.py
index bde2b0e08148..3defa4e58d66 100644
--- a/tests/hwsim/test_eht.py
+++ b/tests/hwsim/test_eht.py
@@ -305,10 +305,12 @@ def test_eht_mld_discovery(dev, apdev):
         ssid = "mld_ap"
         link0_params = {"ssid": ssid,
                         "hw_mode": "g",
-                        "channel": "1"}
+                        "channel": "1",
+                        "link_id": "0"}
         link1_params = {"ssid": ssid,
                         "hw_mode": "g",
-                        "channel": "2"}
+                        "channel": "2",
+                        "link_id": "1"}
 
         hapd0 = eht_mld_enable_ap(hapd_iface, link0_params)
         hapd1 = eht_mld_enable_ap(hapd_iface, link1_params)
@@ -390,12 +392,14 @@ def _eht_mld_owe_two_links(dev, apdev, second_link_disabled=False,
 
         ssid = "mld_ap_owe_two_link"
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
         if second_link_disabled:
             params['mld_indicate_disabled'] = '1'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
         # Check legacy client connection
@@ -448,6 +452,7 @@ def test_eht_mld_sae_single_link(dev, apdev):
         ssid = "mld_ap_sae_single_link"
         params = eht_mld_ap_wpa2_params(ssid, passphrase, key_mgmt="SAE",
                                         mfp="2", pwe='2')
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -474,10 +479,12 @@ def run_eht_mld_sae_two_links(dev, apdev, beacon_prot="1",
                                         key_mgmt="SAE", mfp="2", pwe='1',
                                         beacon_prot=beacon_prot,
                                         bridge=bridge)
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -572,6 +579,7 @@ def test_eht_mld_sae_ext_one_link(dev, apdev):
         passphrase = 'qwertyuiop'
         ssid = "mld_ap_sae_ext_single_link"
         params = eht_mld_ap_wpa2_params(ssid, passphrase, key_mgmt="SAE-EXT-KEY")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -595,10 +603,12 @@ def test_eht_mld_sae_ext_two_links(dev, apdev):
         ssid = "mld_ap_sae_two_link"
         params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                         key_mgmt="SAE-EXT-KEY")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -618,10 +628,12 @@ def test_eht_mld_sae_legacy_client(dev, apdev):
         ssid = "mld_ap_sae_two_link"
         params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                         key_mgmt="SAE", mfp="2", pwe='1')
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -658,10 +670,12 @@ def test_eht_mld_sae_transition(dev, apdev):
         params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                         key_mgmt="SAE-EXT-KEY SAE WPA-PSK WPA-PSK-SHA256",
                                         mfp="1")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -694,10 +708,12 @@ def test_eht_mld_ptk_rekey(dev, apdev):
                                         key_mgmt="SAE-EXT-KEY SAE WPA-PSK WPA-PSK-SHA256",
                                         mfp="1")
         params['wpa_ptk_rekey'] = '5'
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -734,10 +750,12 @@ def test_eht_mld_gtk_rekey(dev, apdev):
                                         key_mgmt="SAE-EXT-KEY SAE WPA-PSK WPA-PSK-SHA256",
                                         mfp="1")
         params['wpa_group_rekey'] = '5'
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -774,10 +792,12 @@ def test_eht_ml_probe_req(dev, apdev):
         ssid = "mld_ap_sae_two_link"
         params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                         key_mgmt="SAE-EXT-KEY")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
@@ -816,10 +836,14 @@ def test_eht_mld_connect_probes(dev, apdev, params):
                                              key_mgmt="SAE", pwe='2')
         link_params['channel'] = '1'
         link_params['bssid'] = '00:11:22:33:44:01'
+        link_params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
 
         link_params['channel'] = '6'
         link_params['bssid'] = '00:11:22:33:44:02'
+        link_params['link_id'] = '1'
+
         hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
 
         wpas.set("sae_pwe", "1")
@@ -861,10 +885,14 @@ def test_eht_tx_link_rejected_connect_other(dev, apdev, params):
                                              key_mgmt="SAE", pwe='2')
         link_params['channel'] = '1'
         link_params['bssid'] = '00:11:22:33:44:01'
+        link_params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
 
         link_params['channel'] = '6'
         link_params['bssid'] = '00:11:22:33:44:02'
+        link_params['link_id'] = '1'
+
         hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
 
         wpas.set("sae_pwe", "1")
@@ -891,10 +919,14 @@ def test_eht_all_links_rejected(dev, apdev, params):
                                              key_mgmt="SAE", pwe='2')
         link_params['channel'] = '1'
         link_params['bssid'] = '00:11:22:33:44:01'
+        link_params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
 
         link_params['channel'] = '6'
         link_params['bssid'] = '00:11:22:33:44:02'
+        link_params['link_id'] = '1'
+
         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")
@@ -934,10 +966,13 @@ def test_eht_connect_invalid_link(dev, apdev, params):
                                              key_mgmt="SAE", pwe='2')
         link_params['channel'] = '1'
         link_params['bssid'] = '00:11:22:33:44:01'
+        link_params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, link_params)
 
         link_params['channel'] = '6'
         link_params['bssid'] = '00:11:22:33:44:02'
+        link_params['link_id'] = '1'
         hapd1 = eht_mld_enable_ap(hapd_iface, link_params)
 
         # We scan for both APs, then try to connect to link 0, but only the
@@ -969,9 +1004,12 @@ def test_eht_mld_link_removal(dev, apdev):
 
         ssid = "mld_ap_owe_two_link"
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
 
         wpas.connect(ssid, scan_freq="2412 2437", key_mgmt="OWE",
@@ -1021,10 +1059,12 @@ def test_eht_mld_bss_trans_mgmt_link_removal_imminent(dev, apdev):
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
         params["bss_transition"] = "1"
         params["mbo"] = "1"
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
 
@@ -1073,10 +1113,12 @@ def test_eht_ap_mld_proto(dev, apdev):
 
         ssid = "mld_ap_owe_two_link"
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
 
@@ -1461,10 +1503,14 @@ def test_eht_mld_gas(dev, apdev):
         params['venue_group'] = "7"
         params['venue_type'] = "1"
         params['venue_name'] = "eng:Example venue"
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
         bssid0 = hapd0.own_addr()
 
         params['channel'] = '6'
+        params['link_id'] = '1'
+
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
         bssid1 = hapd1.own_addr()
 
@@ -1497,9 +1543,13 @@ def test_eht_mld_dpp_responder_while_assoc(dev, apdev):
 
         ssid = "owe_two_link"
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
+
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
 
         wpas.connect(ssid, scan_freq="2412 2437", key_mgmt="OWE",
@@ -1525,9 +1575,13 @@ def _eht_mld_disconnect(dev, apdev, disassoc=True):
 
         ssid = "mld_ap_owe_two_link"
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
         params['channel'] = '6'
+        params['link_id'] = '1'
+
         hapd1 = eht_mld_enable_ap(hapd0_iface, params)
 
         wpas.connect(ssid, scan_freq="2412 2437", key_mgmt="OWE",
@@ -1582,6 +1636,7 @@ def test_eht_mld_non_pref_chan(dev, apdev):
         params = eht_mld_ap_wpa2_params(ssid, key_mgmt="OWE", mfp="2")
         params["bss_transition"] = "1"
         params["mbo"] = "1"
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
@@ -1670,6 +1725,7 @@ def test_eht_mld_rrm_beacon_req(dev, apdev):
         params["bss_transition"] = "1"
         params["mbo"] = "1"
         params["rrm_beacon_report"] = "1"
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd0_iface, params)
 
@@ -1685,6 +1741,8 @@ def test_eht_mld_rrm_beacon_req(dev, apdev):
         other_ssid = "other"
         params = eht_mld_ap_wpa2_params(other_ssid, key_mgmt="OWE", mfp="2")
         params["channel"] = '6'
+        params['link_id'] = '0'
+
         hapd1 = eht_mld_enable_ap(hapd1_iface, params)
 
         # Issue a beacon request for the second AP
@@ -1724,6 +1782,8 @@ def test_eht_mld_legacy_stas(dev, apdev):
                                         mfp="2", pwe='2')
         params['rsn_pairwise'] = "CCMP GCMP-256"
         params['sae_groups'] = "19 20"
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         for i in range(3):
@@ -1763,6 +1823,8 @@ def test_eht_mld_and_mlds(dev, apdev):
                                         mfp="2", pwe='2')
         params['rsn_pairwise'] = "CCMP GCMP-256"
         params['sae_groups'] = "19 20"
+        params['link_id'] = '0'
+
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         wpas.set("sae_pwe", "1")
@@ -1828,9 +1890,13 @@ def test_eht_mlo_csa(dev, apdev):
 
             params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                             key_mgmt="SAE", mfp="2", pwe='1')
+            params['link_id'] = '0'
+
             hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
             params['channel'] = '6'
+            params['link_id'] = '1'
+
             hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
             wpas.set("sae_pwe", "1")
@@ -1928,7 +1994,7 @@ def get_config(iface, count, ssid, passphrase, channel, bssid_regex,
         params['sae_pwe'] = "2"
         params['group_mgmt_cipher'] = "AES-128-CMAC"
         params['beacon_prot'] = "1"
-        params["ctrl_interface"] = "/var/run/hostapd/chan_" + str(channel)
+        params["ctrl_interface"] = "/var/run/hostapd/"
         params["bssid"] = bssid_regex % (i + 1)
 
         if rnr:
@@ -1936,7 +2002,7 @@ def get_config(iface, count, ssid, passphrase, channel, bssid_regex,
 
         append_bss_conf_to_file(f, ifname, params, first=(i == 0))
 
-        hapds.append([ifname, params["ctrl_interface"], i])
+        hapds.append([ifname, i])
 
     f.close()
 
@@ -1981,15 +2047,15 @@ def get_mld_devs(hapd_iface, count, prefix, rnr=False):
 
     start_ap(prefix, fname1 + " " + fname2)
 
-    hapd_mld1_link0 = hostapd.Hostapd(ifname=hapds1[0][0], ctrl=hapds1[0][1],
-                                      bssidx=hapds1[0][2])
-    hapd_mld1_link1 = hostapd.Hostapd(ifname=hapds2[0][0], ctrl=hapds2[0][1],
-                                      bssidx=hapds2[0][2])
+    hapd_mld1_link0 = hostapd.Hostapd(ifname=hapds1[0][0], bssidx=hapds1[0][1],
+                                      link="0")
+    hapd_mld1_link1 = hostapd.Hostapd(ifname=hapds2[0][0], bssidx=hapds2[0][1],
+                                      link="1")
 
-    hapd_mld2_link0 = hostapd.Hostapd(ifname=hapds1[1][0], ctrl=hapds1[1][1],
-                                      bssidx=hapds1[1][2])
-    hapd_mld2_link1 = hostapd.Hostapd(ifname=hapds2[1][0], ctrl=hapds2[1][1],
-                                      bssidx=hapds2[1][2])
+    hapd_mld2_link0 = hostapd.Hostapd(ifname=hapds1[1][0], bssidx=hapds1[1][1],
+                                      link="0")
+    hapd_mld2_link1 = hostapd.Hostapd(ifname=hapds2[1][0], bssidx=hapds2[1][1],
+                                      link="1")
 
     if not hapd_mld1_link0.ping():
         raise Exception("Could not ping hostapd")
@@ -2168,11 +2234,13 @@ def test_eht_mlo_color_change(dev, apdev):
         params = eht_mld_ap_wpa2_params(ssid, passphrase,
                                         key_mgmt="SAE", mfp="2", pwe='1')
         params['he_bss_color'] = '42'
+        params['link_id'] = '0'
 
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params['channel'] = '6'
         params['he_bss_color'] = '24'
+        params['link_id'] = '1'
 
         hapd1 = eht_mld_enable_ap(hapd_iface, params)
 
diff --git a/tests/hwsim/test_rsn_override.py b/tests/hwsim/test_rsn_override.py
index 6733102e7ba4..9ffcad1032d4 100644
--- a/tests/hwsim/test_rsn_override.py
+++ b/tests/hwsim/test_rsn_override.py
@@ -141,6 +141,7 @@ def run_rsn_override_mld(dev, apdev, mixed):
         params['sae_groups'] = '19 20'
         params['sae_require_mfp'] = '1'
         params['sae_pwe'] = '2'
+        params['link_id'] = '0'
         if not mixed:
             params['rsn_override_key_mgmt'] = 'SAE'
             params['rsn_override_key_mgmt_2'] = 'SAE-EXT-KEY'
@@ -166,6 +167,7 @@ def run_rsn_override_mld(dev, apdev, mixed):
         hapd0 = eht_mld_enable_ap(hapd_iface, params)
 
         params1['channel'] = '6'
+        params1['link_id'] = '1'
         hapd1 = eht_mld_enable_ap(hapd_iface, params1)
 
         wpas.set("sae_pwe", "1")
-- 
2.34.1




More information about the Hostap mailing list